这绝对不是重复的。
我正在做一个应用程序,我需要找到我的设备的 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 命令来立即列出所有连接到本地网络的设备,这就足够了......但我没有找到这样的东西。
难道我做错了什么?你能指导我吗?
提前致谢