如何检测TCP套接字断开(使用C Berkeley套接字)

Ayo*_* M. 9 c sockets network-programming tcp

我正在使用循环从交流Berkeley套接字读取消息,但我无法检测套接字何时断开连接,所以我接受新的连接.请帮忙

while(true) {
            bzero(buffer,256);
            n = read(newsockfd,buffer,255);
            printf("%s\n",buffer);        
}
Run Code Online (Sandbox Code Playgroud)

Bru*_*uno 17

您可以通过写入来检测套接字连接的唯一方法.

获取错误read()/recv()将指示连接已断开,但在读取时未收到错误并不意味着连接已启动.

您可能有兴趣阅读本文:http: //lkml.indiana.edu/hypermail/linux/kernel/0106.1/1154.html

此外,使用TCP Keep Alive可以帮助区分非活动连接和断开连接(通过定期发送内容,即使应用程序没有要发送的数据).

(编辑:删除了@Damon指出的错误句子,谢谢.)

  • 轻微校正:_"读取0字节也可能只是意味着远程方没有任何要发送的东西,而不一定是一个问题"_ - 接收0字节意味着另一端执行干净的连接关闭.如果另一端没有要发送的内容,如果套接字是非阻塞的,则会获得EAGAIN或EWOULDBLOCK,或者在数据到达之前它会阻塞.检测连接断开的一种方法是在epoll上注册EPOLLHUP和EPOLLRDHUP.这不是100%可靠,但会报告有序停机,半停机和丢失的Keepalive. (11认同)
  • @Pacerier,没有得到任何东西之间没有区别,因为没有发送任何东西,因为链接被破坏没有得到任何东西.(事实上​​这是一般原则.如果你早上没有收到任何信件,要么没有人给你发送任何信件,要么邮政系统不起作用:你只能通过尝试发送信息找出原因.发布,或多或少.)这就是使用TCP连接时需要处理超时的原因.一个突然关闭的连接根本不会发送任何东西告诉你它的结束,因为它不能. (2认同)