DHT TCP API 在内部使用 UDP 服务请求(扭曲)

DHT TCP API using UDP internally to serve requests (twisted)

不确定这是否是我的问题的正确标题,但它是这样的: 我目前正在实施一个分布式哈希 Table (DHT) 和一个 API 可以通过 TCP 联系。它可以服务多个 API 调用,如 PUT、GET、Trace,同时监听多个 IP/Port 组合,如下所示:

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() 

现在那些 "external" 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,所以请耐心等待。 非常感谢!

我对扭曲一无所知,但 kademlia 是一种有状态的网络服务,必须维护其路由 table 等等。

考虑在您的请求中共享单个 kademlia 实例(以及底层 UDP 套接字)。

我对此的解决方案是使用已经预定义的内部协议编写我自己的工厂。因此我可以从每个实例访问它并且它保持不变。