我有一个基本的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是字符串。它第一次运行时会正确打印所有内容。第二次,它什么都没打印出来,只是一堆空行。当我测试找出什么缓冲区时,我得到了它的“”。你知道问题是什么或我如何解决它?
答案 0 :(得分:3)
很难确定问题,因为你没有向我们展示循环。
然而,跳出来的一件事是,您似乎期望每次拨打write()
都会与拨打read()
相匹配。这不是TCP的工作方式:数据包获取片段,您可以获得部分读取等。换句话说,TCP是stream protocol而不是面向消息的。
特别是,您应该准备好处理read()
返回少于256个字节的情况。您可以随时拨打read()
来电。
此外,由于您将256字节的块视为C字符串,因此服务器附加其自己的NUL终结符而不是依赖客户端来提供它是明智的。
答案 1 :(得分:0)
打赌你的服务器对bind()
的呼叫在第二次运行时失败了。所以客户致电connect()
。有错误处理吗?
修改
特别是在进行简单的TCP示例时,服务器第一次运行在服务器终止后“保持”一段时间并不常见。当您再次运行服务器时,bind()
将失败,因此您的服务器进程将无法listen()
或accept()
新连接。解释细节是另一个问题的主题。
由于您的服务器实际上并不存在,{I}会在您的客户端上失败,从而使您无法连接套接字。并且来自该套接字的所有后续读取将立即失败,使connect()
包含全0。这可能是您所看到的行为的可能解释。
你可以解释这个解释吗?您是否检查buffer
和bind()
始终返回0?