我将使用recv()
复制我收到的数据,并且输入/输出缓冲区的最大大小为MAX_PACKET。
使用固定大小MAX_PACKET
复制它是否安全?当我使用memcpy时,是否有必要设置正确的缓冲区大小?
recv(sock,recvbuf,MAX_PACKET,0);
memcpy(inbuffer,recvbuf,MAX_PACKET);
答案 0 :(得分:0)
安全,但浪费。另外,不要忘记不使用inbuffer中返回的数据超出recvbuf的实际接收数据。
答案 1 :(得分:0)
除非inBuffer至少与MAX_PACKET一样大。
除了Oezbek所说的,除非它实际收到0,否则recv赢得0终止。
答案 2 :(得分: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 lib应该做聪明的事情并为你调用memcpy / memmove:)
答案 3 :(得分:0)
当您使用memcpy
时,有必要设置正确的缓冲区大小,因为recv
只会将recvbuf
的数据放入当前可用的数据中,直到您的数据为止指定大小MAX_PACKET
。即使在另一端你正在进行send(sock,sendbuf,MAX_PACKET,0);
(并且MAX_PACKET
在两个地方都具有相同的值)。
您的代码唯一有意义的情况是,如果您使用UDP(SOCK_DGRAM
)并且所有数据报的大小都为MAX_PACKET
。
答案 4 :(得分:0)
你需要声明inbuffer至少与MAX_PACKET的大小一样多的字节 char * inbuffer = new char [MAX_PACKET];
并在每个recv()之前放置 memset的(inbuffer,0,MAX_BUFFER); 将缓冲区归零,这样你就不会错误地看到前一个数据包的尾端,你收到两个数据包,其中第二个数据包比第一个数据包短。
如果您的传入数据包没有唯一的终止字节,即'\ r' 你需要添加 int recvbytes; recvbytes = new recv(...) 因为recv返回线路上接收的字节数