Pregunta

desde mi router Linksys no asigna una dirección IP fija local para los ordenadores (PC y Mac y Linux), me gustaría escribir un guión para que cada minuto, los ordenadores se actualizará el uno al otro de manera que

http: //localhost/list.html

en cada máquina contendrá una lista de nombres de todos los PC y Mac y un enlace a su servidor Apache (señalando a http: / /192.168.1.102 , etc)

se ve como una forma de averiguar la dirección IP local es de ipconfig en PC, y ifconfig en el Mac y Linux, y hacerlo mediante programación, se GETHOSTBYNAME ().

Pero traté de Ruby, que

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 y en realidad muestra

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

así que es esta la forma correcta de hacerlo? Puedo entrar ilegalmente en él mediante la ejecución de "ipconfig" en Ruby y el uso de expresiones regulares para obtener el resultado, pero sería bueno hacerlo utilizando una forma más estándar.

¿Fue útil?

Solución

Socket::getaddrinfo podría ser más de lo que usted está buscando:

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

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

O, que sólo podría probar:

Socket::getaddrinfo('core2duo', 'http')[0][3]
"192.168.1.103"

Otros consejos

Usted puede hacer esto en Java usando:

Socket s = new Socket();
s.getLocalSocketAddress();

Si ejecuta Bonjour en sus sistemas Windows y avahi en los sistemas Linux, se puede eliminar la necesidad de determinar la dirección IP de cada sistema. A continuación, puede simplemente hacer frente a cada sistema usando "hostname.local". Más información aquí .

¿Por qué no sólo tiene que desactivar DHCP para esas máquinas y asignarles direcciones IP fijas?

Editar en respuesta a los comentarios: Al menos como de tres años o así que hace (la última vez que compré un router), routers Linksys permite configurar la dirección IP de fondo para la incorporada en el servidor DHCP. A continuación, entra en la configuración de red de las máquinas individuales, desactiva DHCP y asignar direcciones físicas. Por ejemplo, en mi red doméstica del router es 192.168.1.1, la TeraStation es 1.2, la impresora es de 1,3, mi máquina Linux es de 1.99 y el router está configurado para dar 1,100 o más.

El problema en la secuencia de comandos de Ruby podría ser que no hay ninguna resolución de nombres DNS en la red, esto a menudo se oculta si suele compartir cosas entre ordenadores con SMB / CIFS, ya que tiene su propio protocolo de descubrimiento de nombres.

Si usted va a estar transmitiendo datagramas con el nombre de información / IP, entonces usted realmente no necesita un PC para conocer su propia dirección IP. Sólo tiene que enviar el datagrama que contiene su nombre, a continuación, utilizar recvfrom () - o - equivalentes a ponerse en el otro PC. De esa manera los receptores pueden extraer la dirección IP del remitente directamente a través del , función recvfrom ().

Como beneficio adicional, que deben trabajar en el ordenador emisor tiene más de un adaptador de red.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top