• 主页
  • 系统维护与使用
  • 应用程序开发
  • 内核源代码
  • 驱动程序开发
  • CPU和硬件区
  • UNIX文化
  • Solaris
  • Power Linux

组播时若绑定到指定的IP地址后则无法收到组播消息

comman_wang 2007-05-20 09:42:28
我遇到以下的问题,希望能得到大家的指点,谢谢。

对于多网卡(多IP地址)组播时如果采用默认地址(htonl(INADDR_ANY))可以收到通过第一块网卡转发的多播消息,如果将其绑定到第二块网卡指定的IP地址后则就无法收到组播消息,不知是什么原因。

sockaddr_in addr;
sUdpMCastSock=socket(AF_INET,SOCK_DGRAM,0); //UDP socket
addr.sin_family=AF_INET;
addr.sin_port=htons(Multiport); //Local UDP socket port

//增加绑定指定IP地址
/*
if( 0 == inet_aton(LocalIP,&addr.sin_addr) )
{
shutdown(sUdpMCastSock,SD_BOTH );
CloseSocket(sUdpMCastSock);
sUdpMMCastSock=-10;

return 16;
}
//*/
//默认地址
addr.sin_addr.s_addr=htonl(INADDR_ANY);


if(bind(sUdpMCastSock,(struct sockaddr*)&addr,sizeof(sockaddr))== -1 )
{
shutdown(sUdpMCastSock,SD_BOTH );
CloseSocket(sUdpMCastSock);
sUdpMCastSock=-10;

return 2;
}


//加入多播组
inet_aton(MULTICASTIPADDR,&MultiCast_Group.imr_multiaddr);


//增加绑定指定IP地址
//*
if( 0 == inet_aton(LocalIP,&MultiCast_Group.imr_interface) )
{
shutdown(sUdpMCastSock,SD_BOTH );
CloseSocket(sUdpMCastSock);
sUdpMCastSock=-10;

return 26;
}
//*/
//默认地址
MultiCast_Group.imr_interface.s_addr=htonl(INADDR_ANY);

if( setsockopt(sUdpMCastSock,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&MultiCast_Group,sizeof(MultiCast_Group)) == -1 )
{
shutdown(sUdpMCastSock,SD_BOTH );
CloseSocket(sUdpMCastSock);
sUdpMCastSock=-10;
return 3;
}
...全文
760 点赞 收藏 12
写回复
12 条回复
liaojs2011 2011年10月25日
这个问题怎么解决啊,是不是内核支持问题?解决的高手请教下
回复 点赞
liuyilin888 2011年07月05日
顶,我今天也遇到这个问题了
回复 点赞
fervency 2007年06月18日
这个问题有人解决了吗,我也是刚刚遇到这个问题,我是一个网卡接收数据,另外一个网卡发送数据。
我只有两个网卡都使用INADDR_ANY时才能正常工作,当指定了接收网卡的地址后就无法收到数据了,当指定了发送网卡的地址后就无法发送数据了,这到底是怎么回事啊 ?
回复 点赞
Felix_yy 2007年05月30日
不大懂 不过楼主这样绑定的ip对么?addr.sin_addr.s_addr=htonl(INADDR_ANY);
回复 点赞
comman_wang 2007年05月24日
这个问题是这样发现的:
系统中只有一个交换机,第一块和第二块网卡都设有IP地址,开始我把网线接到第二块网卡上发现多播存在问题,改到第一块网卡上就好了,没有弄清楚是怎么回事。
回复 点赞
linaxing 2007年05月22日
如果不在同一子网的话,要注意:
1.多播地址的选择,224.0.0.0/24的地址是不会被router转发的
2.链接的两个子网的所有网络设备(router等)都必须支持多播
回复 点赞
comman_wang 2007年05月22日
具体情况如下:
在第一块网卡上网线已拔出的情况下,如果不绑定到指定的IP地址(第二块网卡的有效IP地址)的话【addr.sin_addr.s_addr=htonl(INADDR_ANY);】,发送数据失败(Network is unreachable),但可以接收到其他节点通过第二块网卡发送的数据;
如果绑定到指定的IP地址(第二块网卡的有效IP地址)的话【inet_aton(LocalIP,&addr.sin_addr);】,发送数据成功,但无法接收别的节点通过第二块网卡发送的数据,别的节点可以收到其通过第二块网卡发送的数据。

我的程序是这样设计的,每个节点的组播SOCKET既发送消息,同时也接收别的节点发送的消息,属于全双工通信,分别在两个不同的线程进行。
回复 点赞
seawill 2007年05月22日
碰到过同样的问题
回复 点赞
dai_weitao 2007年05月21日
帮支持一下, 不太懂
回复 点赞
linaxing 2007年05月21日
两块网卡都在同一子网里吗?
回复 点赞
rockefeller8 2007年05月21日
关注
回复 点赞
comman_wang 2007年05月21日
不在一个子网内,且如果第一个网卡的网线拔出,系统仍会默认到第一个网卡的IP地址上,奇怪!
是否和系统的网络路由的配置相关?如果相关,如何配置?请各位帮忙,谢谢!
回复 点赞
发动态
发帖子
Linux/Unix社区
创建于2007-08-27

7065

社区成员

7.3w+

社区内容

Linux/Unix社区 应用程序开发区
社区公告
暂无公告