質問するログイン新規登録

質問編集履歴

2

追記の変更

2018/01/09 10:28

投稿

BitMaPT
BitMaPT

スコア25

title CHANGED
File without changes
body CHANGED
@@ -3,4 +3,9 @@
3
3
 
4
4
  ここで疑問に思ったのが、このような状況になった時はrecvでデータを受け取ろうとしても何も得られないのは予想できますが、得られるはずだったデータを得るためにはどのようにすればよいのかです。単純にもう一度selectからやり直してデータを正しく受け取るのを待つだけでよいのでしょうか?
5
5
 
6
+ (追記)
7
+ いくつか不備があったので追記します。
8
+ - プロトコルはTCPです。
6
- (追記)プロトコルはTCPです。勉強のためにselectなどを直接使い、ライブラリは使用していません。
9
+ - 勉強のためにselectなどを直接使い、ライブラリは使用しません。
10
+ - 使用言語はCです。
11
+ - 上の質問はO_NONBLOCKを使用したときを想定しています。

1

追記の追加

2018/01/09 10:28

投稿

BitMaPT
BitMaPT

スコア25

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,6 @@
1
1
  [selectのmanページ](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/select.2.html)のバグの項目において以下のような記述があります。
2
2
  > Linux では、 select() がソケットファイルディスクリプターで "読み込みの準備ができた" と報告した場合でも、 この後で read を行うと停止 (block) することがある。このような状況は、 例えば、データが到着したが、検査でチェックサム異常が見つかり廃棄された時 などに起こりえる。他にもファイルディスクリプターが準備できたと間違って 報告される状況が起こるかもしれない。 したがって、停止すべきではないソケットに対しては O_NONBLOCK を使うとより安全であろう。
3
3
 
4
- ここで疑問に思ったのが、このような状況になった時はrecvでデータを受け取ろうとしても何も得られないのは予想できますが、得られるはずだったデータを得るためにはどのようにすればよいのかです。単純にもう一度selectからやり直してデータを正しく受け取るのを待つだけでよいのでしょうか?
4
+ ここで疑問に思ったのが、このような状況になった時はrecvでデータを受け取ろうとしても何も得られないのは予想できますが、得られるはずだったデータを得るためにはどのようにすればよいのかです。単純にもう一度selectからやり直してデータを正しく受け取るのを待つだけでよいのでしょうか?
5
+
6
+ (追記)プロトコルはTCPです。勉強のためにselectなどを直接使い、ライブラリは使用していません。