程序突然终止时保持活动的套接字
Posted
技术标签:
【中文标题】程序突然终止时保持活动的套接字【英文标题】:Sockets remaining active on abrupt termination of the program 【发布时间】:2012-05-17 16:48:19 【问题描述】:我正在使用标准的 WinSock 函数进行套接字通信,现在假设我创建了一个套接字并且我的程序突然终止了套接字是否有机会保持活动状态?
我尝试了一个小例子,第一次调用socket
API 返回4986
,在突然终止可执行文件后第二次调用socket
API 返回4946
但我仍然觉得如果没有关闭套接字,它会在一段时间内保持活动状态。
请帮我澄清我的疑问
【问题讨论】:
您通常可以通过setsockopt(SO_REUSEADDR)
解决此问题,以允许在此类垂死的套接字上重用地址
【参考方案1】:
在 linux 机器上,如果您使用程序打开套接字,然后不干净地关闭程序,即崩溃,套接字将保持打开状态。在这种情况下,操作系统会在经过一段时间后清理这些绑定的套接字(我不确定它有多长,我假设它指定了操作系统中的某个位置,不到 10 分钟)。
http://compgroups.net/comp.os.ms-windows.programmer.win32/bind-error-after-crash-ho/368539 我认为这意味着 WinSock 在您崩溃或忘记用您的应用程序关闭它们后确实保持打开状态。我不确定 Windows 如何处理这些打开的套接字,但我推断它类似于 linux 并在一段时间后关闭它们
【讨论】:
所以这也会影响进来的数据包..说在第一次调用中我收到第一个数据包然后在第二次调用中(重新启动后)它将返回第二个数据包?或我;;还是会再给第一个? 我不太明白你的问题。您的意思是如果应用程序在发送数据包后关闭,然后您想知道是否重新打开它是否会再次发送第一个数据包,或者只是跳到第二个数据包?我假设它会再次发送第一个数据包,因为它崩溃并且不知道它已经发送了第一个数据包。 考虑我是客户的情况。我连接到服务器并获取一些数据。现在我突然终止而没有清理。现在我重新启动可执行文件。有没有可能它会拿起旧的 Socket 连接并检索数据,或者它将是一个新的连接?我的疑问是我收到第一个数据包然后我重新启动,我想我正在收到第二个数据包,因为第一个连接没有终止这是真的吗? 这将取决于服务器如何发送数据包。如果它在您的客户端每次连接时发送相同系列的数据包,那么它将再次获得第一个数据包。但是,如果您的服务器每隔 x 时间发送一次新数据包,那么您将收到第二个数据包。您可以尝试实现某种数据包工具,例如en.wikipedia.org/wiki/Pcap,以查看正在向您的客户端发送哪些数据包。以上是关于程序突然终止时保持活动的套接字的主要内容,如果未能解决你的问题,请参考以下文章
在没有 VoIP iOS 的情况下保持 XMPP 套接字在后台活动
应用程序进入后台时如何保持 Swift Socket IO 运行?
即使应用程序已注册为 VOIP,iOS9 套接字连接也会在应用程序暂停时终止