日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WSAStartup()函数以及DLL的加载

發(fā)布時(shí)間:2025/3/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WSAStartup()函数以及DLL的加载 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本節(jié)講解 Windows 下 DLL 的加載,學(xué)習(xí)?Linux?Socket 的讀者可以跳過。

WinSock(Windows Socket)編程依賴于系統(tǒng)提供的動態(tài)鏈接庫(DLL),有兩個(gè)版本:

  • 較早的DLL是?wsock32.dll,大小為 28KB,對應(yīng)的頭文件為 winsock1.h;
  • 最新的DLL是?ws2_32.dll,大小為 69KB,對應(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í)加載,我們已在《動態(tài)鏈接庫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ī)范的版本號,低字節(jié)為主版本號,高字節(jié)為副版本號(修正版本號);lpWSAData 為指向 WSAData 結(jié)構(gòu)體的指針。

關(guān)于 WinSock 規(guī)范

WinSock 規(guī)范的最新版本號為 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 主要增加了對其他協(xié)議的支持,不過建議使用最新的?2.2?版本。

wVersionRequested 參數(shù)用來指明我們希望使用的版本號,它的類型為 WORD,等價(jià)于?unsigned short,是一個(gè)整數(shù),所以需要用 MAKEWORD() 宏函數(shù)對版本號進(jìn)行轉(zhuǎn)換。例如:

MAKEWORD(1, 2); //主版本號為1,副版本號為2,返回 0x0201 MAKEWORD(2, 2); //主版本號為2,副版本號為2,返回 0x0202

關(guān)于 WSAData 結(jié)構(gòu)體

WSAStartup() 函數(shù)執(zhí)行成功后,會將與 ws2_32.dll 有關(guān)的信息寫入 WSAData 結(jié)構(gòu)體變量。WSAData 的定義如下:

  • typedef struct WSAData {
  • WORD wVersion; //ws2_32.dll 建議我們使用的版本號
  • WORD wHighVersion; //ws2_32.dll 支持的最高版本號
  • //一個(gè)以 null 結(jié)尾的字符串,用來說明 ws2_32.dll 的實(shí)現(xiàn)以及廠商信息
  • char szDescription[WSADESCRIPTION_LEN+1];
  • //一個(gè)以 null 結(jié)尾的字符串,用來說明 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以后不再使用
  • } WSADATA, *LPWSADATA;
  • 最后3個(gè)成員已棄之不用,szDescription 和?szSystemStatus 包含的信息基本沒有實(shí)用價(jià)值,讀者只需關(guān)注前兩個(gè)成員即可。請看下面的代碼:

  • #include <stdio.h>
  • #include <winsock2.h>
  • #pragma comment (lib, "ws2_32.lib")
  • ?
  • int main(){
  • WSADATA wsaData;
  • 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);
  • ?
  • return 0;
  • }
  • 運(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)行初始化,并指明要使用的版本號。

    總結(jié)

    以上是生活随笔為你收集整理的WSAStartup()函数以及DLL的加载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。