我将复制收到的数据recv()
,输入/输出缓冲区的最大大小为 MAX_PACKET。
以固定大小复制它是否安全MAX_PACKET
?使用 memcpy 时是否需要设置正确的缓冲区大小?
recv(sock,recvbuf,MAX_PACKET,0);
memcpy(inbuffer,recvbuf,MAX_PACKET);
您需要声明 inbuffer 至少与 MAX_PACKET char * inbuffer = new char[MAX_PACKET]; 的大小一样多的字节数
并放置在每个 recv() memset(inbuffer,0,MAX_BUFFER) 之前;将缓冲区归零,这样您就不会在收到两个数据包的情况下错误地看到前一个数据包的尾端,其中第二个比第一个短。
如果您的传入数据包没有唯一的终止字节,即 '\r' 您需要添加 int recvbytes ;recvbytes =new recv(...) 因为 recv 返回线路上接收到的字节数
除非 inBuffer 至少与 MAX_PACKET 一样大。
除了 Oezbek 所说的之外,除非实际收到 0,否则 recv 也不会 0 终止。
另一种方法
std::string inbuffer; // member variable to the class
.......
int ret = recv(sock,recvbuff,MAX_PACKET);
if(ret != 0)
{
inbuffer.insert(inbuffer.end(),recvbuff, recvbuff + ret);
...... // use the data.
}
这避免了使用 memcpy。无论如何,STD 库应该做聪明的事情并为你调用 memcpy/memmove :)
使用时有必要设置正确的缓冲区大小,memcpy
因为recv
它将只放入recvbuf
当前可用的数据,并且最多为您指定的MAX_PACKET
. 即使在另一端你正在做send(sock,sendbuf,MAX_PACKET,0);
(并且MAX_PACKET
在两个地方都具有相同的价值),也不是。如果您使用的是 UDP( ) 并且您的所有数据报都是 size ,
那么您的代码唯一有意义的情况是。SOCK_DGRAM
MAX_PACKET
安全是的,但很浪费。也不要忘记除了从 recvbuf 实际接收到的数据之外,不要使用 inbuffer 中返回的数据。