[RESOLVIDO] Pegar IP da máquina

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:

[code]// 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());
[/code]
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:

[quote]IP: 127.0.0.1
Nome: renata[/quote]

Então tentei desta segunda forma:

[code]// 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());
}
} [/code]

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:

[quote]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.
[/quote]
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,

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

[quote=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[/quote]

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

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…

É 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:

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.

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

[code]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());   
}  

}[/code]

Ele me retorna o seguinte:

[quote]fe80:0:0:0:213:d4ff:fe7f:4d9d%2
111.222.333.444[/quote]

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,

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.

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:

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

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.

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

Obrigada à todos!

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…

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);