C++;TCP连接意外的write()结果 我正在研究一个C++ TCP服务器-多客户端程序。问题是,为什么即使客户端已断开连接,write()的返回值也可能大于0(在本例中,我使用localhost进行测试,然后按Ctrl+C,这样一个客户端程序将结束,但它会强制主程序关闭)
有一些问题: 1.如何检测写入客户端是否失败C++;TCP连接意外的write()结果 我正在研究一个C++ TCP服务器-多客户端程序。问题是,为什么即使客户端已断开连接,write()的返回值也可能大于0(在本例中,我使用localhost进行测试,然后按Ctrl+C,这样一个客户端程序将结束,但它会强制主程序关闭),tcp,Tcp,有一些问题: 1.如何检测写入客户端是否失败 2.为什么write()的返回值不是这是TCP协议的固有特性。write()成功并不意味着该消息已被服务器读取(甚至到达)。不必过多地讨论TCP堆栈实现的细节,只需接受这一事实即可 如果您想确保消息已被阅读,您必须在顶部引入您自己的确认协议。不知道就意味着信息丢失了 回答有关写入闭合套接字时崩溃的问题: 应用程序终止,因为默认情况下写入关闭的套接字会导致SIGPIPE信号。有两种方法可以防止这种情况: 将SIGPIPE处理程序设置为SIG\u IG
2.为什么write()的返回值不是这是TCP协议的固有特性。write()成功并不意味着该消息已被服务器读取(甚至到达)。不必过多地讨论TCP堆栈实现的细节,只需接受这一事实即可 如果您想确保消息已被阅读,您必须在顶部引入您自己的确认协议。不知道就意味着信息丢失了 回答有关写入闭合套接字时崩溃的问题: 应用程序终止,因为默认情况下写入关闭的套接字会导致SIGPIPE信号。有两种方法可以防止这种情况:
- 将SIGPIPE处理程序设置为SIG\u IGN并处理
错误write()
- 根据您的操作系统,可以使用
在套接字上设置SO_NOSIGPIPE,也可以使用MSG_NOSIGNAL作为setsockopt()
的标志send()