WSAStartup()の詳細

この関数の説明を平易な言語で示します。opencvと同様に、リンクライブラリ関数やcv.libなどを追加し、それらを追加の依存関係に追加するか、#pragmaコメント(lib、 "cv.lib")を使用する必要があります。 )その場合にのみ、さまざまな関数を呼び出すためのヘッダーファイルを含めることができます。もちろん、ソケットプログラミングではさまざまなソケット関数を呼び出す必要がありますが、ライブラリWs2_32.libとヘッダーファイルWinsock2.hが必要です。ここでのWSAStartupは、使用するライブラリファイルをオペレーティングシステムに説明するためのものです。ファイルは現在のアプリケーションのプログラムバインディングと互換性があるため、このバージョンのソケットのさまざまな関数を呼び出すことができます。

ヘッダーファイルヘッダー:Winsock2.h

ライブラリライブラリ:Ws2_32.lib
プロトタイプ:int PASCAL FAR WSAStartup(WORD wVersionRequested、LPWSADATA lpWSAData);
パラメータ:wVersionRequestedは、呼び出し元がWindows SocketsAPIによって提供される使用できる最大のバージョン番号です上のバイトはマイナーバージョン(リビジョン)番号を示し、下のバイトはメジャーバージョン番号を示します。
        lpWSADataは、WindowsSocketsの実装の詳細を受け取るためポインターのWSADATAデータ構造指します

WSADATAデータ型:この構造を格納するために使用されるWindowsソケットのデータは、後に返さWSAStartupのの関数が呼び出されます Winsock.dllによって実行されるデータが含まれています

  構造プロトタイプ:  

struct WSAData {

  WORD wVersion;

  WORD wHighVersion;

  char szDescription [WSADESCRIPTION_LEN + 1];

  char szSystemStatus [WSASYSSTATUS_LEN + 1];

  unsigned short iMaxSockets;

  unsigned short iMaxUdpDg;

  char * lpVendorInfo;};

  WSADATA構造体は、関数WSAStartupによって返されるWindowsSocketsの初期化情報を保存するために使用されます。

  メンバー:

  wVersion

  Windows SocketsDLLが呼び出し元が使用することを期待するWindowsSockets仕様のバージョン。上位バイトにはマイナーバージョン番号が格納され、下位バイトにはメジャーバージョン番号が格納されます。WORDMAKEWORD(BYTE、BYTE)を使用して、この値を返すことができます(例:MAKEWORD(1,1))。

  wHighVersion

  このDLLがサポートできるWindowsSockets仕様の最高バージョン。通常はwVersionと同じです。

  szDescription

  ヌル終了ASCII文字列。WindowsSocketsDLLは、製造元のIDを含め、WindowsSocketsの実装の説明をこの文字列にコピーします。テキスト(最大256文字)には任意の文字を含めることができますが、制御文字や書式設定文字を含めることはできないことに注意してください。アプリケーションで使用する最も可能性の高い方法は、ステータス情報に表示する(場合によっては切り捨てられる)ことです。 。

  szSystemStatus

  ヌルで終了するASCII文字列であるWindowsSockets DLLは、関連するステータスまたは構成情報を文字列にコピーします。Windows Sockets DLLは、ユーザーまたはサポートスタッフにとって有用な場合にのみ、この情報を使用する必要があります。szDescriptionフィールドの拡張として使用しないでください。

  iMaxSockets

  1つのプロセスで開くことができるソケットの最大数Windows Socketsの実装は、任意のプロセスに割り当てることができるグローバルソケットプールを提供できます。または、プロセスに属するリソースをソケットに割り当てることもできます。この数は、Windows SocketsDLLまたはネットワークソフトウェアの構成をよく反映している可能性があります。アプリケーションの作成者は、この数値を使用して、WindowsSocketsの実装がアプリケーションに役立つかどうかを大まかに示すことができます。たとえば、X Windowsサーバーは、初めて起動したときにiMaxSocketsの値をチェックする場合があります。この値が8未満の場合、アプリケーションは、ネットワークソフトウェアを再構成するようにユーザーに指示するエラーメッセージを表示します(これは可能です)。 szSystemStatusテキストオケージョンを使用する方法)。明らかに、他のWindowsSocketsアプリケーションが使用されている可能性があるため、アプリケーションが実際にiMaxSocketsソケットを割り当てることができるという保証はありません。

  iMaxUdpDg Windows Socketsアプリケーションで送受信できる最大ユーザーデータパケットプロトコル(UDP)パケットサイズ(バイト単位)。実装に制限がない場合、iMaxUdpDgはゼロです。バークレーソケットの多くの実装では、UDPパケット(必要に応じて分解される)に固有の制限があり、サイズは8192バイトです。Windows Socketsの実装により、断片化された再編成バッファーの割り当てを制限できます。適切なWindowsSockets実装の場合、iMaxUdpDgの最小値は512です。iMaxUdpDgの値に関係なく、ネットワークの最大伝送ユニット(MTU)よりも大きいブロードキャストパケットを返送することはお勧めしません。(Windows Sockets APIは、MTUを検出するためのメカニズムを提供していませんが、512バイト以上になります)。WinSock2.0バージョンでは非推奨になりました。

  lpVendorInfoベンダーのデータ構造へのポインター。この構造の定義(存在する場合)は、WindowsSockets仕様の範囲を超えています。WinSock2.0バージョンでは非推奨になりました。

実際、わかりやすく言うと、wsastartupは主に対応するソケットライブラリバインディング用です。

