2013-08-29 1 views
2

원격 서버에 (tcp를 통해) 연결하는 데 사용되는 로컬 IP 주소를 알아야하는 클라이언트 Java 프로그램을 작성하고 있습니다.getLocalAddress는 연결된 소켓에서 127.0.0.1을 반환합니다.

문제는 ... 사건/PC의 대부분에서 잘 작동하는 동안 전화 Socket.getLocalAddress(). getHostAddress()가, 127.0.0.1 (만 드문 경우) 잘못 반환한다는 것입니다

public static String getLocalIPAddress(String serverIP, int port) throws UnknownHostException 
{ 
    System.out.println("Executing getLocalIPAddress on "+serverIP + ":" + port); 
    InetAddress inetAddress = InetAddress.getLocalHost(); 
    String ipAddress = inetAddress.getHostAddress(); 
    try { 
    Socket s = new Socket(serverIP, port); 
    ipAddress = s.getLocalAddress().getHostAddress(); 
    System.out.println("Local IP : "+s.getLocalAddress().getHostAddress()); 
    s.close(); 
    } catch (Exception ex) {} 
return ipAddress; 
} 

I가 계속되는 경우에 수득 출력은 I가 실패한 경우에 수득 출력은 0123이다

Executing getLocalIPAddress... 
Executing getLocalIPAddress on 1.2.3.4:80 
Local IP : 6.7.8.9 

이다 : 여기에 사용 된 코드의 단편이다

Executing getLocalIPAddress... 
Executing getLocalIPAddress on 1.2.3.4:80 
Local IP : 127.0.0.1 

실패한 경우에는 예외가 발생하지 않았습니다.

모든 조언은 매우 감사하겠습니다.

+0

당신은 로컬 IP를 의미합니까 : ... [link] (http://www.whatismyip.com)에 갔을 때와 같은 것이 따라야합니까? – lukey

+1

원격 주소가 원격입니까? 또는 127.0.0.1입니까? 로컬 주소와 함께 원격 주소를 인쇄하는 것이 좋습니다. 둘 다 127.0.0.1 인 경우 여기에서 문제를 해결할 수 있습니다. – EJP

+0

예 : 로컬 주소가 6.7.8.9이고 원격 주소가 1.2.3.4 인 경우 – MDot

답변

0

Socket.getLocalAddress()은 소켓이 바인딩 된 로컬 주소를 반환합니다. 따라서 "127.0.0.1"은 소켓이 루프백 인터페이스에 묶여 있음을 나타냅니다. 마찬가지로 "6.7.8.9"는 소켓이 "6.7.8.9"의 주소를 가진 클라이언트의 다른 인터페이스에 묶여 있음을 의미합니다. 바인딩에 사용되는 클라이언트 측에서 로컬 주소와 포트를 지정하는

한 가지 방법은, 당신은을 지정

Socket s = new Socket(serverIP, port, InetAddress.getLocalHost(), 0); 

을 사용할 수 있습니다 사용자가 제공 한 예에서 the following constructor

Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 

을 사용하는 것입니다 클라이언트 소켓 바인딩을위한 로컬 호스트 IP 주소 (루프백 주소가 아닌). 위의 예를 테스트 한 결과 작동합니다.

+0

수동으로 처리해야하는 이상한 라우팅이 없으면 로컬 바인드 주소를 지정할 필요가 없습니다. VPN. 이 소켓이 127.0.0.1에 바인드된다는 사실은 실제로 처음부터 문제가되지 않습니다. – EJP

+0

나는 동의하지만, 질문 포스터가 바인딩에 루프백 주소를 사용하는 것에 대해 우려하는 것 같습니다. 더 많은 정보가 실제 시나리오에 제공 될 수 있다면 좋을 것입니다. – btcc

+0

전혀 그렇게 보이지 않습니다. 그는 로컬 바인드 주소를 지정하려고 시도하지 않습니다. 그는 기본적으로 자신이 구속력있는 주소에 대해 어떤 이유로 걱정하고 있습니다. – EJP

관련 문제