繁体   English   中英

从套接字读取缓冲区

[英]reading buffer from socket

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

问题是当客户端从服务器接收消息时,缓冲区有点奇怪。 我所做的全部与从服务器接收到的一样多,并且将其打印在屏幕上,但是不知何故,缓冲区被覆盖的程度超过了缓冲区的最大大小

在客户中

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。

任何想法??

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

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

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

这里的问题是buffer不是由recv()终止的。 实际上, recv仅将原始套接字数据放入缓冲区。 如果它接收256个字节的数据,则其后的内容可能是空字符(例如,在您的服务器上),也可能是其他字符(在您的客户端上)。 这是程序执行的产物,而不是您如何编程的产物。

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

  1. 分配大小为MAXBUF + 1 buffer +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);
    }
}

是。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM