重新启动套接字时地址已被使用
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
中找到完整的解释
我在 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
中找到完整的解释