2016-06-14 6 views
3

다음 코드는 나에게 로컬로만 작동합니다. 나는 다른 프로그램에서 같은 기계로 그것을받을 수있다. wireshark에서 트래픽이 보이지 않습니다 (Windows). 멀티 캐스트 주소를 10.10.10.10과 같은 기존 주소로 변경하면 wireshark에 UDP 패킷이 표시됩니다.DatagramSocket가 멀티 캐스트 주소로 네트워크를 통해 전송하지 않는 이유는 무엇입니까?

wireshark에서는 필터 udp.port == 5353을 사용합니다. wireshark 설정이 올바른 멀티 캐스트 주소로 다른 패킷을 볼 수 있습니다.

방화벽이 비활성화되었습니다.

public static void main(String[] args) throws Exception { 
    byte[] buf = "some data".getBytes(); 
    DatagramSocket socket = new DatagramSocket(); 
    InetAddress address = InetAddress.getByName("224.0.0.251"); 
    socket.send(new DatagramPacket(buf, buf.length, address, 5353)); 
} 

편집 : 원인은 루프백 어댑터 (Microsoft Loopbackadapter für KM-TEST) 인 것 같습니다. 루프백 어댑터를 제거하면 작동합니다. 다른 시스템에는 동등한 문제를 일으킬 수있는 VMware 어댑터가 있습니다.

패킷이 모든 네트워크 어댑터로 전송되지 않는 이유는 무엇입니까? 올바른 어댑터로 보내려면 어떻게해야합니까?

+1

당신의 네트워크 설정은? 넷 마스크 란 무엇입니까? –

+0

@BoristheSpider 제 편집을보세요. – Horcrux7

답변

1

유니 캐스트 데이터 그램을 보낼 때 라우팅 테이블은 패킷을 보내는 데 사용되는 네트워크 인터페이스를 지정합니다. 멀티 캐스트의 경우 인터페이스를 지정해야합니다. MulticastSocket을 사용하면됩니다.

당신이 보내려는 인터페이스의 IP가 10.10.10.1라고 가정하면, 다음을 수행하게

public static void main(String[] args) throws Exception { 
    byte[] buf = "some data".getBytes(); 
    MulticastSocket socket = new MulticastSocket(); 
    socket.setNetworkInterface(NetworkInterface.getByInetAddress(
           InetAddress.getByName("10.10.10.1"))); 
    InetAddress address = InetAddress.getByName("224.0.0.251"); 
    socket.send(new DatagramPacket(buf, buf.length, address, 5353)); 
} 
+0

멀티 캐스트 주소 범위에 대한 기본 경로가 아닌 경우 인터페이스를 지정하면됩니다. – EJP

+0

@EJP 멀티 캐스트의 경우 일반적으로 기본 경로가 없습니다. – Horcrux7

+0

@dbush 감사합니다. 지금 모든 유효한 네트워크 인터페이스로 보내면 작동합니다. – Horcrux7

1

224.0.0/24 reserved이다 아니라고

로컬 네트워크 제어 블록 (224.0.0/24)가 로컬 네트워크 제어 블록에

주소 프로토콜 제어 트래픽에 사용 링크에서 전달되었습니다.

사용할 수 없습니다.

+0

예, 멀티 캐스트 주소의 범위입니다. – Horcrux7

+1

@ Horcrux7 아니오, 멀티 캐스트 주소의 로컬 네트워크 제어 블록 * 하위 * 범위 범위입니다. – EJP

1

@EJP는 정확합니다. 해당 주소를 멀티 캐스트 주소로 사용할 수 없습니다.

224.0.0.0과 224.0.0.255 (포함) 사이의 어드레스의 범위는, 는 게이트웨이 발견 및 그룹 멤버쉽과 같은 라우팅 프로토콜 및 기타 저수준 토폴로지 검색하거나 관리 프로토콜의 사용을 위해 예약 보고. 멀티 캐스트 라우터는 해당 범위의 대상 주소를 가진 멀티 캐스트 데이터 그램 인 을 해당 TTL에 관계없이 전달해서는 안됩니다.

출처 : IANA - 즉 IPv4 Multicast Address Space Registry

, 선택한 멀티 캐스트 주소 해야하지 작업이 멀티 캐스트 주소의 범위에있다하더라도.

+0

멀티 캐스트 DNS의 주소입니다. 그러나 이것은 다른 주제이며 문제와 관련이 없습니다.https://en.wikipedia.org/wiki/Multicast_DNS – Horcrux7

+1

@ Horcrux7 RFC에 대해 위키 백과를 인용 할 수는 없습니다. 그리고 [위키 백과는 신뢰할 수있는 자료가 아닙니다] (https://en.m.wikipedia.org/wiki/Wikipedia:Wikipedia_is_not_a_reliable_source). mDNS를 사용하려는 경우 Java에서 할 수없는 MAC 주소 설정 방법을 찾아야합니다. – EJP

+0

@EJP MAC 주소 설정으로 무엇을 의미합니까? 지금 일하고있다. – Horcrux7