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

相关问题