(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にして送信しても同様の問題が発生する
上記問題に関して、原因と対応方法をご存じでしたら、よろしくお願いします。
recv ではある程度受信データがそろわないと、その関数で止まってしまいます。
なのでもしそれを防ぎたければ、selectを使用して、recv で読み取り可能であれば 1bytesずつ受信するようにすれは状況が改善すると思われます。
http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx