【问题标题】:How to fix '[Errno 98] Address already in use' in Python如何在 Python 中修复“[Errno 98] 地址已在使用中”
【发布时间】:2019-10-27 13:22:52
【问题描述】:

我使用 DreamHost 作为我的 server.py 的托管提供程序。如果我在本地运行我的代码,setsockopt 函数成功地将参数 SOCKET_REUSEADDR 设置为 True,我可以有效地重用端口。但是当我在主机上运行 server.py 时,我收到错误 '[Errno 98] Address in use'

运行`ps aux | grep python' 并使用 kill -9 PID 手动关闭进程使我有可能在开始时重用端口。但这是否意味着 'socket.setsockopt' 不起作用?

server.py

host = 'Dreamhost_IP'
port = 33000
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server_socket.bind((host,port))

.
.
.
.
.

if __name__=="__main__":
    server_socket.listen(5)
    print('waitin for connections')
    accept_thread = threading.Thread(target = accept_connections)
    accept_thread.start()
    accept_thread.join()
    server_socket.close()

I'm expecting to be able to reuse the desired port by overriding the wait time with SO_REUSEADDR. If I use '127.0.0.1' as 'host' and 33000 as 'port', I can successfully rerun the server on that port.

【问题讨论】:

    标签: python-3.x sockets serversocket python-sockets


    【解决方案1】:

    SO_REUSEADDR 不允许您同时将两个东西绑定到同一个端口。它的主要功能是绕过套接字关闭后的等待期。如果你想一次绑定两个东西,你需要使用更强大的东西:SO_REUSEPORT

    【讨论】:

    • 直到现在我一直在阅读文档和示例,但在将 SO_REUSEADDR 更改为 SO_REUSEPORT 之后,我仍然收到相同的错误消息:server_socket.bind((host,port)) OSError: [Errno 98] Address already in use
    • @NikolaStoilov 嗯。同时设置两个标志会更好吗?
    • 我能够通过杀死正在运行的 python 进程使其工作(我猜有些在内存中将 REUSEADDR 标志设置为 true 并且必须刷新?)并使用 REUSEPORT 标志重新启动服务器.感谢您的帮助,约瑟夫,非常感谢! :)
    • @NikolaStoilov 如果我的回答解决了您的问题,请使用复选标记按钮接受。
    • 虽然例如在端口 33000 上运行服务器,但我可以连接多个客户端并在它们之间进行通信。但是在该端口上重新启动服务器后,在建立第一个连接后,我无法再连接任何客户端。它只是没有连接。杀死进程并重新启动脚本可以解决问题,但是如何避免杀死进程?
    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2015-06-04
    • 2020-05-18
    相关资源
    最近更新 更多