我对linux上的c语言套接字编程有疑问。
当我的客户端程序连接到服务器程序时,read()函数中有时会出现未识别的错误。
我不确定是什么情况会导致这个问题。
看起来像无限循环。程序停在该地方,任何事情都会发生。
即使我像这样编写代码
int message = 1;
while(message > 0){
printf("READ ERROR");
message = read(sockfd, recvBuff, sizeof(recvBuff));
}
它打印任何东西!!
我认为,如果出现错误,应至少打印一次READ ERROR。
为什么会出现这种情况?
答案 0 :(得分:1)
或者:
read()
返回1,因为只有一个字符可用(原始代码)errno
中可用,并且可以perror()
打印。这三个条件中只有一个是错误,而错误是错误的。
我认为,如果出现错误,应至少打印一次READ ERROR。
没有。只有在读取了某些内容时才会输入循环,在这种情况下,不会读取错误。因此,在循环中打印消息没有任何意义。
答案 1 :(得分:0)
仔细阅读read(2),socket(7)和Advanced Linux Programming
作为Jesferman answered,您的while
应为while(message>0)
。我认为你确实纠正了这一点。
在EOF上(即远程主机关闭或shutdown(2)套接字),read
可以返回0.
read
也可能失败(返回-1),然后使用errno(3)检查perror(3)。
如果没有什么可读的话,read
会阻止。您可能希望在read
之前使用poll(2)。
此外,您忘记使用printf
结束\n
格式(或致电fflush(3) ...),因此READ ERROR
很可能正在{ {1}}的缓冲区。请记住,stdout
是缓冲IO。另请参阅setvbuf(3)。
答案 2 :(得分:0)
问题是while
条件。你的代码没有进入内部,因为消息不大于1,但恰好是1,所以条件不是真的,永远不会进入while循环