[RESOLVIDO] Pegar IP da máquina

13 respostas
R

Pessoal, preciso pegar o IP da máquina que estou, isso em windows e linux. Procurei sobre isso e todos os exemplos que encontrei me levam ao mesmo problema.

Bom, encontrei duas formas de fazer isso, vejam:

// PRIMEIRA FORMA
		
InetAddress ia = null;
try {
	ia = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
	e.printStackTrace();
}
		
System.out.println("IP: " + ia.getHostAddress());
System.out.println("Nome: " + ia.getHostName());
Qdo eu executo no windows funciona, porém no linux ele sempre me retorna o IP 127.0.0.1. :cry: Vejam como fica a saída do código acima:
IP: 127.0.0.1 Nome: renata

Então tentei desta segunda forma:

// SEGUNDA FORMA

Enumeration nis = null;
try {
	nis = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
	e.printStackTrace();
}  
while (nis.hasMoreElements()) {  
	NetworkInterface ni = (NetworkInterface) nis.nextElement();  
	Enumeration ias = ni.getInetAddresses();  
	while (ias.hasMoreElements()) {  
		InetAddress ia = (InetAddress) ias.nextElement();  
		System.out.println(ni.getName() + " -> ip: " + ia.getHostAddress() + " - hostname: " + ia.getHostName());   
	}  
}

Esta de fato (pelo menos no linux pq no win eu ainda não testei), me retorna todas as informações possíveis, entre elas o tal IP que é o que eu quero. Mas como vou saber dentre as informações que ela libera, qual é a que eu quero?! Isso pode variar de linux pra linux, dependendo tb da placa de rede. Como faço? Vejam a saída do código acima:

eth0 -> ip: MEUIPV6 - hostname: MEUIPV6 eth0 -> ip: MEUIP - hostname: MEUIP lo -> ip: 0:0:0:0:0:0:0:1%1 - hostname: 0:0:0:0:0:0:0:1%1 lo -> ip: 127.0.0.1 - hostname: localhost

Onde MEUIPV6 é aquele ipv6 que aparece qdo vou no console e digito ifconfig. E MEUIP é o IP da minha máquina.


Pessoal, será que não tem um jeito de eu pegar o IP da máquina local no linux?! No win eu já consegui, mas e no linux?!

Encontrei até um post do thingol de 2004 dizendo que em alguns linux haveria esse problema que estou enfrentando. Alguma dica pessoal? Uso linux slackware.

Grata,

13 Respostas

K

Quando vc faz a conexão vc está fazendo chamando o localhost ?

Se estiver fazendo isso, ele só vai te dar o localhost mesmo…

Chame a conexão pelo ip da placa eth que ele vai dar o ip correto.

[]'s

Rodrigo

R

kleins:
Quando vc faz a conexão vc está fazendo chamando o localhost ?

Se estiver fazendo isso, ele só vai te dar o localhost mesmo…

Chame a conexão pelo ip da placa eth que ele vai dar o ip correto.

[]'s

Rodrigo

Rodrigo obrigada por responder.

Como assim qdo faço a conexão?!

Chamar pelo IP da placa eth? E como eu vou saber qual o IP da placa eth?!

Desculpe mas não entendi… :roll:

Grata

M

a menos que eu esteja errado (me corrijam por favor nesse caso) ele intendeu que você ta tentando conecta com a propria maquina, abri um socket para si mesmo, ou algo assim…e não apenas pega o proprio endereço ip…

Renata, eu tinha pensado em um negocio meio gambi…por isso nem tinha me pronunciado…rs

mais ja q nimguem falo nada melhor, vc tento fazer o seguinte: pega essa string do retorno, semelhante ao que daria no ifconfig, e ai vc vai varrer ela, procurando por algum token aonde esteja escrito assim:

<grupo de 1 a 3 caracteres> <grupo de 1 a 3 caracteres> <grupo de 1 a 3 caracteres> <grupo de 1 a 3 caracteres>

encontrada uma parte assim vc vai ter que verificar se esses caracteres são todos numeros.

sendo todos numeros vc tem que verifica se não é 127.0.0.1 …rsrsrs se for vc continua loopando aonde varre a string procurando pelo ip.

tipo um mini analisador lexico bem especifico pro seu caso.

aliais axo mais facil vc cria um metodo isIp que recebe como parametro a frasesona a procurar o ip la, ou outro nome melhor…enfim… nem tinha respondido pq acho isso meio gambi, alem do mais so mto iniciante em comparação a mta gente aqui, mais ja que nimguem falo nada…

bom…espero ter ajudado…

R

É amigo… eu tb tinha pensado nessa “gambi”…rs… não se preocupe!

Tô tentando ver se existe uma forma mais elegante (e claro, mais confiável) tb de fazer isso. Mas parece q está difícil…

Obrigada de qq forma! :wink:

T

No seu caso, você tem de listar as interfaces de rede que têm o nome que inicia por eth (na sua máquina é eth0 mas aqui no serviço eu tenho uma máquina cuja interface de rede, listada pelo seu programa, é eth1), e que tenha um endereço IPV4.

(No caso do Solaris é mais chato porque as interfaces de rede têm nomes diferentes conforme o fornecedor da placa - se você tem uma placa Intel o nome é diferente de uma placa Broadcom).

É só não usar as interfaces de rede que começam por “lo” (loopback), que aí vão dar o endereço 127.0.0.1 ou coisa parecida. OK?

