Winsock库对Windows的Socket编程有很好的支持,它提供了所有Socket相关的API函数。常用的Winsock库有1和2两个版本,流行应用程序使用的是Winsock2版本。其对应的动态链接库是WS2_32.dll,使用时需要包含Winsock2.h头文件,并要导入WS2_32.lib库文件。无论是使用哪种协议,无论是客户端还是服务端,在进行Socket编程之前首先应该对Winsock库(WS2_32.dll)进行初始化,完成初始化Winsock库工作的API函数是WSAStartup,其函数原型如下。
int WSAStartup( WORD wVersionRequested, //指定调用者能够使用的Winsock的最高版本 LPWSADATA lpWSAData //执行WSADATA结构体的指针 );
第一个参数wVersionRequested指定调用者使用的Winsock的最高版本,它是一个WORD类型,高字节表示副版本号,低字节表示主版本号。通常使用MAKEWORD宏构造此参数。第二个参数lpWSAData是一个指向WSADATA结构体的指针,用来接收所使用的Winsock库的详细信息。WSADATA结构体定义如下。
typedef struct WSAData { WORD wVersion; //版本 WORD wHighVersion; //最高版本 #ifdef _WIN64 unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; #else char szDescription[WSADESCRIPTION_LEN+1]; //描述字符串 char szSystemStatus[WSASYS_STATUS_LEN+1]; //系统状态字符串 unsigned short iMaxSockets; //最大套接字数量 unsigned short iMaxUdpDg; //版本2中忽略 char FAR * lpVendorInfo; //版本2中忽略 #endif } WSADATA, FAR * LPWSADATA;
函数执行成功返回0,否则将返回如下错误代码。
WSASYSNOTREADY //网络未就绪 WSAVERNOTSUPPORTED //不支持的版本 WSAEINPROGRESS //版本1的Winsock模块正在进行中 WSAEPROCLIM //已经达到限制值 WSAEFAULT //lpWSAData是一个无效指针
当Winsock库使用完毕后应该使用WSACleanup函数终止对Winsock库(WS2_32.dll)的调用。在多线程环境下,WSACleanup将终止所有线程的Scoket操作。函数原型如下。
int WSACleanup(void)
函数执行成功则返回0,执行失败则返回SOCKET_ERROR值。可以调用WSAGetLastError函数获得错误代码。
原文地址:https://www.cnblogs.com/cyx-b/p/12529832.html
时间: 2024-10-13 20:32:12