2011-11-18 79 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板 - GB移植。

能否請你幫忙。

回答

11

我有一個非常類似的問題,雖然我用Java接口。 在我的情況下,我得到「沒有這樣的設備」的錯誤,直到我明確指出哪個接口應該處理組播數據包。就我而言,這是一個以太網接口。 同樣,這不平靜你的情況下,由於您使用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

大回答解決了我的問題:)謝謝! – 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

我知道it's舊的文章..但我剛纔有同樣的問題.. – nimig

+0

在VirtualBox的虛擬機部署CLOUDSTACK時,我不知怎麼把它 – KWubbufetowicz

相關問題