【问题标题】:how to deal with a Server close TCP如何处理服务器关闭 TCP
【发布时间】:2010-11-27 07:02:07
【问题描述】:

现在我有一个简单的 TCP 服务器/客户端。我进行了设置,以便每当客户端连接时,它都会被 forked() 并且连接本身被放入无限循环中,以便连接保持打开状态。服务器正在从客户端接收信息,我检查以确保接收到的字节数 > 0。到目前为止,这在确定客户端是否已断开连接方面运行良好。但是如果服务器断开连接,客户端也会关闭,但不会设置 errno。如何检查以确保服务器仍然连接?

【问题讨论】:

  • 你的Q不是很清楚。是否要确保服务器在将信息传输到客户端时保持连接?
  • 你是在问如何判断 TCP 连接的远端是否已经关闭?
  • 是的,如果服务器随机断开连接,我想知道客户端该怎么做。

标签: c unix tcp client-server


【解决方案1】:

当另一端断开连接时,套接字将变为可读(对套接字的读取不会阻塞)并且read() 将返回0。这是检测断开连接的常用方法(听起来您已经在服务器端执行此操作)。

如果您在write() 中被阻止或尝试在另一端关闭的套接字上使用write,您的进程将收到SIGPIPE 信号,write 将返回-1 和errno设置为EPIPE。

SIGPIPE 的默认操作是终止进程,因此如果您没有更改它,您的客户端将在尝试写入已消失的服务器时死掉。

【讨论】:

  • 就在我阅读这个答案之前,我记得通过 gdb 运行它并看到它是 sigpipe。我会在信用到期的地方给你信用。谢谢!
猜你喜欢
  • 2023-03-07
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 2016-09-12
相关资源
最近更新 更多