思うだけで学ばない日記 2.0

思うだけで学ばない日記から移転しました☆!よろしくお願いします。

公開デバッグ、

上の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行きちんとエコーバックして終わるようになった。