UDPでの通信プログラミングに関する質問です。

(PC:A) - (NetworkEmulator) - (PC:B)という構成で
PC:Aから8kbyte(MTUサイズ以上)のデータPC:Bに対してsendtoで送信します。
その際にNetworkEmulatorで何もしない場合は問題なくPC:Bでデータを受信できるのですが、
packetLossを発生させるとPC:Bではrecvでプログラムが止まってしまい、アプリとしてデータを受信することができなくなってしまいます。

確認した項目としては以下になります
- PC:Aの送信サイズをMTUサイズ以下にすると問題が発生しない
- PC:B上でTCPDUMPにより届いているパケットを確認すると、NetworkEmulatorで想定した通りのpacketLoss率でデータが届いている
- PC:BがWindowsXPの際に上記問題が発生して、PC:BがLinuxの際には問題が発生しない
- winsockのオプションでUDP_NOCHECKSUMをOnにして送信しても同様の問題が発生する

上記問題に関して、原因と対応方法をご存じでしたら、よろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2010/01/24 13:42:49
  • 終了:2010/01/31 13:45:02

回答(1件)

id:sasaki30234 No.1

sasaki30234回答回数18ベストアンサー獲得回数02010/01/24 15:04:36

ポイント60pt

recv ではある程度受信データがそろわないと、その関数で止まってしまいます。

なのでもしそれを防ぎたければ、selectを使用して、recv で読み取り可能であれば 1bytesずつ受信するようにすれは状況が改善すると思われます。

http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx

id:mustangsally

対策としてselectを用いることは理解していますが、WindowsXPではNGでLinuxでは問題が発生しない原因が知りたいです。

原因となりそうな両者のsocket,recvに関する実装の相違点、設定方法等をご指摘いただけると幸いです。

2010/01/24 16:09:31

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません