这绝对不是重复的。
我正在做一个应用程序,我需要找到我设备的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
发生了另一种现象:当我在工作笔记本电脑上尝试最后提到的命令时(即使我的工作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 是我的WORK PC现在在家中拥有的本地IP地址(其余似乎是我工作中的网络)。
换句话说::我有两台具有相同主机名的机器,但得到零或只有一个IP地址,而我的工作PC只是一台机器,而我却获得了同一台机器的多个IP,这些IP可以说甚至不是来自实际的本地网络)
PS(如果您会建议我使用“ arp -a”):通用命令“ arp -a”无用,因为它显示了最近与命令机联系的所有本地IP。因此,我需要ping特定设备以查看在arp -a命令中列出的设备。
PS2:另外,我也不需要任何需要通过所有IP的解决方案。此解决方案非常慢,因为ping不存在的IP将导致几秒钟的超时。 255 IP +超时不好。
老实说,如果存在python命令立即列出所有连接到本地网络的设备,它就足够了……但是我没有找到类似的东西。
我做错什么了吗?你能指导我吗?
预先感谢