5

ノンブロッキングソケット(fd_setsおよびselect関数)を使用してサーバーとクライアントをプログラミングしています。サーバーがクライアントソケットを閉じるかシャットダウンすると、クライアントはクラッシュするまで大量のゴミを受け取り始めます。作業中は警告が表示されます。ソケットを使用select()すると、接続が終了したときに読み取り可能になりますが、どうすればわかりますか

if( FD_ISSET( socket, &read ) ) 
{
} 

原因が通常のデータだけなのか、接続が終了したのか。

大いに感謝する!

4

2 に答える 2

6

ファイル記述子セットは、ソケットが閉じているかどうかを通知せず、ソケットからの読み取りを試みることができることのみを通知します。リモートエンドが接続を閉じると、ソケットは「読み取り可能」になります。しようとするとrecv()、戻り値は0になり、ソケットが閉じていることを示します。常に戻り値を確認してください。

于 2011-05-09T13:09:47.940 に答える
0

代わりに使用する必要がありますpoll(FD_SETのサイズに制限されないため、より柔軟です!)

struct poll p = {.fd = fd, .events = POLLHUP|POLLRDHUP};
于 2011-12-13T16:58:51.657 に答える