前回作成したDXライブラリのプログラムのことは忘れて下さい。
いつものコンソールへ戻りますよ。

さて、実は今まで作成してきたサーバーサイドプログラムには重要な欠陥があるのです。
それを見る為に、実験をしてみましょう。

クライアントプログラムから//sendを全てコメントアウトして下さい。
サーバーサイドプログラムを起動して、クライアントプログラムを起動します。
つまり、connectによるSYNしか送らないということです。

これを行うと……
19


例外が生成され、プログラムが強制的に停止しました。
このサーバーサイドプログラムは、SYNを送信した後、パケットを送信しなかった時、例外が発生するのです。
なぜなら、recvが失敗するからです。意外なことに、recvはソケットバッファからデータを読みだせなかった時、0ではなく-1を返します。読み出したデータのバイト数を返すのがrecvだと思っていたのですが、読みだせなかった時はエラー扱いなのです。

なので、
ClientDateBuffer[recvRETURN] = '\0';

NULL文字を格納する為のこの行にて、recvが-1を返した時は、
ClientDateBuffer[-1] = '\0';

となるのです。-1の領域へ書き込むなんて不可能ですから、例外が生成されるのですね。

という訳で、recvが-1を返した時の処理を考えましょう。これをエラー処理と言います。
ボクは単純に、
if (recvRETURN == -1) recvRETURN = 0;
 と書きました。
なぜなら、recvで文字を読みだせなかったのならば、0文字読み出した扱いの方が人間工学的に正しい気がしたからです。これなら
ClientDateBuffer[0] = '\0';
 で配列の先頭へNULL文字を格納し、その配列にデータがないことを表現できますね。


これなら例外が生成されることはなく、プログラムは問題なく動きます。
このように、関数の返す値を利用してエラーであるか否かを見極め、エラー処理をコーディングしていくことをエラー処理と言います。

各関数のエラーコードは……WinSockの関数のエラーコードは煩雑なので、各関数ごとに検索した方が早いと思います。