如果我的 C 程序使用套接字,绑定到localhost:9025
,交换一些数据,被手动终止并重新启动,它有时会崩溃并出现以下错误:
地址已被使用。
我尝试使用所有 SE 推荐的软件来查找“使用端口的 pid”,但都未能返回任何进程 id,因此我假设当时没有使用端口的进程9025
,事实应该如此。
尽管如此,从我收集到的类似问题的评论来看,我认为当且仅当某个进程使用该特定地址时,“地址”才为“已在使用中”。那么为什么这是错误的呢?
现在我假设操作系统会跟踪哪些地址正在使用,哪些地址没有使用,但情况真的是这样吗?如果是这样,我希望你能告诉我如何纠正它,因为我对这个问题的最佳解决方案是“等待一段不确定的时间”。
编辑:我使用 Linux 5.2.2-arch1-1-ARCH x86_64
答案1
您可能重新启动程序的速度太快,或者程序没有关闭套接字。
即使在套接字关闭之后,Linux 仍会将连接保留一段时间,但会阻止接受任何其他针对相同四元组“源地址、源端口、目标地址、目标端口”的连接。
解决方法是在程序中设置套接字选项 设置sockopt 像这样:
setsockopt(socket,SOL_SOCKET,SO_REUSEADDR ... )