我正在开发一个Raspberry Pi托管python asyncore服务器的项目,还有一些arduino通过LAN连接到它。我们的服务器几乎没有bug,但是当出现问题并且服务器崩溃时,重新启动服务器时它会说该地址正在使用中。我们编写了它,如果地址在使用中,它将继续重试,直到地址被释放,但这需要相当长的时间。
现在我听说您可以在Linux中设置地址之前编辑时间。 例如,在我的macbook上,套接字地址在10秒后被释放。 有人能指出我正确的方向吗?
答案 0 :(得分:1)
尝试使用shutdown而不是close方法(如果是这种情况)立即执行释放资源:https://docs.python.org/2/library/socket.html#socket.socket.shutdown http://www.unixguide.net/network/socketfaq/2.6.shtml
此外,来自套接字调用的以下设置可能会有所帮助http://man7.org/linux/man-pages/man7/socket.7.html:
答案 1 :(得分:0)
在执行之间延迟太短的情况下多次运行示例可能会导致此错误:
socket.error: [Errno 98] Address already in use
这是因为先前的执行使套接字处于TIME_WAIT状态,并且无法立即重用。
要设置套接字标志,为了防止这种情况,socket.SO_REUSEADDR:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
SO_REUSEADDR标志告诉内核在TIME_WAITstate中重用本地套接字,而不等待其自然超时到期。
源->