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

回答編集履歴

4

追記

2018/01/09 10:47

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -18,4 +18,10 @@
18
18
  質問文のこの部分は
19
19
  > Linux では、 select() がソケットファイルディスクリプターで "読み込みの準備ができた" と報告した場合でも、 この後で read を行うと停止 (block) することがある。
20
20
 
21
- selectでブロッキングソケット(O_NONBLOCK指定なし)の監視を行っている状態です。
21
+ selectでブロッキングソケット(O_NONBLOCK指定なし)の監視を行っている状態です。
22
+
23
+ ---
24
+ O_NONBLOCKオプションを設定しているなら、質問文の問題は発生しません。
25
+ 1,受信データのロスト→ACK応答が無いので再送される。
26
+ 2,readでblock→ノンブロッキングソケットなため入出力はブロックしない。
27
+ select→FD_ISSETの受信ループに戻せばいいです。

3

ブロッキングソケットの説明を追記

2018/01/09 10:47

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -5,4 +5,17 @@
5
5
  ブロッキングソケット(O_NONBLOCKオプションなし)の場合、
6
6
  readでパケット待機待ちのブロックが発生するという話です。
7
7
 
8
- ネットワークプログラミングを作成する時は、自力でselectやread/write(recv/send)を行わずにライブラリを使用したほうがバグの発生を防げると思います。あとテストが大変です。
8
+ ネットワークプログラミングを作成する時は、自力でselectやread/write(recv/send)を行わずにライブラリを使用したほうがバグの発生を防げると思います。あとテストが大変です。
9
+
10
+ ---
11
+ <前提知識>
12
+ ソケットには入出力の完了を待つ(ブロッキング)、完了を待たない(ノンブロッキング)があります。
13
+ |種類|O_NONBLOCKオプション|
14
+ |:--|:--:|
15
+ |ブロッキングソケット|指定なし|
16
+ |ノンブロッキングソケット|指定あり|
17
+
18
+ 質問文のこの部分は
19
+ > Linux では、 select() がソケットファイルディスクリプターで "読み込みの準備ができた" と報告した場合でも、 この後で read を行うと停止 (block) することがある。
20
+
21
+ selectでブロッキングソケット(O_NONBLOCK指定なし)の監視を行っている状態です。

2

ノンブロッキングソケットではなーーーいいい。

2018/01/09 10:41

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -2,7 +2,7 @@
2
2
  サーバー側からのACK確認応答がないため、クライアントはパケットを再送します。
3
3
 
4
4
  このバグの説明はselectの待機で疑似覚醒(スプリアスウェイクアップ)が発生し、
5
- ノンブロッキングソケット(O_NONBLOCKオプションなし)の場合、
5
+ ブロッキングソケット(O_NONBLOCKオプションなし)の場合、
6
6
  readでパケット待機待ちのブロックが発生するという話です。
7
7
 
8
8
  ネットワークプログラミングを作成する時は、自力でselectやread/write(recv/send)を行わずにライブラリを使用したほうがバグの発生を防げると思います。あとテストが大変です。

1

追記

2018/01/09 05:58

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -5,4 +5,4 @@
5
5
  ノンブロッキングソケット(O_NONBLOCKオプションなし)の場合、
6
6
  readでパケット待機待ちのブロックが発生するという話です。
7
7
 
8
- ネットワークプログラミングを作成する時は、自力でselectやread/write作成せずに高レベルのライブラリを使用したほうがバグの発生を防げると思います。あとテストが大変です。
8
+ ネットワークプログラミングを作成する時は、自力でselectやread/write(recv/send)を行わずにライブラリを使用したほうがバグの発生を防げると思います。あとテストが大変です。