かずブログ

Orange Tiny Terror
ひたすら弾くだけ! ギター・トレーニング
地獄のメカニカル・トレーニング・フレーズ 暴走するクラシック名曲編
HERCULES GS432B
冒険野郎マクガイバー シーズン1〈日本語完全版〉
冒険野郎マクガイバー シーズン2〈日本語完全版〉
冒険野郎マクガイバー シーズン3〈日本語完全版〉
Destination (通常盤)
circus (DVD付)
SanDisk UltraII メモリースティックPRO Duo 4GB 転送速度15MB/Sec SDMSPDH-004G-J61
SanDisk microSD Memory Kit 2GB SDSDQ-2048-J3K

仕事メモ

ちょっと分からなかったことがあったので、メモしておきます。

現象:140ms以下などの短い間隔で小さいパケットを受信すると、パケットロスしてしまう

OSはWindows2003 server。
Winsockを使用しています。

電文にはヘッダがあり、スタートコードとレングスがヘッダに入っています。
WSAEventSelectでTCPイベントとイベントオブジェクトを関連付け、WaitForMultipleObjectsで待機しています。
WSAEventSelectを使用しているので、ノンブロッキングモードで動いています。

細かい部分は省きますが、TCPイベントを受信した際まずはrecvでヘッダのみ読み込み、スタートコードが見つかればレングス分残りデータを読み込みます。
その1パケットを処理したら、またWaitFor〜で待ち。
としていましたが、ここで上記現象が発生。

どうやら、TCPイベントはキューイングされずに、1つにまとめられてしまうようです。
そのため、短い間隔で2つパケットが来ていた場合に2つ目のパケットを処理しないままWaitFor〜に戻り、次のTCPイベントで先程受信した2つ目のパケットを処理し、今回受信したパケットは処理されないまま、となってしまっていたようです。

なので、一度のTCPイベントが発生したら、受信バッファが空になるまでrecvをしないといけないようです。

こういう情報、MSDNに載っていないんですけど。
TCP/IPのプログラムは作った経験が少ないんですが、こういうのは常識なんでしょうか?
そうであろうとなかろうと、こういう情報はどこかに載せておいて欲しいなぁ。
無駄な工数を使いました。

2010/07/09(Fri) 22:41:24 [2435] かず

投稿パス:

名前:  題名:


パスワード: 

Next >> [Speedpass]
Back >> [やっと解放…か?]