天天看點

《Windows網絡與通信程式設計(第3版)》——第2章 Winsock程式設計接口2.1 Winsock庫

本節書摘來自異步社群《windows網絡與通信程式設計(第3版)》一書中的第2章,第2.1節,作者: 陳香凝 , 王烨陽 , 陳婷婷 , 張铮 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

winsock是windows下網絡程式設計的标準接口,它允許兩個或多個應用程式在相同機器上,或者是通過網絡互相交流。winsock是真正的協定無關的接口,本章主要講述如何使用它來編寫應用層的網絡應用程式。

winsock庫有兩個版本,winsock1和winsock2。現在開發網絡應用程式都使用winsock2,需要在程式中包含頭檔案winsock2.h,它包含了絕大部分socket函數和相關結構類型的聲明和定義。同時要添加的還有到ws2_32.lib庫的連結。包含必要的頭檔案,設定好連結環境之後,便可進行下面的編碼工作了。

2.1.1 winsock庫的裝入和釋放

每個winsock應用程式必須加載相應版本的winsock dll。如果在調用winsock函數前沒有加載winsock庫,函數傳回socket_error,出錯代碼将是wsanotinitialised。加載winsock庫的函數是wsastartup,其定義如下。

wversionrequested參數用來指定想要加載的winsock庫的版本。為了建立此參數的值,可以使用宏makeword(x, y),其中x是高位元組,y是低位元組。

lpwsadata是一個指向lpwsadata結構的指針,wsastartup使用所加載庫的版本資訊填充它。

函數調用成功傳回0。否則要調用wsagetlasterror函數檢視出錯的原因。此函數的作用相當于api函數getlasterror,它取得最後發生錯誤的代碼。

每一個對wsastartup的調用必須對應一個對wsacleanup的調用,這個函數釋放winsock庫。

所有的winsock函數都是從ws2_32.dll導出的,vc++在預設情況下并沒有連結到該庫,如果想使用winsock api,就必須包含相應的庫檔案。

2.1.2 封裝cinitsock類

每次寫網絡程式都必須編寫代碼載入和釋放winsock庫,為了今後讨論友善,這裡封裝一個cinitsock類來管理winsock庫,類的使用方法見下一小節。

繼續閱讀