人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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にして送信しても同様の問題が発生する

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

●質問者: mustangsally
●カテゴリ:コンピュータ インターネット
✍キーワード:Linux ON pc tcpdump UDP
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● sasaki30234
●60ポイント

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

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

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

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