Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 关闭插座的正确方法,以避免;“对等端重置连接”;_Sockets - Fatal编程技术网

Sockets 关闭插座的正确方法,以避免;“对等端重置连接”;

Sockets 关闭插座的正确方法,以避免;“对等端重置连接”;,sockets,Sockets,我有一个客户端/服务器应用程序,可以持续维护套接字。当客户端注销时,它会向服务器发送一条“注销”消息,然后关闭套接字并进行清理。服务器在收到此消息时会清理并关闭套接字,并且不会回复此消息 在相当经常的基础上,我看到服务器在没有最终用户抱怨的情况下记录了“由对等方重置连接”错误,我认为这一定是我注销序列中偶尔出现的时间问题。当最终用户抱怨他们的连接实际上被断开时,我确实看到了同样的错误,所以我想知道如何区分这些场景之间的区别——或者更好的是,如何在正常情况下防止虚假的“连接重置”场景 我猜在某些情

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

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

我猜在某些情况下,服务器在收到“注销”消息之前(或期间)被关闭的套接字击中。这可能吗?在实际关闭套接字之前,您是否应该遵循适当的顺序让服务器知道客户端即将终止?有什么方法可以检查最后一封邮件是否在关闭前送达

谢谢,
Rob

该功能应能解决您的问题。在中有一个更完整的解释。

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

很有趣,但不确定情况是否相同。该文档显示客户端在服务器关闭套接字后调用recv()时出错。我得到的是服务器上的“连接重置”错误,而不是客户端。客户端调用send()然后关闭(),服务器有时会出现“连接重置”错误。我的服务器(在AIX上)使用poll()函数处理多个套接字,连接重置错误响应poll()。如果首先收到了客户端的“签准”消息,则服务器会读取该消息,关闭套接字并将其从传递给poll()的列表中删除。不过有一种可能性。我的服务器每隔2分钟左右不活动时,会偶尔发送“keepalive”应用程序消息(不是TCP keepalives)。我想可能会有一个时间窗口,在这个时间窗口中,客户端尝试注销(发送/关闭),而不读取已经在传输中的keepalive。这会导致服务器出现连接重置错误吗?这已经很长时间了,我不记得
poll()
select()
的确切比较,但我想的是客户端
close()
没有
shutdown()
,因此
poll()
检查套接字(在其一侧标记为open)对于输入和连接重置感到意外。keepalive可能是相关的,但不应该是相关的,因为据我记忆所及,它只是一个在结束之前阅读的数据包。