當一個應用程序調用WSAStartup函數時,
操作系統根據請求的Socket版本來搜索相應的Socket庫,然后綁定找到的Socket庫到該應用程序中。
以后應用程序就可以調用所請求的Socket庫中的其它Socket函數了。該函數執行成功后返回0。
例:假如一個程序要使用2.1版本的Socket,那么程序代碼如下
wVersionRequested = MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
二、WSACleanup函數
int WSACleanup (void);
應用程序在完成對請求的Socket庫的使用后,要調用WSACleanup函數來解除與Socket庫的綁定並且釋放Socket庫所占用的系統資源。
三 Socket接口的檢索有關域名、通信服務和協議等Internet信息的數據庫函數,如
gethostbyaddr、gethostbyname、gethostname、getprotolbyname
getprotolbynumber、getserverbyname、getservbyport。
1.gethostname()
【函數原型】int PASCAL FAR gethostname (char FAR * name, int namelen);
【使用說明】該函數可以獲取本地主機的主機名,其中:
Namelen:緩沖區的大小,以字節為單位。
返回值:若無錯誤,返回0;否則,返回錯誤代嗎。
2.gethostbyname()
【函數原型】
struct hostent FAR * PASCAL FAR gethostbyname(const char FAR * name);
【使用說明】
該函數可以從主機名數據庫中得到對應的“主機”。
該函數唯一的參數name就是前面調用函數gethostname()得到的主機名。若無錯誤,剛返回一個指向hostent結構的指針,它可以標識一個“主機”列表。
本協議允許Windows Sockets DLL和Windows Sockets應用程序共同支持一定范圍的Windows Sockets版本.如果版本范圍有重疊,應用程序就可以成功地使用Windows Sockets DLL.下列的圖表給出了WSAStartup()在不同的應用程序和Windows Sockets DLL版本中是如何工作的:
應用程序版本 DLL版本 wVersionRequested wVersion wHighVersion 最終結果
1.1 1.1 1.1 1.1 1.1 use 1.1
1.0 1.1 1.0 1.1 1.0 1.0 use 1.0
1.0 1.0 1.1 1.0 1.0 1.1 use 1.0
1.1 1.0 1.1 1.1 1.1 1.1 use 1.1
1.1 1.0 1.1 1.0 1.0 失敗
1.0 1.1 1.0 -- -- WSAVERNOTSUPPORTED
1.0 1.1 1.0 1.1 1.1 1.1 1.1 use 1.1
1.1 2.0 1.1 2.0 1.1 1.1 use 1.1
2.0 1.1 2.0 1.1 1.1 失敗
下列代碼段給出了只支持Windows Sockets 1.1版本的應用程序是如何進行WSAStartup()調用的:
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
下面的代碼段示例了只支持1.1版的Windows Sockets DLL是如何進行WSAStartup()協商的:
if ( LOBYTE( wVersionRequested ) < 1 || ( LOBYTE( wVersionRequested ) == 1 &&
HIBYTE( wVersionRequested ) < 1 ) )
{
return WSAVERNOTSUPPORTED;
}
lpWsaData->wVersion = MAKEWORD( 1, 1 );
lpWsaData->wHighVersion = MAKEWORD( 1, 1 );
一旦應用程序或DLL進行了一次成功的WSAStartup()調用,它就可以繼續進行其它所需的Windows Sockets API調用.
當它完成了使用該Windows Sockets DLL的服務后,應用程序或DLL必須調用WSACleanup()以允許Windows Sockets DLL釋放任何該應用程序的資源.
錯誤代碼:
WSASYSNOTREADY 指出網絡通信依賴的網絡子系統還沒有准備好.
WSAVERNOTSUPPORTED 所需的Windows Sockets API的版本未由特定的Windows Sockets實現提供.
WSAEINVAL 應用程序指出的Windows Sockets版本不被該DLL支持.
參見:
send(), sendto(), WSACleanup()。
在Windows下,Socket是以DLL的形式實現的。在DLL內部維持着一個計數器,只有第一次調用WSAStartup才真正裝載DLL,以后的 調用只是簡單的增加計數器,而WSACleanup函數的功能則剛好相反,每調用一次使計數器減1,當計數器減到0時,DLL就從內存中被卸載!因此,你 調用了多少次WSAStartup,就應相應的調用多少次的WSACleanup.
原文鏈接:https://blog.csdn.net/m0_37624078/article/details/81217834