公開デバッグ、
上のEchoサーバもどきにCSAプロトコルのGame_Summaryを256個ほど連続で送りつけてみてわかったのだが、計8448行のうちの最後の数行を読み込まないままエコーバックを中断し、次の入力があるまでそのままになってしまうバグをハケンすたorz
これは、nb == 0でslvSock.Receive()を呼んだ時点でbuf[]内に未走査のデータがあると、それらが未走査のままブロッキングに入ってしまうため。
次のパッチでslvSock.Receive()のあたりが修正される。
Index: SocketTest.cpp =================================================================== RCS file: D:/usr2/cvs/tmp2/Grimoire2/SocketTest/SocketTest.cpp,v retrieving revision 1.1 diff -u -r1.1 SocketTest.cpp --- SocketTest.cpp 6 Feb 2010 07:46:58 -0000 1.1 +++ SocketTest.cpp 6 Feb 2010 09:56:13 -0000 @@ -47,19 +47,22 @@ int wp = 0; int line = 0; for (;;) { - DWORD nb; - // バッファ内の受信データサイズ取得 - if (!slvSock.IOCtl(FIONREAD, &nb)) { - ERR("IOCtl()失敗"); - return; - } + // 新規データ獲得 + if (rp == wp) { // (buf[]内に未走査データ無し) + DWORD nb; + // バッファ内の受信データサイズ取得 + if (!slvSock.IOCtl(FIONREAD, &nb)) { + ERR("IOCtl()失敗"); + return; + } - // 読み出す - DWORD nbMax = bufSz - wp; // LineSizeMax以上は保証される - if (nb > nbMax) - nb = nbMax; - int n = slvSock.Receive(buf + wp, nb); - wp += n; + // 読み出す + DWORD nbMax = bufSz - wp; // LineSizeMax以上は保証される + if (nb > nbMax) + nb = nbMax; + int n = slvSock.Receive(buf + wp, nb); + wp += n; + } // 改行検出 bool lineFeed = false;
これで8448行きちんとエコーバックして終わるようになった。