避免"connection reset by peer"错误的正确关闭套接字的方法

3
我有一个客户端/服务器应用程序,它持续维护一个套接字。当客户端退出时,它会向服务器发送一个“退出”消息,然后关闭套接字并清理。当服务器收到此消息时,它会清理并关闭套接字,不回复该消息。
我经常看到服务器记录“连接被对等方重置”的错误,而没有任何用户投诉,我想这必须是我的注销序列中偶发的时间问题。当最终用户抱怨他们的连接实际上被断开时,我也会看到相同的错误,因此我想知道如何区分这些情况 - 或者更好的是,如何在正常情况下防止虚假的“连接重置”情况。
我猜测在某些情况下,在收到“退出”消息之前(或期间),服务器会受到关闭的套接字的影响。这可能吗?在实际关闭套接字之前,是否有正确的顺序让服务器知道客户端即将终止的方法?有一种检查最后一条消息是否在关闭之前传递的方法吗?
谢谢, 罗布
2个回答

3

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - littlenoodles
1
有一种可能性。我的服务器在每隔大约2分钟的闲置后会发送偶尔的“保持活动”应用程序消息(不是TCP保持活动)。我想可能存在一个时间窗口,客户端试图在没有读取已经在传输中的保持活动的情况下进行签退(发送/关闭)。这会导致服务器收到连接重置错误吗? - littlenoodles
已经很久了,我不太记得poll()select()的比较,但我的想法是客户端没有进行shutdown()就进行了close(),所以poll()检查套接字(在其一侧标记为打开)以获取输入,并惊讶地发现连接被重置。保持活动状态可能与此有关,但不应该,因为据我记得,这只是在关闭之前要读取的一个数据包。 - John C

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接