从套接字读取缓冲区

时间:2010-06-19 07:58:46

标签: c sockets buffer

我在c中编写简单的服务器/客户端,其中server临时存储来自客户端的消息,并在客户端请求时检索它。

问题是当客户端从服务器接收消息时,缓冲区行为有点奇怪。 我做的所有内容都是从服务器接收并在屏幕上打印,但不知何故缓冲区被覆盖超过最大缓冲区大小

在客户端

while((byteRead = recv(ssock, buffer, MAXBUF, 0)) > 0)
{
   if(byteRead <= 0)
       break;
    printf("%s", buffer);
}

其中MAXBUF是256.它保持包含一些垃圾,所以我检查了缓冲区中的字符串大小 并且令人惊讶地

printf("%d READ vs %d buffer strlen \n", byteRead, strlen(buffer))

告诉我byteRead是256但缓冲区的字符串长度是262。

任何想法??

服务器端的P.s,它正确读取文件并将其发送到套接字。

3 个答案:

答案 0 :(得分:16)

recv不会在字符串的末尾放置一个空终结符(而printf %s假设有一个)。

您必须使用byteRead来确定字符串的长度。如果要使用printf之类的函数,请添加空终止符,但要确保即使在最大大小读取时,缓冲区也有空间。

答案 1 :(得分:5)

这里的问题是buffer不是由recv()以NULL结尾。实际上,recv仅将原始套接字数据放入缓冲区。如果它接收到256字节的数据,那么之后的任何内容都可能是空字符(例如,它在您的服务器上)或者它可能是其他东西(就像它在您的客户端上)。这是程序执行的一个神器,而不是你如何编程它。

解决此问题的最简单,最快捷的方法:

  1. 分配大小为buffer的{​​{1}}。 +1将用于额外的NULL字符。
  2. MAXBUF + 1之前,在printf添加空字符。
  3. 所以告诉所有人:

    buffer[bytesRead]

答案 2 :(得分:1)

strlen()查找最近的NULL终止符,就像传统的C字符串一样。

recv()与null终止符无关,也不会添加一个。因此,strlen调用是错误的,甚至可能会因未经授权的读取而导致程序崩溃。