不确定这是否是我的问题的正确标题,但在这里: 我目前正在实现一个带有API的分布式哈希表(DHT),可以通过TCP联系。它可以提供多个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使用RPC到UDP。
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
协议实例?我究竟做错了什么?有没有更好的方法呢?我最近才开始使用扭曲,所以请耐心等待。
非常感谢!
答案 0 :(得分:0)
我对twisted没有任何了解,但kademlia是一个有状态的网络服务,必须维护它的路由表等等。
考虑在您的请求中共享单个kademlia实例(以及基础UDP套接字)。
答案 1 :(得分:0)
我的解决方案是编写自己的工厂,内部协议已经预先定义。因此,我可以从每个实例访问它,它保持不变。