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網絡程式設計和程式設計》