レコード境界とは、レコードの境界です。
レコードとは、データのことです。

前回、前々回作成したクライアント/サーバーサイドプログラムで考えます。
今回の議題は、クライアントが2つのパケットを送信した場合についてです。

例えばAボタンを押したことを示す「ButtonA」と、Bボタンを押したことを示す「ButtonB」というパケットを送信します。
send(ConnectSocket, "ButtonA", 7, 0);
send(ConnectSocket, "ButtonB", 7, 0);


2つのパケットがサーバーへ届いた後、recvを1度だけ実行して読み出すと、ClientDateBufferへはどのように文字列が格納されるでしょうか?



その為、1度のrecvで大量のパケットを読み出すことがあるのです。
これを防ぐための方法はいくつかあります。今回はレコード境界を作成する手法を学びます。
つまり、送信するパケットの末尾に記号を挿入しておき、その記号までのデータを実際のデータとして扱うということです。

レコード境界を用いたプログラムの処理手順は以下の通りです。
・クライアント:sendする文字列の末尾に記号を設定しておく。
・サーバーサイド:recvで読み出す。
・サーバーサイド:recvで読み出したデータから、末尾の記号が見つかるまで読み出すアルゴリズムを実行し、改めてデータを取り出す。


それでは実際にプログラミングしていきましょう。
sendする文字列の末尾に記号を設定しておく必要があります。
send(ConnectSocket, "ButtonA|", 8, 0);
send(ConnectSocket, "ButtonB|", 8, 0);


この状態で実行してみましょう。
2


ご覧のようにレコード毎に境界記号が設定されました。

続けてクライアント側で改めて境界記号まで文字を読み出す処理を書きます。


forrecvが受け取ったデータを1文字ずつ別の配列へ格納しています。
ClientDateBuffer[Seeki] != '|';
にて、|記号が見つかるまでforを継続していることが分かりますね。

また、forを脱出した後、NULL文字を末尾へ付加しています。
ちなみにforの初期化子は省略しています。
3


おまけ:2パケットとも取り出すプログラムを載せておきます。
2回目に取り出す時には、Seekiの値と配列の添え字が合わなくなるので、それを調整する必要があります。この辺は各自作りたいソフトウェアに合わせてきれいに書き直して下さい。

4