【发布时间】:2015-08-14 15:07:43
【问题描述】:
不确定这是否是我的问题的正确标题,但它是这样的: 我目前正在使用可以通过 TCP 联系的 API 实现分布式哈希表 (DHT)。它可以服务多个 API 调用,如 PUT、GET、Trace,同时监听多个 IP/端口组合,如下所示:
factory = protocol.ServerFactory()
factory.protocol = DHTServer
for ip in interfaces:
for port in ports:
reactor.listenTCP(int(port), factory, interface=ip)
print ("Listening to: "+ ip +" on Port: "+port)
reactor.run()
现在,这些“外部”API 调用将由底层 DHT 实现(Kademlia、Chord 或 Pastry)执行。那些底层 DHT 实现使用不同的协议相互通信。例如 Kademlia 通过 UDP 使用 RPC。
TCP API 的协议(上面代码中的 DHTServer)有一个内部 DHT 协议,如下所示:
self.protocol = Kademlia(8088, [("192.168.2.1", 8088)])
现在,如果客户端一个接一个地发出两个单独的 API 请求,我会在第二个请求中收到此错误消息:
line 197, in _bindSocket
raise error.CannotListenError(self.interface, self.port, le)
twisted.internet.error.CannotListenError: Couldn't listen on any:8088: [Errno 10
048] Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder Ansc
hluss) nur jeweils einmal verwendet werden.
这基本上说每个套接字地址只能使用一次。我不太确定,但我想这是因为对于每个 API 请求,都会创建一个新的 DHTServer 协议实例,而这又会创建一个新的 Kademlia 实例,并且两者都试图在同一个地址上监听。但为什么会这样呢?第一个DHTServer 协议实例不应该在第一个请求被处理后被销毁吗?我究竟做错了什么?有没有更好的方法来做到这一点?我最近才开始使用twisted,所以请耐心等待。
非常感谢!
【问题讨论】: