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,就不会有接收到同一报文的多个复制。