当前位置: 代码迷 >> Android >> Android4.0无法加入组播组
  详细解决方案

Android4.0无法加入组播组

热度:84   发布时间:2016-05-01 10:54:38.0
求助:Android4.0无法加入组播组
一台ANDROID4.0的真机,不是模拟器,建立接收组播数据用的套接字,bind,setsockopt等等在代码层面上一切正常,但一直没有发现机器发出IGMP包
近乎同样的代码,在LINUX台式机上跑着一切正常,也的确是发出了IGMP的加入组播组的数据包。

有人说这个问题在于系统内核,但真机上是可以向组播组发包的,不知道这样是不是就可以判定内核是支持组播的。

busybox ifconfig eth0的结果是"UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1",不知道这样是不是也可以判定内核支持组播。

网上也有好多说法是对诸如对 ip_forward及icmp_echo_ignore_broadcasts的设置,本人不甚了解,乱试一通,无果。

各位大侠倘若哪怕有些许想法,也请不吝赐教。

源码奉上:


#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <map>
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h>
#include <errno.h>

#define GroupIP "224.7.7.7" //要加入的组播组
#define GroupPort 7777 //组播监听端口

int main(void)
{
int s; //套接字
struct sockaddr_in srv; //组播地址
struct ip_mreq mreq; //这儿也用ip_mreqn测试过,没有新发现。

//建立套接字
if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
{
printf("socket failed");
return false;
}

{//绑定IP
memset(&srv,0, sizeof(srv));
srv.sin_family = AF_INET;
srv.sin_port = htons(GroupPort);
if (inet_aton(GroupIP, &srv.sin_addr) < 0)
{
printf("inet_aton failed");
return false;
}
if (bind(s, (struct sockaddr *) &srv, sizeof(srv)) < 0)
{
close(s);
printf("bind failed");
return false;
}
}

{//加入组播组
if (inet_aton(GroupIP, &mreq.imr_multiaddr) < 0)
{
close(s);
printf("inet_aton failed");
return false;
}
inet_aton("192.168.15.55", &mreq.imr_interface);//"192.168.15.55"是本机IP,如果指定INADDR_ANY需要配置路由。

unsigned char ttl=200;
setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));

int errorSetSockOpt=setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
if ( errorSetSockOpt< 0)
{
close(s);
printf("join failed:%d:%d",errorSetSockOpt,errno);
return false;
}
}

{//等待一段时间,传说立即退出的话,即便正常的系统也不会发出IGMP
sleep(1);
}

{//退出组播组
if ((setsockopt(s, IPPROTO_IP, IP_DROP_MEMBERSHIP, (void*) &mreq, sizeof(mreq))) < 0)
{
printf("drop failed:%d",errno); 
close(s);
return false;
}else
{
printf("drop successed"); 
}
}
close(s);
return true;
}

android socket 组播???无法加入

------解决方案--------------------
你换个别的手机试试 比如2.3或者2.2的 确认是所有手机都不行 还是某一个手机不行 然后再着重解决
------解决方案--------------------
我用C实现了多播,但是丢包很严重
  相关解决方案