2017-12-14 21 views
0

Cで複数のクライアントを持つサーバーで遊んでいて、気がついたことがあります。クライアントがサーバーから切断されるとき(サーバーは単にクライアントのファイル記述子で閉じる)選択コール(selectを使用して複数のクライアントからのメッセージを処理しています)は、サーバーのソケットを読み込み準備ができていると設定し、呼び出しの戻り値は0です。selectはサーバーソケットで0を返すため、この事実を無視するとサーバーがブロックされます他のソケットを待つのではなく、準備としてセットする。誰かが切断した後、そしてサーバが新しい接続を受け入れる前に、サーバソケットで何らかの余分なクリーンアップが行われていますか?Selectコールは、クライアントが切断されたときにサーバーのソケットを設定します。

答えて

0

サーバーがrecv()から0または-1を取得すると、そのソケットでcloseを呼び出す必要があります。また、このソケットがread/write fdsetから削除され、select()に渡されていることを確認してください。読み書きのfdsetに悪いfdがあります

+0

ありがとうございました! fdsetsにソケットを追加するときに間違ったフラグをチェックしていたことが判明しました – user1435820

関連する問題