套接字程序崩溃后无法绑定地址
如果我的程序在关闭一个网络连接之前崩溃,下次再运行的时候,就会出现这样的错误:
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
的意思是你希望无论如何都能使用相同的监听端口。