現在、Winsock2を使った簡単なチャットを作ろうと試みています。
そこで、わからないことがあったので質問させていただきました。
TCP/IPでは、送信側が連続してsend命令を実行したとき、別々のデータがひとつにまとまって受信されてしまうことから、
送信データにフッタ情報(簡単に言えば区切り文字)を付加し、受信側ではその情報を受信するまでrecvを続けるという処理を行いたいと考えています。
そこで構造体の指定バイト以降にデータを読み込む…という処理が必要になってきたのですが、
MYSTRUCT ms;
memcpy(&((char *)&ms)[offset], szBuf, recved_size);
というように、charにキャストしてオフセットを指定というかなり力押しな方法しか思いつかず・・・
しかしポインタから指定バイトずれた場所にバッファをコピーするという関数が見当たらなかったのでこのような形に…
他にスマートな方法はないでしょうか?
中途半端に揃った状態で構造体に入れるのではなくて
読み込みそのものはcharのバッファにしておいて
全て揃ってから構造体にコピーするのでは駄目なんでしょうか?
どうしても構造体で宣言された変数の途中にコピーしたいというのであれば、
結局は上記のような方法を取るしかないような気もします。
後、考えられるとしたら共用体で宣言しといてコピーするくらいですかねぇ。
union A {
MYSTRUCT ms;
char ch[sizeof(MYSTRUCT)];
}
union A buf;
memcpy(&buf.ch[offset], szBuf, recved_size);
とか。
>全て揃ってから構造体にコピーするのでは駄目なんでしょうか?
区切り文字(フッタ)を取得できるまで受信を待つとする予定だったので、
どのようなデータが格納されているかわからないバッファから区切り文字を発見するのは難しいかなと思ったため、
逐一構造体に格納して末尾にあるメンバ(フッタ)を参照して正しい値であるか確認する、という方法を取りました。
>後、考えられるとしたら共用体で宣言しといてコピーするくらいですかねぇ。
その手がありましたか…。
すっかり記憶から抜け落ちてました。。
回答ありがとうございます。
これで試してみます。
末尾にあるメンバを参照するのであれば、中途半端に構造体にいれても意味がないのでは?
たとえ、パケット毎に構造体が違うとしても、
その構造体のサイズ分のデータ受信を確認してから転送しないと・・
返信ありがとうございます。
少し馬鹿なことを考えていました。
サーバクライアントとも同じ構造体なので、区切り文字ではなく構造体のサイズ分受信するごとに処理をすればいいのですね。
ツイート | ![]() |