一台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实现了多播,但是丢包很严重