2011-11-18 8 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

私はJavaインターフェイスを使用していましたが、私は非常に似た問題を抱えていました。 私の場合、マルチキャストパケットを処理するインターフェイスを明示するまで、「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); 

だから私はアイデアがあればということだと思います1つ以上のインターフェースを持っている場合は、どのインターフェースを使用しているかを明示的に指定する必要があります。

+0

偉大な答えが私の問題を解決しました:)ありがとう!! – info

+0

Androidでネットワークインターフェースを見つけて、それを使ってグループに参加しました。この '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

私は何とかCloudstackをVirtualbox VM – KWubbufetowicz

関連する問題