关闭插座以避免"connection reset by peer"的正确方法



我有一个客户端/服务器应用程序,它可以持续维护套接字。当客户端注销时,它会向服务器发送一条"注销"消息,然后关闭套接字并进行清理。服务器在接收到该消息时会清理并关闭套接字,并且不会回复该消息。

我经常看到服务器记录"对等连接重置"错误,而最终用户没有任何抱怨,我认为这一定是我注销序列中偶尔出现的时间问题。当最终用户抱怨他们的连接实际上被断开时,我确实看到了同样的错误,所以我想知道如何区分这些情况,或者更好的是,如何在正常情况下防止虚假的"连接重置"情况。

我猜在某些情况下,服务器在收到"注销"消息之前(或期间)会被关闭的套接字击中。这可能吗?在关闭套接字之前,是否有一个正确的顺序可以让服务器知道客户端即将终止?有什么方法可以检查最后一条消息是否在关闭前送达?

谢谢,Rob

shutdown(s, SHUT_RDWR)函数应该可以解决您的问题。这份文件中有更完整的解释。

这通常意味着您已经写入了对等方已经关闭的连接,或者在没有读取所有未决传入数据的情况下关闭了连接。换句话说,是应用程序协议错误。

最新更新