Winsockで、送信側で大きいデータ(8k以上)を送信し
受信側で受信したデータをrecvで受信する際、データが分割されて
送られてくるので分割されたデータをstrcat連結しているのですが、
データの終端等の判断するプログラムを入れてないため、後から
送信したデータまで連結してしまう状態です。これをうまく解決する方法は
いろいろあると思うのですが、いい方法はないでしょうか。
case FD_READ:
recv(Socket, RecvData, 8192, 0);
Data = strcat(Data, RecvData);
break;
そもそもこの目的にstrcatを使ってはいけません。
私ならstd::vectorを使いますが。
recvが何Byte受信したか戻り値で判断しましょう。
# C++で組んでいなかったので、私はその都度メモリ確保とコピーで…
前後のパケットが繋がってしまうというという問題点と解釈しました。
・パケットの長さを固定長にしてしまう
・パケットに明確な区切り文字(データ)を入れる
・パケットの先頭にデータの長さを追加する
これくらいでしょうか?
データサイズは固定?
固定なら、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;
とか。(エラーチェックはしてません)
固定でないなら、データの先頭か末尾に区切り文字を入れればいいでしょう。
間違ってたらすみません。
ツイート | ![]() |