gpt4 book ai didi

python - socketserver - 允许重用地址重新绑定(bind)现有端口号在不覆盖类变量的情况下不起作用

转载 作者:行者123 更新时间:2023-12-01 09:33:42 27 4
gpt4 key购买 nike

我正在使用 socketserver 模块编写一个简单的套接字服务器,除了一件小事情之外,一切似乎都工作得很好。我将服务器绑定(bind)到某个端口,然后设置 server.allow_reuse_address = True 来重用同一端口,而无需等待内核释放底层端口。但是,如果在创建服务器实例后修改变量server.allow_reuse_address = True,则它不起作用,但如果我为服务器创建自定义类,然后覆盖其中的变量,则一切正常。

下面是我的代码。

import socketserver
import sys

class MyTCPRequestehandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024)
while self.data:
print('Received {} from {}'.format(self.data.decode().strip(), self.client_address))
self.request.send(self.data.upper())
self.data = self.request.recv(1024)


if __name__ == '__main__':
try:
server = socketserver.TCPServer(('', 12345), MyTCPRequestehandler)
ip, port = server.server_address
server.allow_reuse_address = True
print(server.allow_reuse_address)
print('Server listening on port {}'.format(port))
# server.handle_request()
server.serve_forever()
except KeyboardInterrupt:
sys.exit()

如果在断开连接后重新运行应用程序,我会收到此错误

File "/Documents/PythonPrograms/network-modules/socketServer/simplesocketserver.py", line 16, in <module>
server = socketserver.TCPServer(('', 12345), MyTCPRequestehandler)
File "/spare/ssd/rbhanot/anaconda3/lib/python3.6/socketserver.py", line 453, in __init__
self.server_bind()
File "/spare/ssd/rbhanot/anaconda3/lib/python3.6/socketserver.py", line 467, in server_bind
self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use

但是,如果我执行如下操作,一切都会正常。

class MyTcpServer(socketserver.TCPServer):
allow_reuse_address = True

def __init__(self, address, request_handler_class):
self.address = address
self.request_handler_class = request_handler_class
super().__init__(self.address, self.request_handler_class)

那么我在这里缺少什么?

最佳答案

这是预期且有记录的行为。来自 https://svn.python.org/projects/python/trunk/Lib/SocketServer.py :

Class variables that may be overridden by derived classes or instances:

  • timeout
  • address_family
  • socket_type
  • allow_reuse_address

如果我们进一步检查源代码,我们可以看到其中的原因。类 init 调用 server_bind(),该函数检查 allow_reuse_address 变量,并根据需要执行 setsockopt 操作。

如果您稍后更改它,则在实例初始化后不会进行进一步的检查,这意味着您的更改不会影响任何内容。

关于python - socketserver - 允许重用地址重新绑定(bind)现有端口号在不覆盖类变量的情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49728912/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com