【问题标题】:How to stop a TCPServer, how to remove TIME_WAIT sockets如何停止 TCPServer,如何删除 TIME_WAIT 套接字
【发布时间】:2013-10-15 10:23:53
【问题描述】:

我写了我的两个类

class RequestHandler(http.server.SimpleHTTPRequestHandler):

class Server(socketserver.TCPServer):

这样一个独特的服务器就可以处理常规的浏览器、ajax 和 websocket 请求。 它工作正常。

我只是找不到终止服务器的方法。所以我终止了这个进程。

[编辑] 当服务器收到来自浏览器的关闭请求时,我需要关闭它。我尝试将self.__shutdown_request设置为True,但没有成功。

另外,在我关闭浏览器并终止进程后,netstat 告诉我有一些套接字 仍然使用服务器的端口,处于 TIME_WAIT 状态。所以我必须等他们死掉才能再次使用同一个端口。

如何终止服务器?

有没有办法移除这些套接字?

【问题讨论】:

  • 无法帮助您解决第一个问题,但为了避免套接字在 TIME_WAIT 状态下徘徊,您可以将 SO_LINGER ON 设置为超时 0,如下所示stackoverflow.com/questions/6439790/…
  • @fvu 它有效。谢谢。

标签: python sockets ubuntu tcpserver


【解决方案1】:

也许你可以试试Server.shutdown的方法来关闭服务器。正如 Python 文档所解释的,此方法告诉 Server.serve_forever 循环停止并等到它停止。 顺便说一句,虽然您可以设置 SO_LINGER ON 以避免 TCP 套接字的 TIME_WAIT 状态,但不鼓励这样做。另一种方法是在绑定服务器端口之前设置 SO_REUSEADDR。

【讨论】:

    【解决方案2】:

    在终端窗口中使用以下命令终止 TCP 端口 28355 以停止 TIME_WAIT 套接字:

    npx kill-port 28355

    在我的 python 套接字服务器脚本中,我使用了以下几行:

    import os os.system("npx kill-port 28355")

    此命令解决了“地址已在使用”错误。这是我找到的所有其他解决方案中唯一解决该错误的解决方案,例如启用 SO_REUSEADDR 选项。

    【讨论】:

      猜你喜欢
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多