Linux 上 C 语言的默认网关

问题描述 投票:0回答:3

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

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

network-programming
3个回答
13
投票

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

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


8
投票

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


8
投票

你可以像这样使用/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;
                    unsigned long ng=strtoul(g,&pEnd,16);
                    struct in_addr addr;
                    addr.s_addr=ng;
                    gw=std::string( inet_ntoa(addr) );
                    nRet=0;
                }
                break;
            }
        }
    }

    fclose(f);
    return nRet;
}
© www.soinside.com 2019 - 2024. All rights reserved.