C で記述されたマルチスレッド サーバーがあり、各クライアント スレッドは次のようになります。
ssize_t n;
struct request request;
// Main loop: receive requests from the client and send responses.
while(running && (n = recv(sockfd, &request, sizeof(request), 0)) == sizeof(request)) {
// Process request and send response.
}
if(n == -1)
perror("Error receiving request from client");
else if(n != sizeof(act))
fprintf(stderr, "Error receiving request from client: Incomplete data\n");
// Clean-up code.
ある時点で、クライアントは切断しなければならない特定の基準を満たします。クライアントが定期的にリクエストを送信している場合、応答で切断を通知できるため、これは問題ありません。ただし、クライアントが要求を送信するのに時間がかかる場合があるため、クライアント スレッドがrecv
呼び出しでブロックされ、クライアントは次の要求/応答まで切断されません。
recv
クライアント スレッドが呼び出しでブロックしている間にクライアントを別のスレッドから切断するクリーンな方法はありますか? 試してみましたが、実際には正確ではないclose(sockfd)
エラーが発生します。Error receiving request from client: Bad file descriptor
または、ここでエラーを処理するためのより良い方法はありますか?