天天看點

Windows網絡程式設計 WSAstartup()詳解

WSAstartup詳解

    • 詳細說明
    • 函數原型
    • 使用方法:
    • 參數說明:
    • 傳回值:
    • 使用範例:
    • 參考資料:

socket程式設計要調用各種socket函數,但是需要庫Ws2_32.lib和頭檔案Winsock2.h,這裡的WSAStartup就是為了向作業系統說明,我們要用哪個庫檔案,讓該庫檔案與目前的應用程式綁定,進而就可以調用該版本的socket的各種函數了。

#include<WinSock2.h> //第2版本的網絡庫
#pragma comment(lib,"ws2_32.lib") //windows 32位版本的,沒有64版本的,但是64位下也有32位版本的
           

詳細說明

為了在 應用程式當中調用任何一個Winsock API 函數,首先第一件事情就是必須通過WSAStartup 函數完成對Winsock服務的初始化,是以需要調用WSAStartup 函數。使用Socket的程式在使用Socket之前必須調用WSAStartup函數。該 函數的第一個參數指明程式請求使用的Socket版本,其中高位 位元組指明副版本、低位位元組指明主版本; 作業系統利用第二個參數傳回請求的Socket的版本資訊。當一個 應用程式調用WSAStartup 函數時, 作業系統根據請求的Socket版本來搜尋相應的Socket庫,然後綁定找到的Socket庫到該應用程式中。以後 應用程式就可以調用所請求的Socket庫中的其它Socket 函數了。

函數原型

int
WSAAPI
WSAStartup(
    _In_ WORD wVersionRequested,
    _Out_ LPWSADATA lpWSAData
    );

           

使用方法:

當一個應用程式調用WSAStartup函數時,作業系統根據請求的Socket版本來搜尋相應的Socket庫,然後綁定找到的Socket庫到該應用程式中。以後應用程式就可以調用所請求的Socket庫中的其它Socket函數了。

參數說明:

wVersionRequired:

這是一個我們需要的網絡庫版本号

lpWSAData:

這是一個WSADATA的指針。WSADATA是一個結構體, WSAStartup()函數會将環境的網絡庫資訊存在這個結構體中。

typedef struct WSAData {
        WORD                    wVersion;
        WORD                    wHighVersion;
#ifdef _WIN64
        unsigned short          iMaxSockets;
        unsigned short          iMaxUdpDg;
        char FAR *              lpVendorInfo;
        char                    szDescription[WSADESCRIPTION_LEN+1];
        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
#else
        char                    szDescription[WSADESCRIPTION_LEN+1];
        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
        unsigned short          iMaxSockets;
        unsigned short          iMaxUdpDg;
        char FAR *              lpVendorInfo;
#endif
} WSADATA, FAR * LPWSADATA;
           

傳回值:

如果函數正确,那麼将會傳回0,如果錯誤将會傳回錯誤的代号,具體錯類類型可以參考官網。

使用範例:

#include <iostream>
#include <WinSock2.h>//添加頭檔案
#pragma comment(lib, "ws2_32.lib")//連接配接庫(這種連接配接庫的方式與在程式設計設定中連結庫的功能是一緻的)

int main()
{
    WORD wdVersion = MAKEWORD(2, 2);//定義自己需要的網絡庫版本,這裡是2.2

    WSADATA wdSockMsg;//這是一個結構體

    int nRes = WSAStartup(wdVersion, &wdSockMsg);//打開一個套接字

    if (0 != nRes)
    {
        switch (nRes)
        {
            case WSASYSNOTREADY: printf("重新開機電腦,或者檢查網絡庫");   break;
            case WSAVERNOTSUPPORTED: printf("請更新網絡庫");  break;
            case WSAEINPROGRESS: printf("請重新啟動");  break;
            case WSAEPROCLIM:  printf("請關閉不必要的軟體,以確定有足夠的網絡資源"); break;
        }
    }

    if (2 != HIBYTE(wdSockMsg.wVersion) || 2 != LOBYTE(wdSockMsg.wVersion))
    {
        printf("網絡庫版本錯誤");
        WSACleanup();//關閉此套接字
        return 0;
    }
    
    std::cout << "Hello World!\n";
    return 0;
           

參考資料:

《Windows網絡程式設計和程式設計》