Python 3.x 如果需要重复使用同一端口,如何正确关闭套接字?
我创建了一个服务器程序和一个客户端程序,其中我的目标是让客户端发送服务器TCP数据包。在我的例子中,客户机得到了服务器的IP地址和数据包应该发送到的端口。如果我第一次为特定端口运行服务器代码,服务器程序将搜索响应。如果我运行它两次或两次以上,就会得到错误“地址已在使用”。似乎插座没有正确关闭 如我的代码所示,我在程序结束时尝试了sock.shutdown()和sock.close(),但都没有成功。我也尝试过添加connection.close()和sock.setsockopt(),但是,我相信我可能混淆了Python2和Python3的语法。(我使用的是Python 3)添加或删除这些方法会导致相同的错误。我已经发布了下面的服务器代码以供参考Python 3.x 如果需要重复使用同一端口,如何正确关闭套接字?,python-3.x,sockets,tcp,server,Python 3.x,Sockets,Tcp,Server,我创建了一个服务器程序和一个客户端程序,其中我的目标是让客户端发送服务器TCP数据包。在我的例子中,客户机得到了服务器的IP地址和数据包应该发送到的端口。如果我第一次为特定端口运行服务器代码,服务器程序将搜索响应。如果我运行它两次或两次以上,就会得到错误“地址已在使用”。似乎插座没有正确关闭 如我的代码所示,我在程序结束时尝试了sock.shutdown()和sock.close(),但都没有成功。我也尝试过添加connection.close()和sock.setsockopt(),但是,我相
import socket
# TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Bind the socket to the port
server_address = ('10.0.2.6', 2104)
print('Starting up {} port {}'.format(*server_address))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Allows address to be reused
sock.bind(server_address)
# Listen for incoming connections, looking for one connection.
sock.listen(1) # The number of queried connections.
while True:
# Wait for a connection
print('waiting for a connection')
connection, client_address = sock.accept()
try:
print('connection from', client_address)
# Receive the data in small chunks and then send back
while True:
data = connection.recv(90)
print('received {!r}'.format(data))
if data:
print('sending data back to the client')
connection.sendall(data)
break
else:
print('no data from', client_address)
break
finally:
print("Closing current connection") # Cleans up the connection
connection.close()
sock.shutdown(socket.SOCK_STREAM, socket.AF_NET)
sock.shutdown(1)
sock.close()
我希望该程序继续以多次执行的方式监听同一部分。但是,运行此代码一次就会出现错误
socket.error: [Errno 98] Address already in use.
这不是关于如何关闭它,而是关于如何打开它。在绑定它之前,需要在侦听套接字上设置SO_REUSEADDR选项。@user207421只是为了确保SO_REUSEADDR在Python 3中有效吗?我将翻转bind和listen方法。通过执行sock.listen(),我是否已经像几行之前那样设置了SO_REUSEADDR选项?编辑:实际上刚刚在sock.bind()之前测试了sock.listen()。我得到[Errno 22]无效的参数我不懂Python,但如果它不受支持,我会感到惊讶。不,
listen()。你不能在绑定之前听。不知道您为什么要尝试它:它毫无意义。@user207421我对Python有点陌生。我想你是说在监听套接字上设置SO_REUSEADDR选项意味着监听在绑定之前进行。无论如何,我不是已经在第10行设置了正确的袜子选项吗?我没有遵循逻辑。sock.shutdown(socket.sock\u STREAM,socket.AF\u NET)
没有任何意义,将在运行时引发属性错误异常。我猜发布的代码不是您实际运行的代码。它不是关于如何关闭它,而是关于如何打开它。在绑定它之前,您需要在侦听套接字上设置SO_REUSEADDR选项。@user207421只是为了确保SO_REUSEADDR在Python 3中有效吗?我将翻转bind和listen方法。通过执行sock.listen(),我是否已经像几行之前那样设置了SO_REUSEADDR选项?编辑:实际上刚刚在sock.bind()之前测试了sock.listen()。我得到[Errno 22]无效的参数我不懂Python,但如果它不受支持,我会感到惊讶。不,listen()。你不能在绑定之前听。不知道您为什么要尝试它:它毫无意义。@user207421我对Python有点陌生。我想你是说在监听套接字上设置SO_REUSEADDR选项意味着监听在绑定之前进行。无论如何,我不是已经在第10行设置了正确的袜子选项吗?我没有遵循逻辑。sock.shutdown(socket.sock\u STREAM,socket.AF\u NET)
没有任何意义,将在运行时引发属性错误异常。我猜发布的代码不是您实际运行的代码。