通过SIOCADDRT添加默认网关时需要指定接口

3
我正在尝试通过SIOCADDRTioctl()来设置我的机器默认网关。我在网上找到了下面的代码片段,可以正常工作:
int fd = socket( PF_INET, SOCK_DGRAM, IPPROTO_IP );

struct rtentry route;
memset( &route, 0, sizeof( route ) );

struct sockaddr_in *addr = (struct sockaddr_in *)&route.rt_gateway;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = inet_addr( "10.0.2.2" );

addr = (struct sockaddr_in*) &route.rt_dst;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = INADDR_ANY;

addr = (struct sockaddr_in*) &route.rt_genmask;
addr->sin_family = AF_INET;
addr->sin_addr.s_addr = INADDR_ANY;

// TODO Add the interface name to the request
route.rt_flags = RTF_UP | RTF_GATEWAY;
route.rt_metric = 0;

int rc = ioctl( fd, SIOCADDRT, &route );
// [...]

现在来看这段代码中的TODO...如何指定要使用哪个接口?当我执行这段代码时,它似乎默认使用我的机器上的eth0(这是我的唯一接口)。在route.h头文件中,rt_entry结构体的定义如下(也可在此处找到):
   /* This structure gets passed by the SIOCADDRT and SIOCDELRT calls. */
   struct rtentry {
    unsigned long   rt_pad1;
    struct sockaddr rt_dst;     /* target address       */
    struct sockaddr rt_gateway; /* gateway addr (RTF_GATEWAY)   */
    struct sockaddr rt_genmask; /* target network mask (IP) */
    unsigned short  rt_flags;
    short       rt_pad2;
    unsigned long   rt_pad3;
    void        *rt_pad4;
    short       rt_metric;  /* +1 for binary compatibility! */
    char *rt_dev;   /* forcing the device at add    */
    unsigned long   rt_mtu;     /* per route MTU/Window     */
    #define rt_mss  rt_mtu          /* Compatibility :-(            */
    unsigned long   rt_window;  /* Window clamping      */
    unsigned short  rt_irtt;    /* Initial RTT          */
};

thx for any help.

1个回答

4
显然,你可以使用两个字段来指定接口:

struct ifnet *rt_ifp;

struct ifaddr *rt_ifa;

这两个字段表示路由查找所提出的问题的“答案”,它们命名了要用于将数据包发送到此路由所代表的目标或一组目标的接口和接口地址。

更新: 结构体中有一个rt_dev字段,我认为您可以将其设置为接口名称。
char ifname[] = "eth1";
rtentry.rt_dev = ifname;

我也在网上的规格中看到了这些标志,但我的标题版本没有这些字段。我会编辑我的问题。 - DeX3
我的也不行,我认为是 rt_dev,但不确定如何设置,可能是一个接口索引,你可以试试吗? - iabdalkader
1
它实际上是一个 char*,所以我认为这就是接口名称。 - iabdalkader
哎呀,可能是我没注意到那个,现在去试试看。 - DeX3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接