虽然由于您的问题的措辞,我不确定您的问题到底是什么,但您通常不能使用strcat
附加通过网络接收的原始缓冲区,除非您明确知道它们将以 NULL 终止,即使那样,那也不是如果您收到意外的数据传输,则真正“安全”。c-strings 的假设是它们是以 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