[英]DHT TCP API using UDP internally to serve requests (twisted)
不確定這是否是我的問題的正確標題,但問題就在這里:我目前正在使用可通過TCP與API聯系的API實現分布式哈希表(DHT)。 它可以在偵聽多個IP /端口組合的同時提供多個API調用,如PUT,GET,Trace,如下所示:
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一無所知,但是kademlia是一個有狀態的網絡服務,必須維護其路由表以及所有其他內容。
考慮在您的請求中共享單個kademlia實例(以及因此的基礎UDP套接字)。
我對此的解決方案是使用預先定義的內部協議編寫自己的Factory。 因此,我可以從每個實例訪問它,並且保持不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.