如果我的 C 程序使用套接字、绑定到localhost:9025
、交换一些数据、被手动杀死并重新启动,它有时会崩溃并出现以下错误:
地址已在使用中。
我试图寻找“使用端口的 pid”的所有 SE 推荐软件都未能返回任何进程 ID,因此我假设当时没有使用端口的进程,9025
应该是这种情况。
尽管如此,从我从对类似问题的评论中收集到的信息来看,在我看来,当且仅当进程使用该特定地址时,“地址”才“已在使用”。那为什么这是假的呢?
现在我假设操作系统会跟踪正在使用的地址和未使用的地址,但情况是这样吗?如果是这样,我会很高兴你能告诉我如何纠正它,因为我对这个问题的最佳解决方案是“等待一段不确定的时间”。
编辑:我使用 Linux 5.2.2-arch1-1-ARCH x86_64
您可能重新启动程序太快,或者程序没有关闭套接字。
即使在套接字关闭后,Linux 也会将连接保持在边缘状态一段时间,但会阻止任何其他连接被同一四组“源地址、源端口、目标地址、目标端口”接受。
解决方案是在程序中使用 setsockopt设置 socket 选项, 如下所示: