Chinaunix首页 | 论坛 | 博客
  • 博客访问: 530789
  • 博文数量: 118
  • 博客积分: 2575
  • 博客等级: 大尉
  • 技术积分: 1263
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-27 09:37
文章分类

全部博文(118)

文章存档

2017年(11)

2016年(8)

2015年(1)

2014年(9)

2013年(7)

2012年(38)

2011年(14)

2010年(18)

2009年(12)

分类: LINUX

2014-04-17 16:42:52

对于一些网络应用程序的开发,多个socke分别在不同的接口上加入组播组,需要socket只在加入的那个接口上收发组播报文,而不理会其它接口上的报文。发送问题相对容易解决,通过IP_MULTICAST_IF选项就可以指定发送接口,处理接收就相对麻烦一点。

socket加入组播组,struct in_mreq中要求指定{group, interface},但是这个interface并没有作为接收报文时过滤条件,而只是用来在igmp query/response之类的应用中才用到。那么我们要求只在某个接口接收报文怎么做到呢,在linux下的方法是使用 SO_BINDTODEVICE socket option。SO_BINDTODEVICE不仅可以用数据报,也可以用于tcp,网络上说不可以用于package,没有试过。

绑定接口的代码很简单

  1. char devname[]="your-device-name"
  2. setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, devname, sizeof(devname));
就可以搞定了。

另外常用的网络程序采用的方法是:创建一个socket,在多个接口加入组播组,通过接收pktinfo或者ctrol msg的方式获得接收报文来自的接口信息,这样,由于只有一个socket,就不会有接收到同一报文的多个复制。

阅读(4264) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~