对于一些网络应用程序的开发,多个socke分别在不同的接口上加入组播组,需要socket只在加入的那个接口上收发组播报文,而不理会其它接口上的报文。发送问题相对容易解决,通过IP_MULTICAST_IF选项就可以指定发送接口,处理接收就相对麻烦一点。
socket加入组播组,struct in_mreq中要求指定{group, interface},但是这个interface并没有作为接收报文时过滤条件,而只是用来在igmp query/response之类的应用中才用到。那么我们要求只在某个接口接收报文怎么做到呢,在linux下的方法是使用 SO_BINDTODEVICE socket option。SO_BINDTODEVICE不仅可以用数据报,也可以用于tcp,网络上说不可以用于package,没有试过。
绑定接口的代码很简单
-
char devname[]="your-device-name"
-
setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE, devname, sizeof(devname));
就可以搞定了。
另外常用的网络程序采用的方法是:创建一个socket,在多个接口加入组播组,通过接收pktinfo或者ctrol msg的方式获得接收报文来自的接口信息,这样,由于只有一个socket,就不会有接收到同一报文的多个复制。
阅读(4264) | 评论(0) | 转发(0) |