2014-12-19 2 views
5

MulticastSocket이 있고 소켓이 수신 대기중인 멀티 캐스트 그룹에 보낸 UDP (데이터 그램) 패킷을 수신하는 특정 스레드 (MulticastListenerThread)가있는 응용 프로그램을 만들고 있습니다. .Java UDP 멀티 캐스트, 패킷을 보낸 그룹 결정

이것은 작동합니다. 멀티 캐스트 그룹에 가입하여 해당 그룹에 메시지를 보내고 MulticastSocket을 통해 수신 할 수 있습니다.

그러나 수신기의 관점에서 어떤 멀티 캐스트 그룹에서 패킷을 받았는지 확인하고 싶습니다. 다음 코드는 나에게 패킷의 발신자의 주소를 제공하지 멀티 캐스트 그룹 :

DatagramPacket packet = new DatagramPacket(buf, buf.length); 
mlcSenderSocket.receive(packet); 
String src_addr = packet.getAddress().getHostAddress(); 

다음 패킷을 전송하는 코드가 될 때 :

InetAddress address = InetAddress.getByName(dest); 
packet = new DatagramPacket(payload, payload.length, 
    address, mlcEventPort); 
LLog.out(this,"[NC] MLC packet Sent to ev port MLC " + mlcEventPort 
    + " and to addr " + address); 
mlcSenderSocket.send(packet); 

이 가능한 모든 결정에가요 어느 그룹이 패킷을 보냈습니까?

편집 :

이것은 가능하지 않은 것으로 보입니다. 성능에 미치는 영향 (IoT 장치를 위해 일하고 있음)은 멀티 캐스트 그룹 (따라서 그룹 당 리스너 스레드) 당 소켓을 할당 할 수 있습니까? 잠재적으로 많은 그룹이 합쳐질 수 있습니다 (수십 또는 수백 조의 관점에서). 실행 가능하다면 조인 된 그룹 주소를 수동으로 어딘가에 유지하고 필요할 때 참조해야합니다. 다른 해결 방법에 대한 제안을 환영합니다!

+0

여러 개의 'MulticastSocket' 객체를 유지하려고하면 가입하려는 각 그룹에 하나씩 유지하는 것이 좋습니다. 소켓과 그룹 간의 연결을 추적하기는 쉽습니다. –

+0

나는 그것을 생각해 보았지만 과도하게 과도하게 보였습니다. 특히 잠재적으로 많은 그룹이 참여할 수 있었기 때문에 이것은 이론적으로 제한된 IoT 장치를 의미합니다. 그런 다음 MulticastSocket 당 리스너 스레드가 있어야 할 것입니다. 뭔가하지 않는 것이 좋습니다. –

답변

2

아니요 그룹이 패킷을 보냈습니다. 특정 IP 주소의 소켓이 패킷을 보내고 원본 IP 주소는 DatagramPacket에서 사용할 수 있습니다. 멀티 캐스트 패킷은 멀티 캐스트 그룹에서 가져온 것이 아니며, 은 멀티 캐스트 그룹에을 지정했습니다.

+0

나는 이해한다. 그러나 여전히 소켓은 특정 그룹에 가입했기 때문에 패킷을 받아 들일 수 있습니다. 따라서 어떤 레벨에서 패킷이 시작된 그룹에 대한 정보를 사용할 수 있어야합니까? 내 메인 포스트에 대한 의견과 마찬가지로, 소켓 당 하나의 그룹 만 있으면이 정보는 분명하지만 여러개 있습니다. –

+0

패킷을 보낸 소켓이 제로 그룹 또는 여러 개를 연결했을 수 있습니다. 따라서 어떤 그룹이 보낸 것인지에 대한 개념은 의미가 없습니다. 당신이 정말로 필요한 것은 패킷이 보내지는 그룹이다. * 그 정보는 C 레벨에서 사용할 수 있지만, 그것이 DatagramSocketChannel의 개정판에 나타나지 않는 한 자바 레벨에서 알지 못한다. ' – EJP

+0

불행합니다. 답장을 보내 주셔서 감사 드리며, 작은 글을 써서 주 게시물을 편집했습니다. –

0

네, 그것은 당신이 가입 할 수있는 사실 MulticastSocket 여러 그룹, 예를 들면 :

InetAddress group; 

MulticastSocket s=new MulticastSocket(12345); 
NetworkInterface ni=NetworkInterface.getByName("eth1"); 

group=InetAddress.getByName("239.255.10.10"); 
s.joinGroup(new InetSocketAddress(group,12345),ni); 

group=InetAddress.getByName("239.255.10.11"); 
s.joinGroup(new InetSocketAddress(group,12345),ni); 

당신은 다음과 같은 데이터 그램을받을 :

DatagramPacket datagram=s.receive(datagram); 

을 불행하게도 자바 API 호출이에 없다 DatagramPacket 개체는 보낸 사람이 두 그룹 중 어느 그룹을 대상으로했는지 결정할 수 있도록 허용합니다. 소켓에서받은 네트워크 인터페이스의 IP 주소와 보낸 사람의 IP 주소 (데이터 그램).

원하는대로하려면 MulticastSocket 개체를 여러 개 만들고 소켓 당 하나의 그룹을 청취해야합니다. 당신은 당신 자신의 쓰레드 나 NIO를 사용하여 그들 모두를 동시에들을 수 있습니다.

+0

네트워크 인터페이스의 IP 주소를 가져올 수 없습니다 자바에서 '수신되었다. 전송 된 IP 주소를 얻을 수 있습니다. – EJP

+0

물론 가능합니다. 바닐라 표준이며 소켓 객체에서 사용할 수 있습니다. 수신 된 데이터 그램에서 검색 할 수없는 MC 그룹 정보입니다. 제 텍스트는 당신이 어디에서 얻을 수 있는지에 대해 명확하지 않았습니다. 나는 그것을 분명히했다. –

+0

소켓이 바인드 된 인터페이스를 얻을 수 있습니다. * 인터페이스에 바인드 된 경우 *. INADDR_ANY에 바인딩 된 경우 일반적으로 그렇게 할 수 없습니다. – EJP

관련 문제