接続の受け入れ (Windows ソケット 2)
ソケットが接続をリッスンしたら、プログラムはそのソケットの接続要求を処理する必要があります。
ソケットで接続を受け入れるには
クライアントからの接続を受け入れるために ClientSocket という一時的な SOCKET オブジェクトを作成します。
SOCKET ClientSocket;
通常、サーバー アプリケーションは、複数のクライアントからの接続をリッスンするように設計されます。 高パフォーマンスサーバーの場合、複数のクライアント接続を処理するために複数のスレッドが一般的に使用されます。
Winsock を使用するプログラミング手法には、複数のクライアント接続をリッスンするために使用できる、いくつかの異なるプログラミング手法があります。 1 つのプログラミング手法は、
関数を使用して接続要求をチェックする連続ループを作成することです (ソケットでのリッスンlisten 参照)。 接続要求が発生した場合、アプリケーションは、 、AcceptExaccept 、または WSAAccept 関数 呼び出し、要求を処理する作業を別のスレッドに渡します。 他のいくつかのプログラミング手法が可能です。 この基本的な例は非常に単純であり、複数のスレッドを使用しないことに注意してください。 この例では、単一の接続だけを待ち受けて受け入れます。
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; }
クライアント接続が受け入れられると、サーバー アプリケーションは通常、受け入れられたクライアント ソケット (上記のサンプル コードの ClientSocket 変数) をワーカー スレッドまたは I/O 完了ポートに渡し、追加の接続を引き続き受け入れます。 この基本的な例では、サーバーは次の手順に進みます。
他にも、複数の接続をリッスンして受け入れるために使用できるプログラミング手法がいくつかあります。 これには、WSAPoll 関数の
または選択 の使用が含まれます。 これらのさまざまなプログラミング手法の例は、Microsoft Windows ソフトウェア開発キット (SDK) に含まれている Advanced Winsock サンプルに示されています。 手記
Unix システムでは、サーバーの一般的なプログラミング手法は、アプリケーションが接続をリッスンする方法でした。 接続が受け入れられると、親プロセスは フォーク 関数を呼び出して、クライアント接続を処理する新しい子プロセスを作成し、親からソケットを継承します。 フォーク 関数はサポートされていないため、このプログラミング手法は Windows ではサポートされていません。 この手法は、新しいプロセスを作成するために必要なリソースがスレッドに必要なリソースよりもはるかに大きいため、通常、高パフォーマンスサーバーには適していません。
が 関数を受け入れると、この例では ListenSocket
は不要になります。 ソケットを閉じるには、closesocket 関数が呼び出されます。
// No longer need server socket
closesocket(ListenSocket);
次の手順: サーバー でのデータの受信と送信を