DHT TCP API, использующий UDP для обслуживания запросов (витая)
Не уверен, что это правильное название для моей проблемы, но здесь это так: я в настоящее время внедряю распределенную хэш-таблицу (DHT) с API, с которым можно связаться через 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
Экземпляр протокола уничтожен после того, как первый запрос обслужен? Что я делаю неправильно? Есть ли лучший способ сделать это? Я только недавно начал работать с витой, поэтому наберитесь терпения. Большое спасибо!
2 ответа
Моим решением было написать свой собственный Factory с уже заданным внутренним протоколом. Таким образом, я могу получить к нему доступ из любого экземпляра, и он остается прежним.
Я ничего не знаю о витой, но kademlia - это сетевой сервис с отслеживанием состояния, который должен поддерживать свою таблицу маршрутизации и все такое.
Рассмотрите возможность совместного использования одного экземпляра kademlia (и, следовательно, лежащего в основе сокета UDP) по вашим запросам