selectのmanページのバグの項目において以下のような記述があります。
Linux では、 select() がソケットファイルディスクリプターで "読み込みの準備ができた" と報告した場合でも、 この後で read を行うと停止 (block) することがある。このような状況は、 例えば、データが到着したが、検査でチェックサム異常が見つかり廃棄された時 などに起こりえる。他にもファイルディスクリプターが準備できたと間違って 報告される状況が起こるかもしれない。 したがって、停止すべきではないソケットに対しては O_NONBLOCK を使うとより安全であろう。
ここで疑問に思ったのが、このような状況になった時はrecvでデータを受け取ろうとしても何も得られないのは予想できますが、得られるはずだったデータを得るためにはどのようにすればよいのかです。単純にもう一度selectからやり直してデータを正しく受け取るのを待つだけでよいのでしょうか?
(追記)
いくつか不備があったので追記します。
- プロトコルはTCPです。
- 勉強のためにselectなどを直接使い、ライブラリは使用しません。
- 使用言語はCです。
- 上の質問はO_NONBLOCKを使用したときを想定しています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/09 10:09
2018/01/09 10:29
2018/01/09 11:02