memcpy大小值

时间:2012-05-13 16:51:13

标签: c++ memory

我将使用recv()复制我收到的数据,并且输入/输出缓冲区的最大大小为MAX_PACKET。

使用固定大小MAX_PACKET复制它是否安全?当我使用memcpy时,是否有必要设置正确的缓冲区大小?

recv(sock,recvbuf,MAX_PACKET,0);
memcpy(inbuffer,recvbuf,MAX_PACKET);

5 个答案:

答案 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返回线路上接收的字节数