本節(jié)講解 Windows 下 DLL 的加載,,學(xué)習(xí)
Linux Socket 的讀者可以跳過(guò)。
WinSock(Windows Socket)編程依賴于系統(tǒng)提供的動(dòng)態(tài)鏈接庫(kù)(DLL),,有兩個(gè)版本:
- 較早的DLL是 wsock32.dll,,大小為 28KB,對(duì)應(yīng)的頭文件為 winsock1.h,;
- 最新的DLL是 ws2_32.dll,,大小為 69KB,對(duì)應(yīng)的頭文件為 winsock2.h,。
幾乎所有的 Windows 操作系統(tǒng)都已經(jīng)支持 ws2_32.dll,,包括個(gè)人操作系統(tǒng) Windows 95 OSR2、Windows 98,、Windows Me,、Windows 2000、XP,、Vista,、Win7、Win8,、Win10 以及服務(wù)器操作系統(tǒng) Windows NT 4.0 SP4,、Windows Server 2003、Windows Server 2008 等,,所以你可以毫不猶豫地使用最新的 ws2_32.dll,。
使用 DLL 之前必須把 DLL 加載到當(dāng)前程序,,你可以在編譯時(shí)加載,也可以在程序運(yùn)行時(shí)加載,,我們已在《動(dòng)態(tài)鏈接庫(kù)DLL的加載:隱式加載(載入時(shí)加載)和顯式加載(運(yùn)行時(shí)加載)》進(jìn)行了講解,。
這里使用#pragma 命令,在編譯時(shí)加載:
#pragma comment (lib, "ws2_32.lib")
WSAStartup() 函數(shù)
使用 DLL 之前,,還需要調(diào)用 WSAStartup() 函數(shù)進(jìn)行初始化,,以指明 WinSock 規(guī)范的版本,它的原型為:
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
wVersionRequested 為 WinSock 規(guī)范的版本號(hào),,低字節(jié)為主版本號(hào),,高字節(jié)為副版本號(hào)(修正版本號(hào));lpWSAData 為指向 WSAData 結(jié)構(gòu)體的指針,。
關(guān)于 WinSock 規(guī)范
WinSock 規(guī)范的最新版本號(hào)為 2.2,,較早的有 2.1、2.0,、1.1,、1.0,ws2_32.dll 支持所有的規(guī)范,,而 wsock32.dll 僅支持 1.0 和 1.1,。
wsock32.dll 已經(jīng)能夠很好的支持 TCP/IP 通信程序的開發(fā),ws2_32.dll 主要增加了對(duì)其他協(xié)議的支持,,不過(guò)建議使用最新的 2.2 版本,。
wVersionRequested 參數(shù)用來(lái)指明我們希望使用的版本號(hào),它的類型為 WORD,,等價(jià)于 unsigned short,,是一個(gè)整數(shù),所以需要用 MAKEWORD() 宏函數(shù)對(duì)版本號(hào)進(jìn)行轉(zhuǎn)換,。例如:
MAKEWORD(1, 2); //主版本號(hào)為1,,副版本號(hào)為2,返回 0x0201
MAKEWORD(2, 2); //主版本號(hào)為2,,副版本號(hào)為2,,返回 0x0202
關(guān)于 WSAData 結(jié)構(gòu)體
WSAStartup() 函數(shù)執(zhí)行成功后,會(huì)將與 ws2_32.dll 有關(guān)的信息寫入 WSAData 結(jié)構(gòu)體變量,。WSAData 的定義如下:
WORD wVersion; //ws2_32.dll 建議我們使用的版本號(hào) WORD wHighVersion; //ws2_32.dll 支持的最高版本號(hào) //一個(gè)以 null 結(jié)尾的字符串,,用來(lái)說(shuō)明 ws2_32.dll 的實(shí)現(xiàn)以及廠商信息 char szDescription[WSADESCRIPTION_LEN+1]; //一個(gè)以 null 結(jié)尾的字符串,用來(lái)說(shuō)明 ws2_32.dll 的狀態(tài)以及配置信息 char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; //2.0以后不再使用 unsigned short iMaxUdpDg; //2.0以后不再使用 char FAR *lpVendorInfo; //2.0以后不再使用
最后3個(gè)成員已棄之不用,,szDescription 和 szSystemStatus 包含的信息基本沒(méi)有實(shí)用價(jià)值,,讀者只需關(guān)注前兩個(gè)成員即可。請(qǐng)看下面的代碼:
#pragma comment (lib, "ws2_32.lib") WSAStartup( MAKEWORD(2, 2), &wsaData); 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);
運(yùn)行結(jié)果: wVersion: 2.2 wHighVersion: 2.2 szDescription: WinSock 2.0 szSystemStatus: Running
ws2_32.dll 支持的最高版本為 2.2,建議使用的版本也是 2.2,。
綜上所述:WinSock 編程的第一步就是加載 ws2_32.dll,,然后調(diào)用 WSAStartup() 函數(shù)進(jìn)行初始化,并指明要使用的版本號(hào),。
|