ちょっと分からなかったことがあったので、メモしておきます。
現象: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のプログラムは作った経験が少ないんですが、こういうのは常識なんでしょうか?
そうであろうとなかろうと、こういう情報はどこかに載せておいて欲しいなぁ。
無駄な工数を使いました。