サーバーのソケットの作成

初期化後、サーバーで使用するために SOCKET オブジェクトをインスタンス化する必要があります。

サーバーのソケットを作成するには

  1. getaddrinfo 関数は、sockaddr 構造体の値を決定するために使用されます。

    • AF_INET は、IPv4 アドレス ファミリを指定するために使用されます。
    • SOCK_STREAM は、ストリーム ソケットを指定するために使用されます。
    • IPPROTO_TCP は、TCP プロトコル を指定するために使用されます。
    • AI_PASSIVE フラグは、呼び出し元が バインド 関数の呼び出しで返されたソケット アドレス構造を使用することを示します。 AI_PASSIVE フラグが設定され、nodename パラメーターが getaddrinfo 関数に NULL ポインターである場合、ソケット アドレス構造体の IP アドレス部分は、IPv4 アドレスの場合はINADDR_ANYに設定され、IPv6 アドレスの場合はIN6ADDR_ANY_INITに設定されます。
    • 27015 は、クライアントが接続するサーバーに関連付けられているポート番号です。

    addrinfo 構造体は、getaddrinfo 関数によって使用されます。

    #define DEFAULT_PORT "27015"
    
    struct addrinfo *result = NULL, *ptr = NULL, hints;
    
    ZeroMemory(&hints, sizeof (hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
    
    // Resolve the local address and port to be used by the server
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  2. サーバー がクライアント 接続をリッスンするための ListenSocket という SOCKET オブジェクトを作成します。

    SOCKET ListenSocket = INVALID_SOCKET;
    
  3. ソケット関数を呼び出し、その値を ListenSocket 変数に返します。 このサーバー アプリケーションでは、hints パラメーターで指定されたアドレス ファミリ、ソケットの種類、プロトコルに一致する getaddrinfo の呼び出しによって返される最初の IP アドレスを使用します。 この例では、IPv4 の TCP ストリーム ソケットが、IPv4 のアドレス ファミリ、SOCK_STREAMのソケットの種類、およびIPPROTO_TCPのプロトコルを使用して要求されました。 そのため、ListenSocket には IPv4 アドレスが要求されます。

    サーバー アプリケーションが IPv6 でリッスンする場合は、アドレス ファミリを hints パラメーターでAF_INET6に設定する必要があります。 サーバーが IPv6 と IPv4 の両方でリッスンする場合は、IPv6 用と IPv4 用の 2 つのリッスン ソケットを作成する必要があります。 これら 2 つのソケットは、アプリケーションによって個別に処理される必要があります。

    Windows Vista 以降では、IPv6 と IPv4 の両方でリッスンするデュアル スタック モードの単一の IPv6 ソケットを作成できます。 この機能の詳細については、「 デュアルスタック ソケット」を参照してください。

    // Create a SOCKET for the server to listen for client connections
    
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    
  4. エラーを調べて、ソケットが有効なソケットであることを確認します。

    if (ListenSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }
    

次の手順: ソケットのバインド

winsock ではじめにする

Winsock の初期化

Winsock Server アプリケーション