CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

紧急求助:为什么我总是创建Socket失败?

楼主rosewater(雨)2002-07-31 09:33:33 在 VC/MFC / 基础类 提问

m_pSocket->Create(9999)其中m_pSocket是一继承CSocket的类的指针对象。  
  为什么其返回值总是0,我也改过端口号,可是还是不行,希望高手指点迷津。 问题点数:50、回复次数:23Top

1 楼rosewater(雨)回复于 2002-07-31 09:39:45 得分 0

各位大虾,快快看过来Top

2 楼yichunhui(塘坊)回复于 2002-07-31 09:53:01 得分 0

如果你确定m_pSocket是指向了一个对象,那这可能是微软的一个错误,可能返回值为0表示创建成功,你在返回0后试着使用一下m_pSocket就知道了。注意,使用Connect()时的返回值和MSDN上说的刚好相反,也就是返回0表示成功。Top

3 楼beijingshizi(北京石子)回复于 2002-07-31 09:59:14 得分 2

m_lsnSocket   =   new   CListenSocket();  
   
  Top

4 楼wiler(@_@)回复于 2002-07-31 10:05:08 得分 2

yichunhui(塘坊)   说得对Top

5 楼rosewater(雨)回复于 2002-07-31 10:14:09 得分 0

因为我是这么用的,调试的时候,根本就不执行{}中的语句,而是直接跳过,m_pSocket返回0  
  if   (m_pSocket->Create(9999))  
  {  
        if   (m_pSocket->Listen())  
          return   TRUE;  
  }  
  真搞不懂是怎么一回事Top

6 楼yjinf(知秋)回复于 2002-07-31 10:23:56 得分 2

你用GetLastError()查看是什么原因了吗Top

7 楼yichunhui(塘坊)回复于 2002-07-31 10:27:10 得分 0

你改成  
  if   (   !   m_pSocket->Create(9999))  
  {  
        if   (m_pSocket->Listen())  
          return   TRUE;  
  }  
  然后,另一个Socket去连接它,看能否正常的传送数据。  
  Top

8 楼yichunhui(塘坊)回复于 2002-07-31 10:33:08 得分 0

也就是说,你先假定所有操作都会成功,你不去管它的返回值,看能否正常通信。Top

9 楼rosewater(雨)回复于 2002-07-31 10:39:27 得分 0

我现在找到原因了,因为我创建工程是不是基于Socket的,我在StdAfx.h中加入了#include   <afxsock.h>。如果我重建一个基于Socket的工程用以上的代码就可以创建成功,所以我现在求助,我还需要加入什么才可以使我的工程和基于Socket的一样。我可不希望重建,因为工作量比较大,而且时间紧。Top

10 楼alanwang_(alan)回复于 2002-07-31 10:45:03 得分 0

用GetLastError看一下吧!  
  可能你创建工程时没选支持Socket,而自己没有调用AfxSocketInit所致。Top

11 楼alanwang_(alan)回复于 2002-07-31 10:50:59 得分 0

呵呵,发了半天没发上去!  
   
  AfxSocketInit或者WSAStartupTop

12 楼yichunhui(塘坊)回复于 2002-07-31 10:51:22 得分 20

最好在你的App类的InitInstance()函数中开头处加入如下语句:  
  BOOL   CSocketApp::InitInstance()  
  {  
        if(!AfxSocketInit())  
        {  
              AfxMessageBox(IDP_SOCKETS_INIT_FAILED);  
              return   FALSE;  
        }  
  .....  
  }Top

13 楼smile_everyday()回复于 2002-07-31 11:01:50 得分 2

yichunhui(塘坊)已经帮你搞定。注意还要加入Ws2_32.libTop

14 楼rosewater(雨)回复于 2002-07-31 11:26:29 得分 0

真的很感谢大家的热心帮助,一会结贴给分(有参考意见吗?)  
  为什么要加入Ws2_32.lib,它的作用是什么?  
  还有WSAStartup,我都不知道是做什么用的。Top

15 楼alanwang_(alan)回复于 2002-07-31 11:31:39 得分 20

Ws2_32.lib是winsock2的函数入口库,只有在连接选项中加了这个库才能够link成功。  
  WSAStartup是winsock2   sdk中的函数,初始化winsock   dll的。AfxSocketInit在内部调用了这个函数。Top

16 楼rosewater(雨)回复于 2002-07-31 12:35:30 得分 0

那如果是基于socket的工程,对Ws2_32.lib是然后处理的呢?Top

17 楼alanwang_(alan)回复于 2002-07-31 12:42:12 得分 0

基于socket的工程在初始化时调用了AfxSocketInit(),你可以在工程中查找一下,能找到的。  
  有可能AfxSocketInit用的是动态加载Ws2_32.dllTop

18 楼Smartee_J()回复于 2002-07-31 12:56:56 得分 2

Ws2_32.dll   只是使用Winsock   API才用到吧  
  CSocket用winsock.lib就OKTop

19 楼yichunhui(塘坊)回复于 2002-07-31 12:57:51 得分 0

好象可以不加入也能LINK成功的。Top

20 楼alanwang_(alan)回复于 2002-07-31 13:07:45 得分 0

使用AfxSocketInit就不用加载winsock.lib或ws2_32.lib,它会自动加载!  
  ws2_32.dll和winsock.dll只是版本不同。WSAStartup函数中会有版本协商的。  
  Top

21 楼alanwang_(alan)回复于 2002-07-31 13:20:32 得分 0

错了!ws2_32.dll是socket   sdk  
  winsock.h是mfc的dll。  
  两者是不同的,不好意思!Top

22 楼rosewater(雨)回复于 2002-08-01 13:15:58 得分 0

谢谢大家,我要结贴了。Top

23 楼rosewater(雨)回复于 2002-08-01 13:17:40 得分 0

只是分不多,以后有问题时希望各位继续支持,一定多给分。Top

相关问题

  • 为什么socket老是创建失败?????
  • socket 创建失败一般是什么原因(从csocket继承)
  • socket创建失败,不清楚问题在哪?
  • 求助 在子线程中创建socket失败
  • 创建数据库失败!!!
  • 创建对象失败??
  • 创建"连接到别一台计算机的共享文件夹"的虚拟目录失败问题?紧急紧急~
  • 创建"连接到别一台计算机的共享文件夹"的虚拟目录失败问题?紧急紧急~
  • Interdev创建新工程失败
  • 创建对象失败,如何解决?

关键词

  • 函数
  • ws
  • winsock
  • socket
  • dll
  • afxsocketinit
  • psocket
  • ws2
  • 创建
  • 工程

得分解答快速导航

  • 帖主:rosewater
  • beijingshizi
  • wiler
  • yjinf
  • yichunhui
  • smile_everyday
  • alanwang_
  • Smartee_J

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo