C ++ TCP连接意外write()结果

时间:2015-12-02 14:45:21

标签: tcp

我正在使用C ++ TCP服务器 - 多客户端程序。问题是为什么write()的返回值可能是一个大于0的数字,即使客户端已断开连接(在这种情况下,我使用localhost测试并按Ctrl + C,因此其中一个客户端程序结束,但它强制关闭主程序。)

有一些问题: 1.如何检测写入客户端是否失败 2.为什么write()的返回值在失败时不是< = 0? 3.如何防止客户端程序关闭导致服务器程序强制关闭?

1 个答案:

答案 0 :(得分:0)

这是TCP协议的固有特性。在write()中成功并不意味着消息已被读取(甚至到达)服务器。如果不了解有关TCP堆栈实现的太多细节,请接受这一点作为生活中的事实。

如果您想确保已阅读该邮件,则必须在顶部介绍您自己的确认协议。缺乏认可意味着信息丢失了。

在写入已关闭的套接字时回答有关崩溃的问题:

应用程序终止,因为默认情况下写入关闭的套接字会导致SIGPIPE信号。有两种方法可以防止这种情况:

  • 将SIGPIPE处理程序设置为SIG_IGN并处理write()错误。
  • 根据您的操作系统,使用setsockopt()在套接字上设置SO_NOSIGPIPE,或使用MSG_NOSIGNAL作为send()的标记。