我意识到问题已经被提出,但我需要一个更精确的答案。答案可能是“你不能”,但我需要明确说明。
我有一个应用程序(运行在树莓派上的wheezy),它充当服务器,接受TCP套接字连接。因此,它开始执行socket()/setsockopt(listener_, SOL_SOCKET, SO_REUSEADDR...)/bind()/listen()
。此后不久,有一个循环在进行accept()
s。一切都很标准。一般来说这很好。
但是每隔一段时间我就会更新服务器可执行文件,然后编写它来检测它,关闭自己,让脚本重新启动新版本。当它关闭时,它会在侦听器套接字上执行close()。它还会对从accept接收的所有相关套接字进行写入关闭。
当它重新启动时,它总会遇到绑定失败。该脚本尝试反复重启,延迟5秒,但它仍处于该状态,一遍又一遍地失败。
由于各种原因,服务器立即重启非常重要。它控制硬件和长时间停机是不可接受的。我可以通过重新启动pi来解决它,但这需要很长时间才能成为一个可行的解决方案。
因为让服务器出口是我可以控制的事件,在我看来,在exit()
之前我应该在服务器端做一些事情,以缓解这个问题。但是什么?
我可以想到黑客的解决方法。我可以依次尝试绑定到每个端口,然后教所有(许多不同的)客户端在连接时尝试相同范围的端口。那很痛苦。它真的是唯一的选择吗?