como escrever um programa para informar o endereço IP local, como 192.168.1.102?
-
21-08-2019 - |
Pergunta
desde meus Linksys router não atribui um IP local fixo para os computadores (PC e Mac e Linux), eu gostaria de escrever um script para que a cada minuto, os computadores serão atualizados para o outro para que
em cada máquina irá conter uma lista de nomes de todos os PC e Mac e um link para o seu servidor apache (apontando para http: / /192.168.1.102 , etc)
parece uma maneira de descobrir o endereço IP local é por ipconfig no PC, e ifconfig no Mac e Linux, e fazê-lo por meio de programação, será gethostbyname ().
Mas eu tentei em 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
e ipconfig realmente mostra
IPv4 Address. . . . . . . . . . . : 192.168.1.103
então este é o caminho certo para fazê-lo? I pode cortá-lo através da execução "ipconfig" em Ruby e usar a expressão regular para obter o resultado, mas seria bom fazê-lo usando uma forma mais padrão.
Solução
Socket::getaddrinfo
pode ser mais do que você está procurando:
Socket::getaddrinfo('localhost', 'http')
[["AF_INET", 80, "localhost", "127.0.0.1", ...]]
Socket::getaddrinfo('core2duo', 'http')
[["AF_INET", 80, "Core2Duo", "192.168.1.103", ...]]
Ou, você pode apenas tentar:
Socket::getaddrinfo('core2duo', 'http')[0][3]
"192.168.1.103"
Outras dicas
Você pode fazer isso em Java usando:
Socket s = new Socket();
s.getLocalSocketAddress();
Se você executar Bonjour em seus sistemas e avahi Windows em seus sistemas Linux, você pode acabar com a necessidade de determinar o endereço IP de cada sistema. Você pode então simplesmente tratar cada sistema usando "hostname.local
". Mais informações aqui .
Por que não simplesmente desligar DHCP para as máquinas e atribuí-los endereços IP fixo?
Editar em resposta aos comentários: Pelo menos as-de três anos ou mais atrás (última vez que eu comprei um roteador), Linksys roteadores permitiu-lhe definir o endereço IP de fundo para o servidor DHCP embutido. Então, você vai para a configuração das máquinas individuais de rede, desativar DHCP e endereços físicos atribuir. Por exemplo, na minha rede doméstica do roteador é 192.168.1.1, o TeraStation é 1.2, a impressora é de 1,3, minha caixa de Linux é 1,99, eo roteador está configurado para dar 1.100 e acima.
O problema no script Ruby pode ser que não há nenhuma resolução de nomes DNS em sua rede, esta é muitas vezes escondido, se você normalmente coisas share entre computadores com o SMB / CIFS, porque isso tem o seu próprio protocolo de nome descoberta.
Se você estiver indo para estar transmitindo datagramas com a informação nome / ip, então você realmente não precisa de um PC para conhecer o seu próprio endereço IP. Basta enviar o datagrama contendo seu nome, em seguida, usar recvfrom () - ou equivalentes - para pegá-lo em outros PCs. Dessa forma, os receptores podem extrair o endereço IP do remetente diretamente através do recvfrom () função.
Como um bônus, que deve funcionar onde o PC enviando tem mais de um adaptador de rede.