cómo escribir un programa para informar de la dirección IP local como 192.168.1.102?
-
21-08-2019 - |
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
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.
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.