Как написать программу для сообщения о локальном IP-адресе, например 192.168.1.102? - PullRequest
0 голосов
/ 13 мая 2009

, поскольку мой маршрутизатор Linksys не назначает фиксированный локальный IP-адрес компьютерам (ПК, Mac и Linux), я хотел бы написать скрипт, чтобы каждую минуту компьютеры обновлялись друг для друга, чтобы

http://localhost/list.html

на каждой машине будет содержать список имен всех ПК и Mac и ссылку на их сервер Apache (указывает на http://192.168.1.102, и т. Д.)

похоже, что способ узнать локальный IP-адрес с помощью ipconfig на ПК и ifconfig на Mac и Linux, и сделать это программно, это будет gethostbyname ().

Но я попробовал Ruby, это

irb(main):001:0> require 'socket'
=> true

irb(main):002:0> p Socket::gethostbyname("localhost")
["Core2Duo", [], 2, "\177\000\000\001"]

irb(main):005:0> p Socket::gethostbyname("core2duo")
["Core2Duo", [], 2, "\300\250\001g"]
=> nil

и ipconfig фактически показывает

IPv4 Address. . . . . . . . . . . : 192.168.1.103

так это правильный способ сделать это? Я могу взломать его, выполнив «ipconfig» в Ruby и используя регулярное выражение для получения результата, но было бы неплохо сделать это более стандартным способом.

Ответы [ 6 ]

2 голосов
/ 13 мая 2009

Socket::getaddrinfo может быть больше, чем вы ищете:

Socket::getaddrinfo('localhost', 'http')
[["AF_INET", 80, "localhost", "127.0.0.1", ...]]

Socket::getaddrinfo('core2duo', 'http')
[["AF_INET", 80, "Core2Duo", "192.168.1.103", ...]]

Или вы можете просто попробовать:

Socket::getaddrinfo('core2duo', 'http')[0][3]
"192.168.1.103"
1 голос
/ 13 мая 2009

Почему бы просто не отключить DHCP для этих машин и назначить им фиксированные IP-адреса?

Редактировать в ответ на комментарии. По крайней мере примерно три года назад (в последний раз, когда я покупал маршрутизатор), маршрутизаторы Linksys позволяли вам установить нижний IP-адрес для встроенного DHCP-сервера. Затем вы переходите к настройке сети отдельных компьютеров, отключаете DHCP и назначаете физические адреса. Например, в моей домашней сети маршрутизатор - 192.168.1.1, Terastation - 1.2, принтер - 1.3, моя коробка Linux - 1.99, и маршрутизатор настроен на выдачу 1.100 и выше.

1 голос
/ 13 мая 2009

Если вы запускаете Bonjour в своих системах Windows и avahi в своих системах Linux, вы можете избавиться от необходимости определять IP-адрес каждой системы. Затем вы можете просто обратиться к каждой системе, используя «hostname.local». Подробнее здесь .

1 голос
/ 13 мая 2009

Вы можете сделать это в Java, используя:

Socket s = new Socket();
s.getLocalSocketAddress();
0 голосов
/ 13 мая 2009

Если вы собираетесь транслировать дейтаграммы с указанием имени / IP-адреса, то на самом деле вам не нужен ПК, чтобы знать его собственный IP-адрес. Просто отправьте дейтаграмму, содержащую ее имя, затем используйте recvfrom () - или ее эквиваленты - чтобы перехватить ее на других ПК. Таким образом, получатели могут извлечь IP-адрес отправителя напрямую через функцию recvfrom () .

В качестве бонуса это должно работать, если на отправляющем компьютере установлено более одного сетевого адаптера.

0 голосов
/ 13 мая 2009

Проблема в сценарии Ruby может заключаться в том, что в вашей сети отсутствует разрешение имен DNS, это часто скрыто, если вы обычно делитесь вещами между компьютерами с SMB / CIFS, потому что у него есть собственный протокол обнаружения имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...