Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8181278
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-03-12 09:03:49

最近我在使用socket编程的工作,总结了2点经验,希望和大家分享一下。由于是菜鸟,有不对的地方还希望多多指教。
   第一点经验就是在创建新的套接字之前还需要调用一个引入Ws2_32.dll库的函数。否则服务器和客户端连不上。
  由于初次使用socket,所以查了很多资料,但是发现一个问题,不知道为什么按照资料上的步骤调用函数,但是最后却连接不上,详细查过MSDN后,才发现大部分的资料上都是从调用socket开始,其实在这之前还有一个初始化的函数需要调用。
  如果使用Platform SDK:Windows Sockets,在调用socket函数创建新的sockets之前要先调用WSAStartup函数。WSAStartup函数作用是引入Ws2_32.dll库。根据MSDN上说,WSAStartup函数必须是应用程序或DLL调用的第一个Windows Sockets函数,它允许应用程序或者DLL指定需要的Windows Sockets版本和重新找回指定的Windows Sockets执行的细节。只有在成功的调用WSAStartup函数之后才能进一步使用接下来的Windows Sockets函数。
  同理,如果使用的是MFC包装的CSocket类,需要在调用Cresat创建新的套接字之前调用AfxSocketInit函数。AfxSocketInit函数包装的是WSAStartup函数,作用是相同的。
  第二点经验就是使用socket编程时,每调用一个函数如bind,listen等,如果出错可以使用WSAGetLastError ()函数得到错误的编号,如果是MFC的CSocket类,使用GetLastError()函数得到错误的编号。但是得到的编号是整形量,对调试没有意义,所以建议大家可以使用下面的程序得到中文错误信息。
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,0, GetLastError(), 
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //默认语言
          (LPTSTR)&lpMsgBuf, 0, NULL );
//显示
MessageBox(0,(LPCTSTR)lpMsgBuf,_T("GetLastError"),MB_OK|MB_ICONINFORMATION );

//释放内存
    ::LocalFree( lpMsgBuf );
这就是我的2点经验,希望对初学socket的朋友有所帮助。
阅读(1361) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~