重新启动套接字时地址已被使用

Address already in use when restarting socket

我在 Raspberry 中 运行 有以下套接字服务器。

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

现在我希望当我发送命令 RESET 时,Socket 断开连接并且 Raspberry returns 进入监听状态,接受新连接。

然而,地址似乎没有正确释放,OS 抛出“地址已在使用”异常。

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()

关闭连接并返回监听的正确方法是什么?

你应该告诉重用套接字,因为它被标记为已使用,直到你的过程结束。

您可以通过在创建套接字之后和 bind:

之前添加它来轻松地做到这一点
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

您可以在此 comment

中找到完整的解释