c - 从套接字读取缓冲区

标签 c sockets buffer

我正在用 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。

有什么想法吗??

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

最佳答案

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

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

关于c - 从套接字读取缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3074824/

相关文章:

C 客户端/服务器套接字错误

c - C 中清除缓冲区的问题

java - Java : How do you get a Message. Builder 中的 Google Protobufs 来自 FieldDescriptor?

c - 填充 C 输出参数

c - 双指针c内存故障

c - 消息队列示例中的 realloc 或 free 错误

java - (Java, Socket) BufferedReader 阻塞线程,无法 .close()

c - 如何使用 C 在 Linux 中以原子方式和异步方式写入文件

java - JAVA 中的 SSL 套接字连接池

node.js - Node js中的十六进制到字符串和字符串到十六进制的转换