由于 Winsock 的服务是以动态链接库 Winsock DLL 形式实现的,所以必须先调用WSAStartup 函数对 Winsock DLL 进行初始化,协商 Winsock 的版本支持,并分配必要的资源。如果在调用 Winsock 函数之前,没有加载 Winsock 库,则会返回 SOCKET_ERROR错误,错误的信息是 WSANOTINITIALIZED。WSAStartup 函数原型为:int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
其中,参数 wVersionRequested 指定应用要使用的 Windows Sockets 最高版本,其中高位字节表示辅版本号,低位字节表示主版本号。目前使用最广泛的是 Windows Sockets 1.1版本,最高版本已经是 2.0 版本。一般用宏 MAKEWORD(X,Y)获得wVersionRequested 的正确值。如 MAKEWORD(2,0)表示使用 Windows Sockets2.0 版本。参数 lpWSAData 指向 WSADATA 结构的指针。该结构包含了加载的库版本的有关的信息。该函数成功则返回 0,失败则返回如下可能值。
(1) WSASYSNOTREADY:表示网络设备没有准备好。(2) WSAVERNOTSUPPORTED:Winsock 的版本信息号不支持。
(3) WSAEINPROGRESS:一个阻塞式的 Winsock1.1 存在于进程中。
(4) WSAEPROCLIM:已经达到 Winsock 使用量的上限。
(5) WSAEFAULT:lpWSAData 不是一个有效的指针。
此外,在应用程序关闭套接字后,还应调用 WSACleanup 函数终止对 Winsock DLL 的使用,并释放资源,以备下一次使用。WSACleanup 函数的原型为: int WSACleanup(void); 该函数不带任何参数,若调用成功则返回 0,否则返回错误。