c - 读取/写入在我的 TCP 代码中不起作用

标签 c networking tcp tcpclient tcpserver

我有一个基本的 TCP 客户端/服务器程序。

我在客户端和服务器端都有一个读写方法。我第一次运行它时它工作得很好,但是当它再次运行时(它在一个循环中)它没有读入任何东西。

void printout(int newsockfd, char buffer) {
n = write(newsockfd, a2, 256);
n = write(newsockfd, a3, 256);
n = write(newsockfd, a4, 256);
n = write(newsockfd, a5, 256);
n = write(newsockfd, a6, 256);
}

在服务器中

void printout(char buffer[], int sockfd) {
bzero(buffer, 256);
n = read(sockfd, buffer, 256);
printf("%s\n", buffer);
n = read(sockfd, buffer, 256);
printf("%s\n", buffer);
n = read(sockfd, buffer, 256);
printf("%s\n", buffer);
n = read(sockfd, buffer, 256);
printf("%s\n", buffer);
n = read(sockfd, buffer, 256);
printf("%s\n", buffer);
}

a2、a3、a4、a5 和 a6 是字符串。第一次运行时,它会正确打印所有内容。第二次,它什么也没打印出来,只是一堆空行。当我测试找出缓冲区是什么时,我得到了它的“”。您知道问题出在哪里或我该如何解决吗?

最佳答案

很难查明问题所在,因为您没有向我们展示循环。

但是,突然出现的一件事是您似乎期望对 write() 的每次调用都会与对 read() 的调用相匹配。这不是 TCP 的工作方式:数据包获取片段,您可以获得部分读取等。换句话说,TCP 是一个 stream protocol。而不是面向消息的。

特别是,您应该准备好处理 read() 返回少于 256 字节的情况。您的任何 read() 调用都可能随时发生这种情况。

此外,由于您将 256 字节的 block 视为 C 字符串,因此谨慎的做法是让服务器附加其自己的 NUL 终止符,而不是依赖客户端提供终止符。

关于c - 读取/写入在我的 TCP 代码中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9006335/

相关文章:

c - 如果/或 % 运算符的一个或两个操作数是负数,结果是否将由实现定义?

c - 有效地从 CSV 中读取特定行,C

java - Firebase 云函数更改超时

linux - 在 Linux 机器上运行 whois -h 时识别 IP 地址

c++ - 最大 TCP 连接数

performance - 当我的 Erlang TCP 代理收到许多并发请求时,为什么性能会下降那么多?

c++ - 函数指针总是初始化为 NULL 吗?

在C中将输入复制到输出而没有不必要的空格

java - 双向 UDP 组播

c# - 检测关闭的网络连接