【问题标题】:Address already in use when restarting socket重新启动套接字时地址已在使用中
【发布时间】:2022-01-07 11:14:25
【问题描述】:

我有以下 Socket 服务器可以在 Raspberry 中运行。

我可以连接到它,发送命令,它会回复命令。

现在我希望,当我发送命令 RESET 时,Socket 断开连接,Raspberry 返回到侦听状态,接受新连接。

但是,地址似乎没有正确释放,操作系统抛出“地址已在使用”异常。

Reconnecting....
OSError: [Errno 98] Address already in use


import socket
class SocketController:
    def __init__(self):
        self.s = None
        self.conn = None
        self.address = None

    def connect(self):
        host = ''
        port = 5560
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.bind((host, port))
        self.s.listen(1)
        self.conn, self.address = self.s.accept()
        

    def disconnect(self):
        self.conn.close()
        self.s.close()

    def rx(self):
        data = self.conn.recv(1024).decode('utf-8')
        if data == "RESET":
            self.disconnect()
            print("Reconnecting....")
            self.connect()
        else:
            self.conn.sendall(str.encode(data))

if __name__ == '__main__':
    s = SocketController()
    s.connect()
    while True:
        rxData = s.rx()

关闭连接并重新开始收听的正确方法是什么?

【问题讨论】:

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


    【解决方案1】:

    您应该告诉在处理结束之前重复使用套接字,因为它被标记为已使用。

    您可以通过在创建套接字之后和bind 之前添加它来轻松做到这一点:

    self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    

    你可以在这个comment找到完整的解释

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      相关资源
      最近更新 更多