【问题标题】:socket.SO_REUSEADDR still puts connection on TIME_WAITsocket.SO_REUSEADDR 仍将连接置于 TIME_WAIT
【发布时间】:2021-01-05 16:49:05
【问题描述】:

我正在尝试实现一个分布式生产者消费者的简单示例,并且在测试时,我总是收到以下错误:

OSError: [WinError 10048] 每个套接字地址(协议/网络地址/端口)通常只允许使用一次

尽管许多帖子声称绑定之前的s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 允许我忽略 TIME_WAIT,但我在尝试第二次连接时仍然遇到同样的异常。

server.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 4330))
s.listen()

s.accept()
s.close()

client.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 4334))

s.connect((myaddress, 4330))
s.close()

【问题讨论】:

    标签: python python-3.x windows sockets


    【解决方案1】:

    当客户端套接字在本地关闭时,如果您尝试再次连接到相同的目的地,并重新创建具有相同 ip:port 的套接字,TIME_WAIT 将生效,而不管SO_REUSEADDR

    为避免这种情况,您可以让服务器先启动close()

    更多详情请参考this answerthis article

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多