C語言中文網 目錄
首頁 > socket 閱讀:843

WSAStartup()函數以及DLL的加載

本節講解 Windows 下 DLL 的加載,學習 Linux Socket 的讀者可以跳過。
WinSock(Windows Socket)編程依賴于系統提供的動態鏈接庫(DLL),有兩個版本:
  • 較早的DLL是 wsock32.dll,大小為 28KB,對應的頭文件為 winsock1.h;
  • 最新的DLL是 ws2_32.dll,大小為 69KB,對應的頭文件為 winsock2.h。

幾乎所有的 Windows 操作系統都已經支持 ws2_32.dll,包括個人操作系統 Windows 95 OSR2、Windows 98、Windows Me、Windows 2000、XP、Vista、Win7、Win8、Win10 以及服務器操作系統 Windows NT 4.0 SP4、Windows Server 2003、Windows Server 2008 等,所以你可以毫不猶豫地使用最新的 ws2_32.dll。

使用 DLL 之前必須把 DLL 加載到當前程序,你可以在編譯時加載,也可以在程序運行時加載,我們已在《動態鏈接庫DLL的加載:隱式加載(載入時加載)和顯式加載(運行時加載)》進行了講解。

這里使用#pragma命令,在編譯時加載:
#pragma comment (lib, "ws2_32.lib")

WSAStartup() 函數

使用 DLL 之前,還需要調用 WSAStartup() 函數進行初始化,以指明 WinSock 規范的版本,它的原型為:
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
wVersionRequested 為 WinSock 規范的版本號,低字節為主版本號,高字節為副版本號(修正版本號);lpWSAData 為指向 WSAData 結構體的指針。

關于 WinSock 規范

WinSock 規范的最新版本號為 2.2,較早的有 2.1、2.0、1.1、1.0,ws2_32.dll 支持所有的規范,而 wsock32.dll 僅支持 1.0 和 1.1。

wsock32.dll 已經能夠很好的支持 TCP/IP 通信程序的開發,ws2_32.dll 主要增加了對其他協議的支持,不過建議使用最新的 2.2 版本。

wVersionRequested 參數用來指明我們希望使用的版本號,它的類型為 WORD,等價于 unsigned short,是一個整數,所以需要用 MAKEWORD() 宏函數對版本號進行轉換。例如:
MAKEWORD(1, 2);  //主版本號為1,副版本號為2,返回 0x0201
MAKEWORD(2, 2);  //主版本號為2,副版本號為2,返回 0x0202

關于 WSAData 結構體

WSAStartup() 函數執行成功后,會將與 ws2_32.dll 有關的信息寫入 WSAData 結構體變量。WSAData 的定義如下:
typedef struct WSAData {
    WORD           wVersion;  //ws2_32.dll 建議我們使用的版本號
    WORD           wHighVersion;  //ws2_32.dll 支持的最高版本號
    //一個以 null 結尾的字符串,用來說明 ws2_32.dll 的實現以及廠商信息
    char           szDescription[WSADESCRIPTION_LEN+1];
    //一個以 null 結尾的字符串,用來說明 ws2_32.dll 的狀態以及配置信息
    char           szSystemStatus[WSASYS_STATUS_LEN+1];
    unsigned short iMaxSockets;  //2.0以后不再使用
    unsigned short iMaxUdpDg;  //2.0以后不再使用
    char FAR       *lpVendorInfo;  //2.0以后不再使用
} WSADATA, *LPWSADATA;
最后3個成員已棄之不用,szDescription 和 szSystemStatus 包含的信息基本沒有實用價值,讀者只需關注前兩個成員即可。請看下面的代碼:
#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;
}
運行結果:
wVersion: 2.2
wHighVersion: 2.2
szDescription: WinSock 2.0
szSystemStatus: Running

ws2_32.dll 支持的最高版本為 2.2,建議使用的版本也是 2.2。

綜上所述:WinSock 編程的第一步就是加載 ws2_32.dll,然后調用 WSAStartup() 函數進行初始化,并指明要使用的版本號。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo