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) по вашим запросам

Другие вопросы по тегам