socket编程read()函数错误为什么?

时间:2017-05-27 15:26:56

标签: c sockets tcp network-programming client-server

我对linux上的c语言套接字编程有疑问。

当我的客户端程序连接到服务器程序时,read()函数中有时会出现未识别的错误。

我不确定是什么情况会导致这个问题。

看起来像无限循环。程序停在该地方,任何事情都会发生。

即使我像这样编写代码

int message = 1;

while(message > 0){
    printf("READ ERROR");
    message = read(sockfd, recvBuff, sizeof(recvBuff));
}

它打印任何东西!!

我认为,如果出现错误,应至少打印一次READ ERROR。

为什么会出现这种情况?

3 个答案:

答案 0 :(得分:1)

或者:

  • read()返回1,因为只有一个字符可用(原始代码)
  • 它返回零,意味着对等方已断开连接
  • 它返回-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循环