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

http: //localhost/list.html

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top