接続の受け入れ (Windows ソケット 2)

ソケットが接続をリッスンしたら、プログラムはそのソケットでの接続要求を処理する必要があります。

ソケットで接続を受け入れるには

  1. クライアントからの接続を受け入れるための ClientSocket という一時的な SOCKET オブジェクトを作成します。

    
    SOCKET ClientSocket;
    
    
    
  2. 通常、サーバー アプリケーションは、複数のクライアントからの接続をリッスンするように設計されます。 パフォーマンスの高いサーバーの場合、複数のクライアント接続を処理するために複数のスレッドが一般的に使用されます。

    Winsock を使用するプログラミング手法には、複数のクライアント接続をリッスンするために使用できる、いくつかの異なるプログラミング手法があります。 プログラミング手法の 1 つは、 listen 関数を使用して接続要求をチェックする連続ループを作成することです (「 ソケットでのリッスン」を参照)。 接続要求が発生した場合、アプリケーションは acceptAcceptEx、または WSAAccept 関数を呼び出し、要求を処理する作業を別のスレッドに渡します。 他のいくつかのプログラミング手法を使用できます。

    この基本的な例は非常に単純であり、複数のスレッドを使用しないことに注意してください。 この例では、単に をリッスンし、1 つの接続のみを受け入れます。

    
    ClientSocket = INVALID_SOCKET;
    
    // Accept a client socket
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET) {
        printf("accept failed: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    
    
    
  3. クライアント接続が受け入れられると、サーバー アプリケーションは通常、受け入れられたクライアント ソケット (上記のサンプル コードの ClientSocket 変数) をワーカー スレッドまたは I/O 完了ポートに渡し、追加の接続を引き続き受け入れます。 この基本的な例では、サーバーは次の手順に進みます。

    複数の接続をリッスンして受け入れるために使用できる他のプログラミング手法がいくつかあります。 これには、 select 関数または WSAPoll 関数の使用が含まれます。 これらのさまざまなプログラミング手法の例は、Microsoft Windows ソフトウェア開発キット (SDK) に含まれている Advanced Winsock サンプル に示されています。

    Note

    Unix システムでは、サーバーの一般的なプログラミング手法は、アプリケーションが接続をリッスンする方法でした。 接続が受け入れられると、親プロセスは フォーク 関数を呼び出して、クライアント接続を処理する新しい子プロセスを作成し、親からソケットを継承します。 フォーク 関数は サポートされていないため、このプログラミング手法は Windows ではサポートされていません。 この手法は、新しいプロセスを作成するために必要なリソースがスレッドに必要なリソースよりもはるかに大きいため、通常は高性能サーバーには適していません。

     

次の手順: サーバーでのデータの受信と送信

Winsock を使用したはじめに

Winsock サーバー アプリケーション

ソケットでのリッスン