在TCP套接字绑定

时间:2017-08-06 18:06:08

标签: sockets tcp network-programming bind

编辑:我忘了关闭一组已接受的套接字。一旦我把它们全部拿走了,问题就消失了。这让我感到惊讶,因为close()在进程退出时隐式发生,我不认为隐式和显式关闭的发生方式不同,但不知何故,写入和后续显式关闭的显式关闭组合起了作用。这里有一个谜要解决,但我不打算解决它;我重新开始工作了。我会在这里留下原始问题,好奇:

我意识到问题已经被提出,但我需要一个更精确的答案。答案可能是“你不能”,但我需要明确说明。

我有一个应用程序(运行在树莓派上的wheezy),它充当服务器,接受TCP套接字连接。因此,它开始执行socket()/setsockopt(listener_, SOL_SOCKET, SO_REUSEADDR...)/bind()/listen()。此后不久,有一个循环在进行accept() s。一切都很标准。一般来说这很好。

但是每隔一段时间我就会更新服务器可执行文件,然后编写它来检测它,关闭自己,让脚本重新启动新版本。当它关闭时,它会在侦听器套接字上执行close()。它还会对从accept接收的所有相关套接字进行写入关闭。

当它重新启动时,它总会遇到绑定失败。该脚本尝试反复重启,延迟5秒,但它仍处于该状态,一遍又一遍地失败。

由于各种原因,服务器立即重启非常重要。它控制硬件和长时间停机是不可接受的。我可以通过重新启动pi来解决它,但这需要很长时间才能成为一个可行的解决方案。

因为让服务器出口是我可以控制的事件,在我看来,在exit()之前我应该​​在服务器端做一些事情,以缓解这个问题。但是什么?

我可以想到黑客的解决方法。我可以依次尝试绑定到每个端口,然后教所有(许多不同的)客户端在连接时尝试相同范围的端口。那很痛苦。它真的是唯一的选择吗?

0 个答案:

没有答案