そのため、ACE を使用してマルチスレッド サーバーをセットアップしようとしています。recv()/send() のブロックを防ぐために、非ブロック クライアント ソケットを使用しています。問題は、recv() を使用し、クライアントが不当に切断された場合です。recv() の結果は、クライアントが切断されたことを示しません。接続を確認する他の方法はありますか。
ここに短いスニペットがあります
char buffer[4096];
ssize_t bytesReceived = peer.recv(buffer, sizeof(buffer));
if (bytesReceived < 1 && errno != EWOULDBLOCK)
{
printf("Disconnected:\n");
}
else if (bytesReceived > 0)
{
buffer[bytesReceived] = '\0';
printf(buffer);
}
したがって、クライアントが切断された場合、recv は -1 を返しますが、errno は依然として EWOULDBLOCK です。
また、recv で短いタイムアウトを使用しようとしましたが、errno = ETIME(TIME-Out) を使用しない場合と同じ結果になります。