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函數獲得錯誤代碼。