上一節(jié)我們介紹了客戶端與服務(wù)端相互通信的模型圖,每一步都有具體的函數(shù)實(shí)現(xiàn),但需要明白的是,使用這些函數(shù)之前,在Windows系統(tǒng)下,需要先調(diào)用WSAStartup函數(shù)進(jìn)行必要的初始化,才可以順利的進(jìn)行,
而使用WSAStartup函數(shù)又需要事先包含對應(yīng)的頭文件winsock2.h及靜態(tài)庫ws2_32.lib文件(在windows環(huán)境下)
具體如下:
函數(shù)功能:
用于初始化Socket編程,指明Windows系統(tǒng)中Socket( )版本
依賴靜態(tài)庫庫:
ws2_32.lib
需要用#pragma命令包含,即:
#pragma comment(lib,"ws2_32.lib") //表示鏈接Ws2_32.lib這個庫。ws2_32.lib是Winsock2的庫文件。
函數(shù)原型:
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
返回值類型:
整型
返回值:
成功返回0,失敗返回-1
參數(shù)說明:
第一個參數(shù)wVersionRequested為 WinSock 規(guī)范的版本號它的類型WORD,所以要用MAKEWORD( )宏函數(shù)對它的版本號進(jìn)行轉(zhuǎn)換。低字節(jié)為主版本號,高字節(jié)為副版本號。
代碼示例:
wVersionRequired=MAKEWORD(1,2) //即主版本號是1,副版本號位2,那么它表示的就是調(diào)用WinSock 1.2版本。 現(xiàn)在我們一般用2.2版本 ,即MAKEWORD(1,2)
第二個參數(shù)lpWSAData 為指向 WSAData 結(jié)構(gòu)體的指針。其定義原型如下:
typedef struct WSAData { WORD wVersion; //ws2_32.dll 建議我們使用的版本號 WORD wHighVersion; //ws2_32.dll 支持的最高版本號 #ifdef _WIN64 unsigned short iMaxSockets; //2.0以后不再使用 unsigned short iMaxUdpDg; //2.0以后不再使用 char *lpVendorInfo; //2.0以后不再使用 char szDescription[WSADESCRIPTION_LEN+1]; //一個以 null 結(jié)尾的字符串,用來說明 ws2_32.dll 的實(shí)現(xiàn)以及廠商信息 char szSystemStatus[WSASYS_STATUS_LEN+1]; //一個以 null 結(jié)尾的字符串,用來說明 ws2_32.dll 的狀態(tài)以及配置信息 #else char szDescription[WSADESCRIPTION_LEN+1]; //32位版本,同上 char szSystemStatus[WSASYS_STATUS_LEN+1]; //32位版本,同上 unsigned short iMaxSockets; //32位版本,同上 unsigned short iMaxUdpDg; //32位版本,同上 char *lpVendorInfo; 32位版本,同上 #endif } WSADATA, *LPWSADATA;
怎么樣,看清楚真實(shí)面貌了吧,因此我們只需要包含頭文件、靜態(tài)庫,然后完善這兩個參數(shù),傳入WSAStartup調(diào)用即可。
當(dāng)然,完整可編譯的代碼,則需要將以上代碼放入main函數(shù)中,并且包含對應(yīng)的頭文件及相對應(yīng)的靜態(tài)庫,使用方式如下:
//www.sztianhecheng.cn #include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") int main() { WSADATA wsaData; WSAStartup( MAKEWORD(2, 2), &wsaData); //目前建議使用最新2.2版本 //以下為測試信息,打印相應(yīng)的數(shù)值用于測試 printf("wVersion: %d.%d\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion)); printf("wHighVersion: %d.%d\n", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion)); printf("szDescription: %s\n", wsaData.szDescription); printf("szSystemStatus: %s\n", wsaData.szSystemStatus); return 0; }
大家可以實(shí)行上機(jī)試驗(yàn)。
在介紹完WSAStartup函數(shù)后我們就要按順序講解socket( )、bind( )、listen( )、accept( )、recv( )、send( )、closesocket( )這些函數(shù)了。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程