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') 

只返回一个 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'])

很好,它们存在。当我在写之前测试它时,如果我搜索我什至得到了一个结果

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

另一种现象发生了:当我在我的工作笔记本电脑上尝试最后提到的命令时(即使我的工作电脑不与任何其他计算机共享主机名),

>>> 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是我的 WORK PC 现在在家中的本地 IP 地址(其余的似乎来自我工作的网络)。

换句话说:我有两台主机名相同的机器,我得到零或只有一个 IP 地址,我的工作 PC 只是一台机器,我得到同一台机器的多个 IP,可以说这些 IP 甚至不是来自实际的本地网络)

PS(如果你会建议我'arp -a'):一般命令'arp -a'是无用的,因为它显示了最近与命令机器联系的所有本地IP。所以我需要 ping 特定设备以查看它们在 arp -a 命令中列出。

PS2:我也不想要任何需要通过所有 IP 的解决方案。此解决方案非常慢,因为 ping 不存在的 IP 将导致几秒钟的超时。255 IP + 超时不好。

老实说,如果存在 python 命令来立即列出所有连接到本地网络的设备,这就足够了......但我没有找到这样的东西。

难道我做错了什么?你能指导我吗?

提前致谢

4

0 回答 0