У меня есть инструмент, в котором я реализую обнаружение upnp устройств, подключенных к сети.
Для этого я написал скрипт и использовал в нем класс дейтаграмм.
Реализация: всякий раз, когда на инструменте нажимается кнопка сканирования, он запускает этот сценарий upnp и отображает список устройств в поле, созданном в инструменте.
Это работало нормально.
Но когда я снова нажимаю кнопку сканирования, это дает мне следующую ошибку:
Traceback (most recent call last):
File "tool\ui\main.py", line 508, in updateDevices
upnp_script.main("server", localHostAddress)
File "tool\ui\upnp_script.py", line 90, in main
reactor.run()
File "C:\Python27\lib\site-packages\twisted\internet\base.py", line 1191, in run
self.startRunning(installSignalHandlers=installSignalHandlers)
File "C:\Python27\lib\site-packages\twisted\internet\base.py", line 1171, in startRunning
ReactorBase.startRunning(self)
File "C:\Python27\lib\site-packages\twisted\internet\base.py", line 683, in startRunning
raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable
Основная функция скрипта upnp:
def main(mode, iface):
klass = Server if mode == 'server' else Client
obj = klass
obj(iface)
reactor.run()
Существует класс сервера, который отправляет команду M-search (upnp) для обнаружения устройств.
MS = 'M-SEARCH * HTTP/1.1\r\nHOST: %s:%d\r\nMAN: "ssdp:discover"\r\nMX: 2\r\nST: ssdp:all\r\n\r\n' % (SSDP_ADDR, SSDP_PORT)
В конструкторе класса сервера, после отправки m-search я наклоняюсь реактор
reactor.callLater(10, reactor.stop)
Из google я обнаружил, что мы не можем перезапустить реактор, потому что это его ограничение.
http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#WhycanttheTwistedsreactorberestarted
Пожалуйста, помогите мне, как я могу изменить свой код, чтобы я мог сканировать устройства более 1 раза и не получать эту «ошибку, не перезапускаемую реактором»