前に Socket プログラミングについて書いたのだけれど、ちょっとだけ補足。
write の後、すぐに close すると、システムによっては相手がデータ読み込みを完了する前に close を検出してしまうことがある。これは双方が Windows 環境で相手が write したデータを全て読んでいないうちに close したときに起きた。これに対処するためにはWinsock Programmer's FAQ の「2.10 - TCP ソケットを正しく close するにはどうすれば良いのですか?」に書かれているような手順を取る。Programming UNIX Sockets in C のほうの「2.5 ソケットを正しく閉じるにはどうすればよいのですか?」には特にそういったことは触れられていないが、強いて言えばこの次の項目「2.6 shutdown() はどういうときに使うべきなのですか?」が相当する。特にサーバー側から切断するような場合には念を入れたほうが良さそうだ。
更には、http://support.microsoft.com/?scid=kb;ja;214397 に書かれているように小さなデータセグメントを送信するとパフォーマンスの悪化を招くことになる。他にも「Winsock の send-send-ack 問題(FreeBSD QandA 1582、 SambaでWindows NT Server と同じ転送速度を確保する方法)」というのがあって WinSock は一筋縄では行かない。つまり「一度の read で読めるように送れ」と言うのは、通信効率を求める上では正当な要求になる。だからと言って受信側で一度の read で読める保証はないのはお分かりいただけただろうか。
Posted by masato at 10:14 PMおそらく携帯電話等からは投稿できません。日本語文字列を含まないコメントやトラックバック、および当サイトへの言及を含まないトラックバックは御遠慮いただいております。また、90日以上経過した記事へのコメントはできません。