1

これは間違いなく重複していません。

アプリを実行していて、デバイスの IP を見つける必要があります。私は彼らの名前を知っており、彼らの名前から IP を取得する必要があります。Linux は簡単なはずですが、クロスプラットフォームの姿勢が必要なので、Python を使用しています。

私はすでに解決策を知っています:

import socket
socket.gethostbyname('pc_name')

解決策を知っているのに、なぜ質問しているのですか? 安定した結果が得られないので、ちょっと待ってください。

状況: 同じホスト名を持ついくつかのラズベリー パイの IP を見つける必要があります。

Raspberry pi device 1: Hostname: 'MyPi', Local IP: 10.0.0.33

Raspberry pi device 2: Hostname: 'MyPi', Local IP: 10.0.0.34

Raspberry pi device 3: Hostname: 'MyPi', Local IP: 10.0.0.35

したがって、ソケットのドキュメントによると(正しく読んだ場合)、

socket.gethostbyname('MyPi') 

ただし、1つのIPのみを返します

socket.gethostbyname_ex('MyPi') 

特定のホスト名のすべての IP を返す必要があります。

私は自宅で状況をシミュレートしましたが、結果は非常に満足のいくものではありませんでした. 私は自分のラズベリー パイを Android フォンとして「Galaxy-J5-2016」と呼びました。アドレスでそれらを見つけようとしたことを確認するには:

>>> socket.gethostbyaddr('10.0.0.33')
('Galaxy-J5-2016', [], ['10.0.0.33'])
>>> socket.gethostbyaddr('10.0.0.34')
('Galaxy-J5-2016', [], ['10.0.0.34'])

良い、それらは存在します。ここに書く前にテストしたところ、検索すると1つも結果が得られました

socket.gethostbyname('Galaxy-J5-2016')

しかし、今は試しても何も見つかりません

socket.gethostbyname_ex('Galaxy-J5-2016')

上記の両方のコマンドは、単に応答なしで待機し、次のように応答します。

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
socket.gaierror: [Errno 11001] getaddrinfo failed

別の現象が発生しました: 仕事用のラップトップで最後に述べたコマンドを試すと (仕事用の PC は他のコンピューターとホスト名を共有していませんが)、

>>> socket.gethostbyname_ex('WORK_PC.DOM1.DOM2')
('WORK_PC.DOM1.DOM2', [], ['172.xx.xx.1', '10.0.xx.1', '172.xx.xx.241', 
 '192.xx.xx.1', '192.xx.xx.1', **'10.0.0.41'**])

興味深いことに、10.0.0.41は現在、私の職場の PC が自宅で使用しているローカル IP アドレスです (残りは私の職場のネットワークからのもののようです)。

言い換えれば、同じホスト名を持つ 2 台のマシンがあり、IP アドレスはゼロまたは 1 つしか取得できず、仕事用 PC は 1 台のマシンにすぎず、同じマシンの複数の IP を取得しますが、これらの IP は実際のローカルからでもありません。通信網)

PS (「arp -a」とアドバイスしていただける場合): 一般的なコマンド「arp -a」は、コマンド マシンと最近接触したすべてのローカル IP を表示するため、役に立ちません。そのため、特定のデバイスに ping を実行して、それらが arp -a コマンドにリストされていることを確認する必要があります。

PS2: また、すべての IP を通過する必要があるソリューションは必要ありません。存在しない IP に ping を実行すると数秒のタイムアウトが発生するため、このソリューションは非常に低速です。255 IP + タイムアウトは良くありません。

正直なところ、ローカルネットワークに接続されているすべてのデバイスをすぐにリストするpythonコマンドがあれば、それで十分です...しかし、このようなものは見つかりませんでした。

私は何か間違ったことをしていますか?案内してもらえますか?

前もって感謝します

4

0 に答える 0