ソケットプログラミングのお勉強その4

ポイント13まで。ポイント10をちゃんと理解できているか怪しいので、プログラム書きながらもう一度復習しないと駄目かも。ポイント12「うまく動作しているLAN戦略がWANにも適応できると思ってはいけない」について。LANで正常動作している(と思いこんでいる)ものをWAN環境に持って行くと途端に問題が発覚することがあります。例えばクライアント側から8byte/12byteのデータを1秒間隔で交互に送り、それをサーバー側で受信するプログラムがあったとします。サーバー側では大きい方の12byteに合わせてバッファを用意し、次のように読み込んだとします。

char buf [12];
len = recv(s, buf, sizeof(buf), 0);

LANで動かすと多分、8byte、12byte、8byte・・・とうまく動いているように見えます。ところがこれをWANに持って行くと問題が発生することがあります。前々回勉強した内容によるとTCPではすぐにパケットを送れないときは複数のパケットをまとめてセグメントとして送ります。運悪く8byteと12byteがまとめられて20byteのデータとして送られることもあり得ます。受信側は最大12byte受け取りますので、8byteと12byteデータの先頭4byte分という誤ったデータが受信されることになります。こうして問題発生となるわけです。この問題はWANでは1秒以上待たされる頻度が高いだけで、勿論LANでも起こる話です。しかし、テスト環境(恐らくLAN)では中々発生しないので気づかないまま製品を出してしまうこともあり得ます。更に、開発環境で再現しないためネットワークに疑いが行ってしまい、深みに嵌っていくことに・・・(^^;
やはり、正しい知識を身につけないといけないですね。