ネットワークに接続されたデバイスの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)
グーグルから、リアクターを再起動できないことがわかりました。これは、その制限であるためです。
http://twistedmatrix.com/trac/wiki/FrequentlyAskedQuestions#WhycanttheTwistedsreactorberestarted
デバイスを複数回スキャンでき、この「reactor not restartable error」が発生しないように、コードを変更する方法を教えてください。