15

WSAStartup関数はどのようにしてWinsockDLLの使用を開始しますか?

ドキュメントによると

WSAStartup関数は、アプリケーションまたはDLLによって呼び出される最初のWindowsSockets関数である必要があります。これにより、アプリケーションまたはDLLは、必要なWindows Socketsのバージョンを指定し、特定のWindowsSockets実装の詳細を取得できます。アプリケーションまたはDLLは、WSAStartupを正常に呼び出した後でのみ、さらにWindowsSockets関数を発行できます。

この関数WSADATAはデータ構造を初期化しますが、ソケットプログラミングではどの関数にも渡さないWSDATAので、プログラムはどのようにしてWindowsSocketsのバージョンやその他の詳細を知るようになりますか?

たとえば、このコードでは

#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32")

void Run(int argc, char* argv[])
{
    char* host = argc < 2 ? "" : argv[1];
    struct hostent* entry = gethostbyname(host);

    if(entry)
    {
        struct in_addr* addr = (struct in_addr*) entry->h_addr;
        printf("IP Address: %s\n", inet_ntoa(*addr));
    }
    else
        printf("ERROR: Resolution failure.\n");
}

int main(int argc, char* argv[])
{
    WSADATA wsaData;

    if(WSAStartup(0x202, &wsaData) == 0)
    {
        Run(argc, argv);
        WSACleanup();
    }
    else
        printf("ERROR: Initialization failure.\n");
}

この例では、関数をWSADATA使用してデータ構造を初期化してWSAStartup()いますが、その後はどこにも渡されませんwsaData

では、私のプログラムはどのようにしてwsaData詳細を知るようになるのでしょうか?

ありがとう。

4

1 に答える 1

21

WSAStartupには2つの主な目的があります。

まず、使用するWinSockのバージョンを指定できます(例では2.2を要求しています)。読み込まれるWSADATAには、要求に基づいて提供しているバージョンが示されます。また、興味がない場合は確認する必要のないその他の情報も入力します。このWSADATA構造体は、WSAStartupリクエストに関するフィードバックを提供するためだけに使用されるため、WinSockに再度送信する必要はありません。

次に行うことは、アプリがソケットを使用するために必要なすべての「舞台裏のもの」を設定することです。WinSock DLLファイルはプロセスにロードされ、プロセスごとに設定する必要のある多くの内部構造が含まれています。これらの構造は非表示になっていますが、WinSockを呼び出すたびに表示されます。

これらの構造はWinSockを使用するプロセスごとに設定する必要があるため、各プロセスはWSAStartupを呼び出して独自のメモリ空間内の構造を初期化し、WSACleanupを呼び出してソケットの使用が終了したときにそれらを再度破棄する必要があります。

于 2011-02-14T14:12:46.027 に答える