簡體   English   中英

DHT TCP API內部使用UDP來處理請求(扭曲)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM