套接字程序崩溃后无法绑定地址

15 投票
3 回答
8451 浏览
提问于 2025-04-15 19:19

如果我的程序在关闭一个网络连接之前崩溃,下次再运行的时候,就会出现这样的错误:

socket.error: [Errno 48] Address already in use

换一个端口就能解决这个问题。

有没有办法避免这种情况发生呢?为什么会出现这个问题呢?(程序退出的时候,难道这个连接不应该被自动处理掉并关闭吗?)

3 个回答

2

其他遇到这个错误的人可能是因为某个端口被其他程序占用了。所以你可以检查一下这个端口是否被其他程序使用。如果是的话,可以换一个端口来运行你的程序,或者结束掉那些占用端口的程序。

3

大多数操作系统在程序没有正确关闭socket的时候,关闭这个socket可能需要长达2分钟。我在使用C语言编写程序时遇到过很多次这种情况,尤其是程序崩溃(SEGFAULT)而我又没有处理这个错误的时候。

补充说明:
感谢ephemient指出了RFC 793 (TCP),它定义了这个超时时间。

24

在你的监听套接字上使用 .setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

如果你搜索这些词汇,你会找到很多解释为什么这样做是必要的。简单来说,当你的第一个程序关闭后,操作系统会把之前的监听套接字保留在一种关闭状态中,持续一段 TIME_WAIT 的时间。使用 SO_REUSEADDR 的意思是你希望无论如何都能使用相同的监听端口。

撰写回答