2011-11-18 3 views
5

나는 다음과 같은 코드 조각을 사용하여 멀티 캐스트 그룹에 연결을 시도하고있다 :멀티 캐스트 - 그런 장치

int flag_on = 1;    /* socket option flag */ 
    struct sockaddr_in mc_addr; /* socket address structure */ 
    char recv_str[MAX_LEN+1];  /* buffer to receive string */ 
    int recv_len;     /* length of string received */ 
    char* mc_addr_str;   /* multicast IP address */ 
    unsigned short mc_port;  /* multicast port */ 
    struct sockaddr_in from_addr; /* packet source */ 
    unsigned int from_len;  /* source addr length */ 


    mc_addr_str = ip;  /* arg 1: multicast ip address */ 
    mc_port = port; /* arg 2: multicast port number */ 

    /* validate the port range */ 
    if ((mc_port < MIN_PORT) || (mc_port > MAX_PORT)) { 
    fprintf(stderr, "Invalid port number argument %d.\n", 
      mc_port); 
    fprintf(stderr, "Valid range is between %d and %d.\n", 
      MIN_PORT, MAX_PORT); 
    exit(1); 
    } 

    /* create socket to join multicast group on */ 
// if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 
    if ((sock = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP)) < 0) { 
    perror("socket() failed"); 
    LOGE("*********Inside Join Multicast -- socket() failed*********"); 
    exit(1); 
    } 
    LOGE("Socket value = %d ",sock); 
    /* set reuse port to on to allow multiple binds per host */ 
    if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag_on, 
     sizeof(flag_on))) < 0) { 
    perror("setsockopt() failed"); 
    LOGE("*********Inside Join Multicast -- socketopt() failed*********"); 

    exit(1); 
    } 

    /* construct a multicast address structure */ 
    memset(&mc_addr, 0, sizeof(mc_addr)); 
    mc_addr.sin_family  = AF_INET; 
    mc_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    mc_addr.sin_port  = htons(mc_port); 

    /* bind to multicast address to socket */ 
    if ((bind(sock, (struct sockaddr *) &mc_addr, 
     sizeof(mc_addr))) < 0) { 
    perror("bind() failed"); 
    LOGE("*********Inside Join Multicast -- bind() failed*********"); 
    exit(1); 
    } 

    /* construct an IGMP join request structure */ 
    mc_req.imr_multiaddr.s_addr = inet_addr(mc_addr_str); 
    mc_req.imr_interface.s_addr = htonl(INADDR_ANY); 

    /* send an ADD MEMBERSHIP message via setsockopt */ 
    if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, 
     (void*) &mc_req, sizeof(mc_req))) < 0) { 
    perror("setsockopt() failed"); 
    LOGE("*********Inside Join Multicast -- socketopt2() failed*********"); 
    LOGE("Value of errno is %s",strerror(errno)); 
exit(1); 
    } 

내가받은 오류가 errno를의 값은 그러한 장치입니다.

나는 이것을 omap 보드에서 이식하려고합니다.

도와 주시겠습니까?

답변

11

자바 인터페이스를 사용하고 있었지만 매우 비슷한 문제가있었습니다. 제 경우에 어떤 인터페이스가 멀티 캐스트 패킷을 처리해야하는지 명시 적으로 밝힐 때까지 "No such device"오류가 발생했습니다. 제 경우에는 이더넷 인터페이스였습니다. 당신이 JNI를 사용하고 있기 때문에 는 다시이, 당신의 사건을 조용히되지 않으며, 또한 당신은 아마 eth0를 필요로하지 않기 때문에,하지만 난 그게 도움이 바랍니다 :

Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces(); 
NetworkInterface eth0 = null; 
while (enumeration.hasMoreElements() { 
    eth0 = enumeration.nextElement() 
    if (eth0.getName().equals("eth0")) { 
     //there is probably a better way to find ethernet interface 
     break; 
    } 
} 

InetAddress group = InetAddress.getByName(IP); 
MulticastSocket s = new MulticastSocket(PORT); 
s.setSoTimeout(10000); 
//s.joinGroup(group); //this will throw "No such device" exception 
s.joinGroup(new InetSocketAddress(group, PORT), eth0); // this works just fine 

for (int i = 0; i < 10; ++i) { 
    byte[] buf = new byte[8096]; 
    DatagramPacket recv = new DatagramPacket(buf, buf.length); 
    s.receive(recv); 
    System.out.println("Recieved " + recv.getLength() + " bytes."); 
} 

s.leaveGroup(group); 

그래서 나는 아이디어가 생각하면 그 당신은 하나 이상의 인터페이스를 가지고, 당신은 명시 적으로 당신이 사용하는 하나를 지정해야합니다.

+0

위대한 답이 내 문제를 해결했습니다. :) Thanks !! – info

+0

안드로이드에서 네트워크 인터페이스를 찾은 다음 그것을 사용하여 그룹에 합류했습니다. 이것이 없으면'joinGroup (group)'은'no such device'라는 오류 메시지와 함께 실패합니다. – praneetloke

+0

내 문제도 해결되었습니다. 감사합니다 – Semaphor

5

아마도 멀티 캐스트 트래픽에 대한 경로가 없을 것입니다. 사용해보기 :

route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0 
+0

나는 오래된 게시물을 알고 .. ..하지만 지금은 같은 문제가 있었어 .. – nimig

+0

Virtualbox VM에 Cloudstack을 배치했을 때 나는 어떻게 든 그것을 얻었습니다. – KWubbufetowicz