初始化Winsock库

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