WSAStartup()-関数

1.WSAStartup関数 
intWSAStartup(WORD wVersionRequested、LPWSADATA lpWSAData); 
Socketを使用するプログラムは、Socketを使用する前にWSAStartup関数を呼び出す必要があります。後で、アプリケーションは、要求されたソケットライブラリ内の他のソケット関数を呼び出すことができます。
2.WSACleanup関数 
intWSACleanup(void);
アプリケーションが要求されたSocketライブラリの使用を終了した後、  WSACleanup関数を呼び出して、Socketライブラリのバインドを解除し、Socketライブラリによって占有されているシステムリソースを解放する必要があります。

 

WSAStartup()-使用方法

アプリケーションがWSAStartup関数を呼び出すと、オペレーティングシステムは、要求されたソケットバージョンに従って対応するソケットライブラリを検索し、見つかったソケットライブラリをアプリケーションにバインドします。後で、アプリケーションは、要求されたソケットライブラリ内の他のソケット関数を呼び出すことができますこの関数は、正常に実行された後、0を返します。 
例:プログラムが2.1バージョンのSocketを使用する場合、プログラムコードは次のようになります 
。wVersionRequested= MAKEWORD(2、1); 
err = WSAStartup(wVersionRequested、&wsaData);

2.WSACleanup関数 
intWSACleanup(void);
アプリケーションが要求されたSocketライブラリの使用を終了した後、  WSACleanup関数を呼び出して、Socketライブラリのバインドを解除し、Socketライブラリによって占有されているシステムリソースを解放する必要があります。 ドメイン名、通信サービス、プロトコルなどのインターネット情報取得するための

3つのソケットインターフェイスデータベース機能

gethostbyaddr、gethostbyname、gethostname、getprotolbyname

getprotolbynumber、getserverbyname、getservbyport。1.gethostname 
()

[関数プロトタイプ] int PASCAL FAR gethostname(char FAR * name、int namelen);

[使用方法]この関数は、ローカルホストのホスト名を取得できます。ここで、

  name:ポインタの取得したポイントバッファホスト名

  Namelen:バッファのサイズ(バイト単位)

  戻り値:エラーがない場合は0を返し、そうでない場合はエラーコードを返します。 
2.2。gethostbyname()

  【関数プロトタイプ】

struct hostent FAR * PASCAL FAR gethostbyname(const char FAR * name);

  【使用説明書】

  この関数は、ホスト名データベースから対応する「ホスト」を取得できます。

  この関数の唯一のパラメーター名は、以前に関数gethostname()を呼び出して取得したホスト名です。エラーがない場合は、「ホスト」のリストを識別できるホスト構造へのポインタを返すだけです。    

この契約により、Windows SocketsDLLとWindowsSocketsアプリケーションは、特定の範囲のWindows Socketsバージョンを共同でサポートできます。バージョン範囲が重複している場合、アプリケーションはWindows Sockets DLLを正常に使用できます。次の図は、さまざまなアプリケーションでのWSAStartup()を示しています。およびWindowsソケットDLLのバージョンの作業:
アプリケーションのバージョンDLLバージョンwVersionRequested wVersion wHighVersion最終結果
1.1 1.1 1.1 1.1 1.1の使用1.1
1.0 1.1 1.0 1.1 1.0 1.0の使用1.0 
1.0 1.0 1.1 1.0 1.0 1.1の使用1.0
1.1 1.0 1.1 1.1 1.1 1.1の使用1.1
1.1 1.0 1.1 1.01.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()Calledのみをサポートするアプリケーションに対して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();  戻る;
 
 

 }
 

次のコードスニペットは、バージョン1.1のみをサポートするWindows Sockets DLLがWSAStartup()ネゴシエーションを実行する方法を示しています。if
(LOBYTE(wVersionRequested)<1 ||(LOBYTE(wVersionRequested)== 1 &&
    HIBYTE(wVersionRequested)<1))

{  WSAVERNOTSUPPORTEDを返す;

 }

 lpWsaData-> wVersion = MAKEWORD(1、1);
 lpWsaData-> wHighVersion = MAKEWORD(1、1);
        アプリケーションまたはDLLがWSAStartup()呼び出しを成功させると、他の必要なWindows SocketsAPI呼び出しを引き続き実行できます。 Windows Sockets DLLを使用してサービスを完了し、アプリケーションまたはDLLはWSACleanup()を呼び出して、Windows Sockets DLLがアプリケーションのリソースを解放できるようにする必要があります。
エラーコード:
WSASYSNOTREADYは、ネットワーク通信が依存するネットワークサブシステムを示します。
WindowsソケットAPIのバージョンがWSAVERNOTSUPPORTEDで必要とされる特定のWindowsソケットの実装によって提供されていません。
WindowsソケットのバージョンWSAEINVALアプリケーションによって示され、このDLLによってサポートされていません。
参照:
        センド()、のsendto()、WSACleanup ()。

Windowsでは、SocketはDLLの形式で実装されます。カウンターはDLL内で維持されます。WSAStartupへの最初の呼び出しのみが実際にDLLをロードします。後続の呼び出しは単にカウンターを増やしますが、WSACleanup関数の関数は正反対です。各呼び出しはカウンターを1つ減らします。カウンタが0に減少すると、DLLがメモリからアンロードされます。したがって、WSAStartupを呼び出す回数だけWSACleanupを呼び出す必要があります。 

おすすめ

転載: blog.csdn.net/wxy_csdn_world/article/details/88908411