我可以在使用时间减少套接字地址吗?

时间:2017-10-24 12:22:04

标签: linux sockets raspberry-pi

我正在开发一个Raspberry Pi托管python asyncore服务器的项目,还有一些arduino通过LAN连接到它。我们的服务器几乎没有bug,但是当出现问题并且服务器崩溃时,重新启动服务器时它会说该地址正在使用中。我们编写了它,如果地址在使用中,它将继续重试,直到地址被释放,但这需要相当长的时间。

现在我听说您可以在Linux中设置地址之前编辑时间。 例如,在我的macbook上,套接字地址在10秒后被释放。 有人能指出我正确的方向吗?

2 个答案:

答案 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

  • SO_REUSEADDR
  • SO_REUSEPORT
  • SO_RCVTIMEO
  • SO_SNDTIMEO

答案 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中重用本地套接字,而不等待其自然超时到期。

->