受信したデータを連結するには?


しだ  2006-07-16 18:24:20  No: 62531  IP: 192.*.*.*

Winsockで、送信側で大きいデータ(8k以上)を送信し
受信側で受信したデータをrecvで受信する際、データが分割されて
送られてくるので分割されたデータをstrcat連結しているのですが、
データの終端等の判断するプログラムを入れてないため、後から
送信したデータまで連結してしまう状態です。これをうまく解決する方法は
いろいろあると思うのですが、いい方法はないでしょうか。

case FD_READ:
  recv(Socket, RecvData, 8192, 0);
  Data = strcat(Data, RecvData);
  break;

編集 削除
YuO  2006-07-16 19:26:35  No: 62532  IP: 192.*.*.*

そもそもこの目的にstrcatを使ってはいけません。
私ならstd::vectorを使いますが。

編集 削除
瀬戸っぷ  2006-07-17 11:55:16  No: 62533  IP: 192.*.*.*

recvが何Byte受信したか戻り値で判断しましょう。

# C++で組んでいなかったので、私はその都度メモリ確保とコピーで…

編集 削除
REE  2006-07-17 15:50:50  No: 62534  IP: 192.*.*.*

前後のパケットが繋がってしまうというという問題点と解釈しました。
・パケットの長さを固定長にしてしまう
・パケットに明確な区切り文字(データ)を入れる
・パケットの先頭にデータの長さを追加する
これくらいでしょうか?

編集 削除
通りすがり  2006-07-20 13:15:22  No: 62535  IP: 192.*.*.*

データサイズは固定?
固定なら、recvの戻り値から何バイト受信したかチェックして、
一定量読み込むまでrecvを続ける。

int ret;
static int recved = 0;

FD_READ:
ret = recv(Socket, &RecvData[recved], sizeof(RecvData) - recved, 0);
recved += ret;
if( recved < sizeof(RecvData) )
  break;
// 処理
break;

とか。(エラーチェックはしてません)
固定でないなら、データの先頭か末尾に区切り文字を入れればいいでしょう。
間違ってたらすみません。

編集 削除