クライアントのソケットの作成

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

ソケットを作成するには

  1. sockaddr 構造体を含む addrinfo オブジェクトを宣言し、これらの値を初期化します。 このアプリケーションでは、IPv6 アドレスまたは IPv4 アドレスを返すことができるように、インターネット アドレス ファミリは指定されていません。 アプリケーションは、TCP プロトコルのストリーム ソケットとしてソケットの種類を要求します。

    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;
    
  2. コマンド ラインで渡されたサーバー名の IP アドレスを要求する getaddrinfo 関数を呼び出します。 クライアントが接続するサーバー上の TCP ポートは、このサンプルでは DEFAULT_PORT によって 27015 として定義されています。 getaddrinfo 関数は、エラーをチェックする整数として値を返します。

    #define DEFAULT_PORT "27015"
    
    // Resolve the server address and port
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  3. ConnectSocket という名前の SOCKET オブジェクトを作成します。

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

    クライアント アプリケーションが IPv6 または IPv4 のみを使用して接続する場合は、アドレス ファミリを 、iPv6 の場合は AF_INET6 に設定するか、hints パラメーターで IPv4 用にAF_INETに設定する必要があります。

    // Attempt to connect to the first address returned by
    // the call to getaddrinfo
    ptr=result;
    
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
        ptr->ai_protocol);
    
  5. エラーを調べて、ソケットが有効なソケットであることを確認します。

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

ソケット関数に渡されるパラメーターは、実装ごとに変更できます。

エラー検出は、成功したネットワーク コードの重要な部分です。 ソケット呼び出しが失敗すると、INVALID_SOCKETが返されます。 前のコードの if ステートメントは、ソケットの作成時に発生した可能性のあるエラーをキャッチするために使用されます。 WSAGetLastError は 、発生した最後のエラーに関連付けられたエラー番号を返します。

注意

アプリケーションによっては、より広範なエラー チェックが必要になる場合があります。

たとえば、 hints.ai_familyAF_UNSPEC に設定すると、接続呼び出しが失敗する可能性があります。 その場合は、代わりに特定の IPv4 (AF_INET) または IPv6 (AF_INET6) 値を使用します。

WSACleanup は、WS2_32 DLL の使用を終了するために使用されます。

次の手順: ソケットへの接続

winsock ではじめにする

Winsock の初期化

Winsock クライアント アプリケーション