使用socket套接字时的两点经验
2007-07-22 08:36
197 查看
最近我在使用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的朋友有所帮助。
第一点经验就是在创建新的套接字之前还需要调用一个引入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的朋友有所帮助。
相关文章推荐
- 使用socket套接字时的两点经验
- Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
- raw_socket(原始套接字)以及普通socket使用终极总结
- Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
- HandlerSocket使用经验
- 使用socketserver写一个套接字程序
- socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
- 使用socket()函数创建套接字
- 使用TCP/IP的套接字(Socket)进行通信
- PHP Socket(套接字连接)扩展简介和使用方法
- 关于windows的list view使用的两点经验
- python-基于UDP通信的套接字,socketserver模块的使用
- Windows Socket API 使用经验
- 使用Java的Socket套接字实现echo和大文件传输
- 使用socket()函数创建套接字
- 套接字socket的使用
- UDP数据报通信 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
- Windows Socket API 使用经验
- 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
- Windows Socket API 使用经验