我正在使用C ++ TCP服务器 - 多客户端程序。问题是为什么write()的返回值可能是一个大于0的数字,即使客户端已断开连接(在这种情况下,我使用localhost测试并按Ctrl + C,因此其中一个客户端程序结束,但它强制关闭主程序。)
有一些问题: 1.如何检测写入客户端是否失败 2.为什么write()的返回值在失败时不是< = 0? 3.如何防止客户端程序关闭导致服务器程序强制关闭?
答案 0 :(得分:0)
这是TCP协议的固有特性。在write()中成功并不意味着消息已被读取(甚至到达)服务器。如果不了解有关TCP堆栈实现的太多细节,请接受这一点作为生活中的事实。
如果您想确保已阅读该邮件,则必须在顶部介绍您自己的确认协议。缺乏认可意味着信息丢失了。
在写入已关闭的套接字时回答有关崩溃的问题:
应用程序终止,因为默认情况下写入关闭的套接字会导致SIGPIPE信号。有两种方法可以防止这种情况:
write()
错误。setsockopt()
在套接字上设置SO_NOSIGPIPE,或使用MSG_NOSIGNAL作为send()
的标记。