это определенно не дубликат.
Я делаю приложение, и мне нужно найти IP-адреса моих устройств. Я знаю их имя, и через их имя мне нужно получить их IP. Linux должен быть простым, но мне нужно межплатформенное отношение, поэтому я использую python.
Я уже знаю решение:
import socket
socket.gethostbyname('pc_name')
Если я знаю решение, почему я спрашиваю? Хорошо, дай мне минутку, потому что я не получаю стабильных результатов.
Положение:
Мне нужно найти IP-адреса нескольких Raspberry Pi с одинаковым именем хоста - скажем:
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-адреса для определенного имени хоста.
Я смоделировал ситуацию дома, и результаты были очень неудовлетворительными.
Я назвал свой Raspberry Pi своим телефоном на 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 - это локальный IP-адрес, который мой РАБОЧИЙ ПК имеет прямо сейчас дома (остальное, кажется, из сети на моей работе).
Другими словами: У меня есть две машины с одинаковым именем хоста, и я получаю ноль или только один IP-адрес, и мой рабочий компьютер - это всего лишь одна МАШИНА, и я получаю несколько IP-адресов одной машины, и эти IP-адреса так сказать, даже не из фактической локальной сети)
PS (на случай, если вы посоветуете мне 'arp -a'): общая команда 'arp -a' бесполезна, поскольку показывает все локальные IP-адреса, которые недавно были в контакте с командной машиной. Поэтому мне нужно пропинговать конкретные устройства, чтобы увидеть их в списке arp -a.
PS2: Также я не хочу никакого решения, которое требует прохождения всех IP-адресов. Это решение очень медленное, так как пропинг IP, который не существует, приведет к задержке в несколько секунд. 255 IP + тайм-аут не хорош.
Честно говоря, если существует команда python для немедленного вывода списка всех устройств, подключенных к локальной сети, этого достаточно ... Но я не нашел ничего подобного.
Я что-то не так делаю? Вы можете направить меня?
Заранее спасибо