Você já chegou bem perto de onde você quer. Não tem gambiarra nenhuma para fazer.

R

Peraih Thingol, deixa eu ver se compreendi direito. Eu fiz o seguinte código:

Enumeration nis = null;
try {
	nis = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
	e.printStackTrace();
}
		
while (nis.hasMoreElements()) {  
	NetworkInterface ni = (NetworkInterface) nis.nextElement();  
	Enumeration ias = ni.getInetAddresses();
			
	while (ias.hasMoreElements()) {  
		InetAddress ia = (InetAddress) ias.nextElement();
		if (!ni.getName().equals("lo"))
			System.out.println(ia.getHostAddress());   
	}  
}

Ele me retorna o seguinte:

fe80:0:0:0:213:d4ff:fe7f:4d9d%2 111.222.333.444

Agora basta eu percorrer esse retorno procurando pelo primeiro conteúdo que contenha apenas 3 pontinhos e no máximo 3 números entre cada pontinho?! Fazendo isso não tem chance de a rotina me surpreender em alguma outra máquina diferente da minha?!

Grata,

T

Só vou lhe dizer uma coisinha.

Pode ser que sua máquina tenha várias interfaces de rede - por exemplo, máquinas Linux usadas como servidoras podem ter duas ou mais placas de rede, cada uma com um IP. (Ou então pode ser que sejam interfaces “dial-up” - pense numa máquina Linux configurada como roteadora e conectada a um cable modem ou modem discado mesmo).

Você precisa decidir qual dos IPs você vai escolher: se o da primeira placa de rede (eth alguma coisa), ou se outro endereço. O seu código escolhe um IP qualquer simplesmente pela enumeração.

Eu , no seu lugar, retornaria TODOS os IPs em uma lista (exceto os das interfaces loopback, que são praticamente inúteis), e o usuário da rotina é que deveria escolher qual IP a ser usado.

R

Era o que eu temia!
Pior que não posso retornar vários IPs. O usuário nem sabe oque estou fazendo, é algo transparente pra ele.

Meu problema é que não posso permitir que qdo for configurado o IP do micro onde está o BD seja colocado “localhost” ou “127.0.0.1”. Sei que o BD funciona normalmente com esses valores, mas eu não posso permitir isso pro causa de alguns controles que tenho, e que uso esses IPs para esses controles. Então preciso que SEMPRE exista um IP configurado. Por ex, se tô na máquina 192.168.1.111, quero que ele coloque esse valor no IP e não “localhost”.

Só que em alguns casos se trata de DHCP, então o kra justamente põem “localhost” pq ele não vai ficar trocando o IP da configuração a cada vez que liga e desliga a máquina.

Então o que quero fazer é que, antes de conectar com o BD, eu verifico, se estiver “localhost” ou “127.0.0.1” na configuração, eu quero pegar o IP da máquina e colocar no lugar.

Entende o problema?! No windows foi ridiculamente simples de ser feito, não consigo entender pq no linux está sendo tão complicado. :frowning:

K

Pelo que entendi ela quer o endereço do cliente, certo ?

Eu perguntei se ela estava fazendo a requisição pra interface local, pois ele apresentaria o 127.0.0.1 mesmo.

Por exemplo.

Meu linux tem os seguintes endereços.

local : 127.0.0.1
eth0 : 192.168.1.1

Se eu aqui do meu navegador chamar o tomcat pelo ip local, ele vai me retornar que a conexão veio do 127.0.0.1 (dela pra ela mesma)

Se eu chamar pelo ip da eth0 ele vai me dar que a conexão veio da 192.168.1.1

Entendeu ?

Resumindo… Se voc quer pegar o seu ip da eth0 (ou qualquer outra ethX) a sua conexão tem que sair por ela…

[]'s

Rodrigo

T

Você matou a charada. Se é uma configuração (o cara pode mudar à vontade e digitar qualquer IP; não está restrito a apenas 1 IP que você deixou chumbado), ponha o primeiro que encontrar.

R

É… foi o que acabei fazendo já que não teve outro jeito!

Obrigada à todos!

G

Por favor poderia postar a solução?
Eu preciso pegar o IP do usuário na máquina linux, ele sempre retorna 127.0.0.1, porém no windows funciona normalmente…
não entendi mto bem a solução…

L

Eu coloquei o seguinte e deu certo:

Enumeration nis = null;
        try {
            nis = NetworkInterface.getNetworkInterfaces();
        } catch (SocketException e) {
            e.printStackTrace();
        }

        while (nis.hasMoreElements()) {
            NetworkInterface ni = (NetworkInterface) nis.nextElement();
            Enumeration ias = ni.getInetAddresses();

            while (ias.hasMoreElements()) {
                ia = (InetAddress) ias.nextElement();
                
                if (ia.getHostAddress().contains("10.132")) {//Nesse if está a charada, sendo que eu sei que meu ip começa com 10.132, por exemplo
                ip=ia.getHostAddress();    
                }
                System.out.println("Teste " + ia.getHostAddress());
                if (!ni.getName().equals("lo")) {
                   // System.out.println(ia.getHostAddress());
                }
            }
        }
         
        System.out.println("Nome: " + nome);
        System.out.println("IP: " + ip);
Criado 9 de outubro de 2007
Ultima resposta 10 de abr. de 2013
Respostas 13
Participantes 6