recv()结果必须等于缓冲区长度吗?

时间:2013-06-20 21:52:54

标签: c++ winsock recv

int resp = recv(s, buf, len, flags);

if(resp == 18) {
    char data[18];
    strcpy(data, buf);
    ...
}

我希望strlen(数据)等于18,但它不是。我错过了什么?

2 个答案:

答案 0 :(得分:3)

如果您的data包含零字节\0,那么strlen只会为您提供到终结符的字符串长度。如果data没有终结符,那么strlen将继续搜索它碰巧遇到的任何内存。这通常用于buffer overflow attacks

答案 1 :(得分:2)

我认为Joe试图说的是你的代码不是防弹的,从读取的数字字节开始并将数据复制到数据数组中。

int resp = recv(s, buf, len, flags);
if(resp > 0) 
{
  // ! This code assumse that all the data will fit into 18 bytes.
  char data[18];  
  memset(data, 0, sizeof(data));  

  // ! As Joe warned above, this code assumes there's a null terminating 
  // ! character in the buf you received.

  strcpy(data, buf);  // consider memcpy if binary data (i.e. not strings)
}