1

我有一个基本的 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 是字符串。第一次运行时,它会正确打印所有内容。第二次,它什么也没打印出来,只是一堆空白行。当我测试找出缓冲区是什么时,我得到了它的“”。你知道问题是什么或我该如何解决?

4

2 回答 2

3

由于您没有向我们展示循环,因此很难查明问题。

但是,跳出来的一件事是,您似乎期望每次调用 towrite()都会与调用匹配read()。这不是 TCP 的工作方式:数据包会获得碎片,您可能会获得部分读取等。换句话说,TCP 是一种协议,而不是面向消息的协议。

特别是,您应该准备好处理read()返回少于 256 个字节的情况。这可能随时发生在您read()的任何通话中。

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

于 2012-01-25T16:38:24.077 回答
0

' 将打赌你的服务器调用bind()失败在第二次运行。所以客户打电话给connect(). 对那些有错误处理吗?

编辑

尤其是在做简单的 TCP 示例时,第一次运行服务器时在服务器死机后“保持”端口一段时间的情况并不少见。当您第二次运行服务器时,bind()将失败,因此您的服务器进程将无法listen()accept()新的连接。解释细节是另一个问题的主题。

由于您的服务器实际上并不存在,connect()因此您的客户端将失败,从而为您留下一个未连接的套接字。来自该套接字的所有后续读取都将立即失败,留下buffer全 0。这可能是对您所看到的行为的解释。

你能排除这个解释吗?您是否检查bind()connect()始终返回 0?

于 2012-01-25T16:40:42.373 回答