質問の文言のためにあなたの問題が何であるか正確にはstrcat
わかりませんが、ネットワーク経由で受信した生のバッファを追加するために使用することはできません。予期しないデータ転送が発生した場合でも、本当に「安全」です。c-string は NULL で終了すると想定されていますが、生のネットワーク バッファはそうではない可能性があり、strcat
NULL で終了していない入力バッファを使用すると、オーバーランが発生します。それ以外のstrcat
、データを受信するためにサイズ N バイトの既知の固定サイズのバッファーを使用し、バッファーの最後またはパケット送信の最後に到達するまで、バッファーを介して一時ポインターをインクリメントします。そうすれば、常に最大 N バイトまでネットワークから読み取ることができ、バッファ オーバーランの状況が発生するのを防ぐことができます。
たとえば、次のことができます (これは、すべてのコピーのため、最速またはより効率的なソリューションではありませんが、機能します)。
unsigned char buf[10000]; //10Kb fixed-size buffer
unsigned char buffer[MAXRECV]; //temporary buffer
unsigned char* temp_buf = buf;
unsigned char* end_buf = buf + sizeof(buf);
do
{
iByteCount = recv(GetSocketId(), buffer,MAXRECV,0);
if ( iByteCount > 0 )
{
//make sure we're not about to go over the end of the buffer
if (!((temp_buf + iByteCount) <= end_buf))
break;
fprintf(stderr, "Bytes received: %d\n",iByteCount);
memcpy(temp_buf, buffer, iByteCount);
temp_buf += iByteCount;
}
else if ( iByteCount == 0 )
{
if(temp_buf != buf)
{
//do process with received data
}
else
{
fprintf(stderr, "receive failed");
break;
}
}
else
{
fprintf(stderr, "recv failed: ");
break;
}
} while(iByteCount > 0 && temp_ptr < end_buf); //check for end of buffer