指定接口收组播报文

4480阅读 0评论2014-04-17 areece
分类:LINUX

对于一些网络应用程序的开发,多个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,就不会有接收到同一报文的多个复制。

上一篇:才发现很久没有写东西了。
下一篇:[vxworks] netstack SMP support