前回作成したDXライブラリのプログラムのことは忘れて下さい。
いつものコンソールへ戻りますよ。
さて、実は今まで作成してきたサーバーサイドプログラムには重要な欠陥があるのです。
それを見る為に、実験をしてみましょう。
クライアントプログラムから//sendを全てコメントアウトして下さい。
サーバーサイドプログラムを起動して、クライアントプログラムを起動します。
つまり、connectによるSYNしか送らないということです。
これを行うと……

例外が生成され、プログラムが強制的に停止しました。
このサーバーサイドプログラムは、SYNを送信した後、パケットを送信しなかった時、例外が発生するのです。
なぜなら、recvが失敗するからです。意外なことに、recvはソケットバッファからデータを読みだせなかった時、0ではなく-1を返します。読み出したデータのバイト数を返すのがrecvだと思っていたのですが、読みだせなかった時はエラー扱いなのです。
なので、
NULL文字を格納する為のこの行にて、recvが-1を返した時は、
となるのです。-1の領域へ書き込むなんて不可能ですから、例外が生成されるのですね。
という訳で、recvが-1を返した時の処理を考えましょう。これをエラー処理と言います。
ボクは単純に、
なぜなら、recvで文字を読みだせなかったのならば、0文字読み出した扱いの方が人間工学的に正しい気がしたからです。これなら
これなら例外が生成されることはなく、プログラムは問題なく動きます。
このように、関数の返す値を利用してエラーであるか否かを見極め、エラー処理をコーディングしていくことをエラー処理と言います。
各関数のエラーコードは……WinSockの関数のエラーコードは煩雑なので、各関数ごとに検索した方が早いと思います。
Next【7限目】User Datagram Protocol
【0限目】
いつものコンソールへ戻りますよ。
さて、実は今まで作成してきたサーバーサイドプログラムには重要な欠陥があるのです。
それを見る為に、実験をしてみましょう。
クライアントプログラムから//sendを全てコメントアウトして下さい。
サーバーサイドプログラムを起動して、クライアントプログラムを起動します。
つまり、connectによるSYNしか送らないということです。
これを行うと……

例外が生成され、プログラムが強制的に停止しました。
このサーバーサイドプログラムは、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の関数のエラーコードは煩雑なので、各関数ごとに検索した方が早いと思います。
Next【7限目】User Datagram Protocol
【0限目】
コメント