从套接字读取缓冲区

REA*_*EE 1 c sockets buffer

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

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

在客户端

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

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

printf("%d READ vs %d buffer strlen \n", byteRead, strlen(buffer))
Run Code Online (Sandbox Code Playgroud)

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

任何的想法??

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

Art*_*ius 17

recv不会在字符串的末尾放置一个空终止符(虽然printf %s假设有一个).

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


And*_*ack 5

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

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

  1. 分配buffer大小MAXBUF + 1.+1将用于额外的NULL字符.
  2. 紧接在之前printf,添加一个空字符buffer[bytesRead].

所以告诉所有人:

buffer = malloc((MAXBUF + 1) * sizeof(char));          // NEW

while((byteRead = recv(ssock, buffer, MAXBUF, 0)) > 0)
{
    if(byteRead <= 0)
        break;
    else {
        buffer[bytesRead] = '\0';                      // NEW
        printf("%s", buffer);
    }
}
Run Code Online (Sandbox Code Playgroud)