0

ソケット記述子の魔女をチェックするために使用するサーバーをselect()作成しましたが、明らかに、クライアントが切断された後でもソケットを読み取る準備ができているように選択され、ガベージ値が取得されます。

スタック オーバーフローに関するこの投稿を見つけました。

select (読み取りマスクが設定されている) は、ハンドルが通知された状態で返されますが、ioctl* を使用して読み取り保留中のバイト数を確認すると、ゼロになります。`

私の質問は、ioctl* とは何か、およびその使用方法は? そして、例は非常に良いでしょう。

4

2 に答える 2

3

ソケット (ファイル) 記述子に対する への呼び出しが をread()返す0場合、それは単純に、接続の反対側がシャットダウンして接続を閉じたことを意味します。

注:select()ソケット (ファイル) 記述子のセットで可能な「イベント」の待機は、 にfd_set渡されselect()た の 1 つによって表される接続がシャットダウンされたときにも返されます。

于 2012-12-11T13:20:52.577 に答える
3

を使用するときに人々が犯す通常のエラーを確認してくださいselect(2)

  • fd_set反復ごとに指定した s を常に再初期化select(2)します。これらは、システム コールが変更する入出力引数です。
  • fd_max反復ごとに、最初の引数である を再計算します。
  • すべてのシステム コールからのエラーをチェックし、 の値をチェックしますerrno(3)

そして、はい、read(2)反対側がTCP接続をきれいに閉じたときにゼロを返します。そのソケットはもう使用しないでくださいclose(2)

于 2012-12-11T13:28:10.927 に答える