2009-06-30 3 views
20

이 코드는 로컬 IP 주소를 192.xxx.x.xxx로 반환하는 데 사용되었지만 지금은 127.0.0.1을 반환합니다. 동일한 코드가 다른 값을 반환하는 이유를 알려주십시오. 리눅스 OS에서 볼 필요가있는 것이 있습니까?Java에서 IP 주소를 가져 오지 않았습니다

import java.util.*; 
import java.lang.*; 
import java.net.*; 

public class GetOwnIP 
{ 
    public static void main(String args[]) { 
    try{ 
     InetAddress ownIP=InetAddress.getLocalHost(); 
     System.out.println("IP of my system is := "+ownIP.getHostAddress()); 
    }catch (Exception e){ 
     System.out.println("Exception caught ="+e.getMessage()); 
    } 
    } 
} 

답변

30

127.0.0.1은 루프백 어댑터입니다.

해당 질문에 대한 정답이 문제입니다.

편집 : getLocalHost에 대한 문서 말 :

의 checkConnect 메소드가 로컬 호스트 이름을 불러 -1의 인수로 작업이 있는지, 보안 매니저가 존재하는 경우 허용. 연산이 이 아닌 경우, 루프 백 주소 인 을 나타내는 InetAddress가 반환됩니다.

사용 권한의 변경으로 인해 동작이 변경 될 수 있습니까?

편집 : 나는 모든 가능성을 열거 할 필요가있는 것 같아요. NetworkInterface.getNetworkInterfaces. 여기에 가상 주소를 표시하지 않는 예는, 그러나 "주"인터페이스 작동 :

import java.net.*; 
import java.util.*; 

public class Test 
{ 
    public static void main(String[] args) 
     throws Exception // Just for simplicity 
    { 
     for (Enumeration<NetworkInterface> ifaces = 
       NetworkInterface.getNetworkInterfaces(); 
      ifaces.hasMoreElements();) 
     { 
      NetworkInterface iface = ifaces.nextElement(); 
      System.out.println(iface.getName() + ":"); 
      for (Enumeration<InetAddress> addresses = 
        iface.getInetAddresses(); 
       addresses.hasMoreElements();) 
      { 
       InetAddress address = addresses.nextElement(); 
       System.out.println(" " + address); 
      } 
     } 
    } 
} 

(나는 Enumeration<T> 타입이 직접 작업을 얼마나 끔찍한 잊었다!)

다음

은 지금 내 노트북에 결과 :

lo: 
    /127.0.0.1 
eth0: 
    /169.254.148.66 
eth1: 
eth2: 
ppp0: 
    /10.54.251.111 

(나는 그렇게 생각하지 않는다 어떤 상당히 민감한 정보 :

을 멀리주고3210

사용하려는 네트워크 인터페이스를 알고있는 경우 NetworkInterface.getByName(...)으로 전화 한 다음 해당 인터페이스의 주소를 확인하십시오 (위 코드 참조).

+1

위의 루프에서 NetworkInterface # isLoopback()을 확인하여 루프백을 건너 뛸 수도 있습니다. – omerkudat

+2

IP 주소 앞에 왜 슬래시가 있습니까? –

+1

@ Matías InetAddress 객체의 Java toString은 address.getHostAddress()를 사용하여 점으로 구분 된 숫자 만 가져옵니다. –

6

InetAddress.getLocalHost()를 사용하면 특정 인터페이스를 얻을 수 있다고 보장 할 수 없습니다. 루프백 (127) 인터페이스 또는 연결된 인터페이스를 수신 할 수 있습니다.

항상 외부 인터페이스를 사용하려면 java.net.NetworkInterface 클래스를 사용해야합니다. 정적 getByName (String) 클래스는 정의 된 이름 (예 : "eth0")을 가진 인터페이스를 제공합니다. 그런 다음 getInetAddresses() 함수를 사용하여 해당 인터페이스에 바인딩 된 IP 주소 (단 하나 일 수 있음)를 가져올 수 있습니다.

NetworkInterface ni = NetworkInterface.getByName("eth1"); 
ni.getInetAddresses(); 
2

/etc/host 파일을 확인하십시오. 먼저 127.0.0.1을 입력하면 결과로 반환됩니다.

올바른 주소는 NetworkInterface.getNetworkInterfaces()을 사용하고 각각 getInetAddresses()을 실행하는 것입니다.

-1

127.0.0.1 localhost 과 같이/etc/hosts에 줄이 있기 때문에 192.xxx가 있어야합니다.xxx.xxx localhost

이것은 리눅스 설정 파일을 수정하지 말아야 할 코드 문제를 해결하는 데 매우 좋지 않을 수 있습니다. 옳지 않은 것뿐만 아니라 리눅스 박스에서 다른 네트워크 인식 응용 프로그램을 깨뜨릴 위험성이 있습니다. 또한 다른 곳에서는 작동하지 않을 것입니다 (해당 상자의 관리자도 마음에 들지 않는 한).

InetAddress.getLocalHost(); javadoc read ".... 루프백 주소를 나타내는 InetAddress가 반환됩니다." 따라서 getLocalHost() 구현은 UNIX 및 WIN 상자에서 올바르지 않은 것처럼 보입니다. 루프백 주소가 거의 항상 127.0.0.1

이 주석을 찾았습니다. "호스트에 여러 개의 IP 주소가 있고 다른 호스트에서 연결할 수있는 주소가 다를 수 있습니다. 예를 들어 인트라넷의 호스트는 192.168.0.100을 사용해야 할 수 있습니다 외부 컴퓨터가 65.123.66.124를 사용해야 할 수도 있습니다. 다른 호스트에 대한 소켓 연결이있는 경우 Socket.getLocalAddress()를 호출하여 소켓에 사용 된 로컬 주소를 확인할 수 있습니다. "

0

NetworkInterface.getNetworkInterfaces() 메서드를 사용하면 시스템의 모든 네트워크 인터페이스 중에서 Enumeration을 검색 할 수 있습니다.

NetworkInterface 인스턴스 각각에 대해, 당신은 네트워크 인터페이스와 관련된 InetAddress 모든 인스턴스의 Enumeration를 검색 할 getInetAddresses() 방법을 사용할 수 있습니다.

마지막으로 각 InetAddress 인스턴스에서 getHostAddress() 메서드를 사용하여 텍스트 형식의 IP 주소를 검색 할 수 있습니다.

관련 문제