13

如何在 Linux 上使用 C 找到路由表的默认网关?

我不想调用 shell 或读取文件。有用于添加和删除路由(SIOCADDRT,SIOCDELRT)的 ioctl,我在参考获取路由(SIOCGRTCONF)时找到了,但似乎我使用的内核版本不支持 SIOCGRTCONF。

4

3 回答 3

10

我认为阅读 /proc/net/route 将是您最好的选择。你会认为这是一个“文件”吗?

/proc/net/route 的格式是众所周知的,并且在内存中,因此没有 I/O 损失或担心这种变化(即与从 /etc/network/* 读取内容相比)

于 2009-02-13T23:34:54.200 回答
6

您可能需要使用NETLINK_ROUTE套接字,它是PF_NETLINK系列套接字的一部分。查看“iproute”的“ip”程序部分的源代码。具体来说,它的“路线”子命令。

于 2009-02-13T23:40:36.870 回答
6

你可以像这样使用/proc/net/route:

int GetDefaultGw ( std::string & gw )
{
    FILE *f;
    char line[100] , *p , *c, *g, *saveptr;
    int nRet=1;

    f = fopen("/proc/net/route" , "r");

    while(fgets(line , 100 , f))
    {
        p = strtok_r(line , " \t", &saveptr);
        c = strtok_r(NULL , " \t", &saveptr);
        g = strtok_r(NULL , " \t", &saveptr);

        if(p!=NULL && c!=NULL)
        {
            if(strcmp(c , "00000000") == 0)
            {
                //printf("Default interface is : %s \n" , p);
                if (g)
                {
                    char *pEnd;
                    int ng=strtol(g,&pEnd,16);
                    //ng=ntohl(ng);
                    struct in_addr addr;
                    addr.s_addr=ng;
                    gw=std::string( inet_ntoa(addr) );
                    nRet=0;
                }
                break;
            }
        }
    }

    fclose(f);
    return nRet;
}
于 2014-05-15T07:05:37.037 回答