组播时若绑定到指定的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;
}
...全文
3119 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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地址上,奇怪!
是否和系统的网络路由的配置相关?如果相关,如何配置?请各位帮忙,谢谢!

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