2012-08-03 2 views
7

자바에서는 기본 게이트웨이에 도달하는 데 사용되는 인터페이스와 일치하는 java.net.NetworkInterface를 찾고 싶습니다. 인터페이스 이름 등은 미리 알 수 없습니다.Java 기본 게이트웨이에 대한 네트워크 인터페이스를 찾는

$ netstat -r 
Kernel IP routing table 
Destination  Gateway   Genmask   Flags MSS Window irtt Iface 
10.10.10.0  *    255.255.255.0 U   0 0   0 bond0 
10.10.11.0  *    255.255.255.0 U   0 0   0 eth2 
10.10.11.0  *    255.255.255.0 U   0 0   0 eth3 
10.10.12.0  *    255.255.255.0 U   0 0   0 eth4 
10.10.13.0  *    255.255.255.0 U   0 0   0 eth5 
default   mygateway  0.0.0.0   UG  0 0   0 bond0 

일부 구글 검색을 수행 한 후, 난 아직 어떤 대답을 발견하지 않았습니다 : 다음 내 라우팅 테이블 인 경우

다른-즉

는, 나는 "본드"에 해당하는 인터페이스를 원하는 것입니다.

편집 :
자바 런타임이이 정보를 얻는 방법 (이 노출 된 것으로 표시 할 수 없습니다) "알고있다"해야합니다. join (InetAddress grpAddr) 호출 (인터페이스를 지정하지 않음)을 사용하여 java.net.MulticastSocket을 멀티 캐스트 그룹에 조인 할 때 명백한 동작은 위에서 정의한대로 "기본"인터페이스에 조인하는 것처럼 보입니다. 이는 기본 intf가 라우팅 테이블에 나열된 첫 번째 인터페이스가 아닌 경우에도 작동합니다. 암시의 INTF, 자바 플랫폼을 필요로하지 않는 멀티 캐스트 그룹에 가입하는 방법을 제공함으로써 : 그러나, mcast 멀티 그룹에 합류 기본 POSIX 호출이 정보! :

struct ip_mreqn group; 
group.imr_multiaddr = ... 
group.imr_address = **address of the interface!** 
setsockopty(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &group, sizeof(group)); 

이 필요 각 플랫폼에서 적절한 intf를 결정하는 방법을 알아야합니다.

답변

0

필자가 아는 한, Java를 크로스 플랫폼 방식으로 구현하기에는 매우 낮은 수준의 세부 사항이 매우 어렵 기 때문에이 방법을 사용할 수 없습니다. java.net.NetworkInterface가 조금 도움이 될 수 있지만 사용 가능한 메소드가 충분하지 않은 경우 조금 더 이상한 것을 사용해야 할 수도 있습니다.

이것은 지정된 플랫폼에서 영원히 돌아갈 것입니까, 아니면 더 휴대 가능해야합니까? 최악의 경우 시스템 명령을 실행하고 출력을 파싱하려고 시도 할 수 있지만 이식성이 좋지 않거나 안정적이지는 않습니다.

일부 관련 주제 :

Is it possible to get the default gateway IP and MAC addresses in java?

Finding SSID of a wireless network with Java

+0

위의 수정보기 ... – Josh

+0

확인, 귀하의 요점을 참조하십시오. 그러나 그 전화는 여전히 주소가 필요합니다, 네? java.net.NetworkInterface는 인터페이스 (및 그 주소)를 얻을 수 있으며 약간의 영리가 주어진 주소를 소유하고있는지를 결정할 수 있습니다. 나는 당신의 문제가 더 복잡하다고 생각한다. 왜냐하면 먼저 하위 라우팅 정보를 찾고 그 다음으로 (기본) 라우트와 연관된 인터페이스를 찾아야하기 때문이다. – Carl

+0

멀티 캐스트 주소 (즉, 224.xxx-239.xxx의 특수 주소)가 필요하며 인터페이스 주소는 필요하지 않습니다. 인수에는 그러한 정보가 제공되지 않습니다. 따라서 "조인"콜을 해결해야하는 문제는 같습니다. 그것은 마술처럼 기본 경로 (명백한 행동)로 하나를 선택합니다. 마찬가지로 어떤 인터페이스에 기본 경로가 있는지 알고 싶습니다. – Josh

4

내 방법은 다음과 같습니다 때문에 데이터 그램 (UDP)를 사용

try(DatagramSocket s=new DatagramSocket()) 
{ 
    s.connect(InetAddress.getByAddress(new byte[]{1,1,1,1}), 0); 
    return NetworkInterface.getByInetAddress(s.getLocalAddress()).getHardwareAddress(); 
} 

, 그것은 어디서나 연결되지

, 그래서 포트 번호는 의미가 없으며 원격 주소 ( 1.1.1.1)는 연결할 수없고 라우팅 만 할 필요는 없습니다.

+0

내 경험에 의하면 Windows 및 ipv6에서 작동하지 않습니다. getLocalAddress는 v6 소켓으로 바인딩되었지만 가짜 v4 주소를 반환합니다. – the8472

+0

이 코드는 MAC 주소 만 표시합니다. – Razavi

+0

Windows10 및 Hyper-V에서 Microsoft-android-emulator, docker 및 OpenVPN을 사용하여 나를 위해 작동합니다. – AlexS

관련 문제