Android 多播-没有这样的设备

Android 多播-没有这样的设备,android,multicast,Android,Multicast,我正在尝试使用以下代码连接到多播组: 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 stri

我正在尝试使用以下代码连接到多播组:

 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);
  }
int flag_on=1;/*套接字选项标志*/
mc_addr中的结构sockaddr_;/*套接字地址结构*/
char recv_str[最大长度+1];/*接收字符串的缓冲区*/
内部记录;/*接收到的字符串长度*/
char*mc_addr_str;/*多播IP地址*/
无符号短mc_端口;/*多播端口*/
结构sockaddr_in from_addr;/*包源*/
来自_len;/*源地址长度*/
mc_addr_str=ip;/*arg 1:多播ip地址*/
mc_端口=端口;/*arg 2:多播端口号*/
/*验证端口范围*/
如果((mc_端口<最小_端口)| |(mc_端口>最大_端口)){
fprintf(stderr,“端口号参数%d无效。\n”,
mc_港);
fprintf(标准,“有效范围在%d和%d之间。\n”,
最小端口、最大端口);
出口(1);
}
/*创建套接字以加入上的多播组*/
//如果((sock=socket(PF_INET,sock_DGRAM,IPPROTO_UDP))<0){
如果((sock=socket(AF_INET,sock_DGRAM,IPPROTO_UDP))<0){
perror(“套接字()失败”);
LOGE(“*******内部加入多播--socket()失败*******”;
出口(1);
}
LOGE(“套接字值=%d”,sock);
/*将重用端口设置为on以允许每个主机进行多个绑定*/
如果((设置套接字选项)(套接字、SOL_套接字、SO_REUSEADDR,&flag_on,
sizeof(flag_on)))<0){
perror(“setsockopt()失败”);
LOGE(“*******内部加入多播--socketopt()失败*******”;
出口(1);
}
/*构造一个多播地址结构*/
memset(&mc_addr,0,sizeof(mc_addr));
mc_addr.sin_family=AF_INET;
mc_addr.sin_addr.s_addr=htonl(在任何情况下);
mc_addr.sin_port=htons(mc_port);
/*绑定到套接字的多播地址*/
如果(绑定(sock,(结构sockaddr*)和mc_addr,
sizeof(mc_addr)))<0){
perror(“绑定()失败”);
LOGE(“*******内部加入多播--bind()失败**********”;
出口(1);
}
/*构造一个IGMP连接请求结构*/
mc_req.imr_multiaddr.s_addr=inet_addr(mc_addr_str);
mc_req.imr_interface.s_addr=htonl(INADDR_ANY);
/*通过setsockopt发送添加会员信息*/
如果((设置SOCKOPT)(sock、IP协议、IP协议添加成员),
(无效*)&mc_请求,大小(mc_请求))<0){
perror(“setsockopt()失败”);
LOGE(“*******内部加入多播--socketopt2()失败*******”;
LOGE(“errno的值为%s”,strerror(errno));
出口(1);
}
我收到的错误是errno的值不是这样的设备

我试图在omap板上实现这一点-GB端口


您能帮忙吗。

我遇到了一个非常类似的问题,尽管我使用的是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);
Enumeration枚举=NetworkInterface.getNetworkInterfaces();
网络接口eth0=null;
while(枚举.hasMoreElements(){
eth0=enumeration.nextElement()
if(eth0.getName().equals(“eth0”)){
//可能有更好的方法找到以太网接口
打破
}
}
InetAddress组=InetAddress.getByName(IP);
MulticastSocket s=新的MulticastSocket(端口);
s、 setSoTimeout(10000);
//s、 joinGroup(group);//这将引发“无此类设备”异常
s、 joinGroup(新的InetSocketAddress(组,端口),eth0);//这很好用
对于(int i=0;i<10;++i){
字节[]buf=新字节[8096];
DatagramPacket recv=新的DatagramPacket(基本单位,基本单位长度);
s、 接收(recv);
System.out.println(“received”+recv.getLength()+“bytes”);
}
s、 对照组(组);

因此,我想,如果您有多个接口,您应该明确指定您使用的接口。

您可能没有多播流量的路由。请尝试:

route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0

找到网络接口并使用它加入组在Android上也很有效。如果没有这个
joinGroup(group)
将失败,并显示错误消息
没有这样的设备
。也解决了我的问题!谢谢我在Virtualbox VM上部署Cloudstack时不知怎么得到了它