2

私は現在、LAN上でそれ自体の他のインスタンスを検出する必要があるpythonプログラムを作成しています。ディスカバリに UDP ブロードキャストを使用します(255.255.255.255)。

問題は、コンピューターに複数のネットワーク アダプターがある (複数のネットワークに接続されている) 場合、それらのネットワークの 1 つだけがブロードキャストを受信することです。私の最初のアイデアは、ローカル ネットワークに割り当てられたすべてのネットワーク アドレスを列挙し、それぞれに対してブロードキャスト パケットを送信することでした (たとえば192.168.0.255、 と192.168.1.255)。ただし、すべてのローカル ネットワーク アドレスを検出する信頼できる方法はないようです。私が見つけて試したものはすべて、python-2 のみのライブラリに依存しているか127.0.1.1、Linux 仮想マシン (192.168.0.100および他のいくつかのライブラリ) にのみ返されるためです。

この場合、利用可能なすべてのネットワークにブロードキャストするにはどうすればよいですか?

私は Python 3 を使用しており、プラットフォームに依存しない方法を探しています。大きなサードパーティ ライブラリは必要ありません。すべてのネットワーク インターフェイスを表示するライブラリがcorrectlyその仕事をします。

4

2 に答える 2

0

試してみてくださいnmap。あなたのニーズに合わせてhttps://pypi.python.org/pypi/python-nmapがありpython-nmapます

注: 0.2.7 のバージョン番号はpython-nmap、python 自体ではなく、python3 で動作するためのものです)。

于 2013-06-17T10:01:32.407 に答える
0

興味深い問題です。でも:

  1. すべてのノードにアプリケーションをインストールするまでは、ネットワーク内のすべてのマシンからの応答を期待しないでください。セキュリティ上の理由から、特定の種類のデバイスやシステムではブロードキャストへの応答が禁止されています。
  2. 次のコードを試して、ローカル アドレスを取得できます。

    import socket
    myips = socket.gethostbyname_ex(socket.gethostname())[2]
    [ip for ip in myips if not ip.startswith("127.")][:1]
    

    その IP に設定されたネットマスクを検出する際の問題は残ります。

  3. pypiで利用可能なnetifacesモジュールも使用します。このページの例は、モジュールの使用方法を説明するのに十分です。

于 2013-06-17T10:06:33.590 に答える