DHT TCP API 在内部使用 UDP 服务请求(扭曲)
Posted
技术标签:
【中文标题】DHT TCP API 在内部使用 UDP 服务请求(扭曲)【英文标题】:DHT TCP API using UDP internally to serve requests (twisted) 【发布时间】: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,所以请耐心等待。
非常感谢!
【问题讨论】:
【参考方案1】:我对twisted一无所知,但kademlia是一个有状态的网络服务,必须维护它的路由表等等。
考虑在您的请求之间共享单个 kademlia 实例(以及底层 UDP 套接字)。
【讨论】:
【参考方案2】:我对此的解决方案是使用已经预定义的内部协议编写我自己的工厂。因此我可以从每个实例中访问它并且它保持不变。
【讨论】:
这可能是正确的方法,只要您正确处理正在删除和重新添加的侦听套接字。这不适用于 TCP,因为它是面向连接的,但对于 UDP 应该没问题。以上是关于DHT TCP API 在内部使用 UDP 服务请求(扭曲)的主要内容,如果未能解决你的问题,请参考以下文章