Network programming Linux上C语言中的默认网关

Network programming Linux上C语言中的默认网关,network-programming,Network Programming,如何在Linux上使用C查找路由表的默认网关 我不想对shell发出调用或读取文件。有用于添加和删除路由(SIOCADDRT、SIOCDELRT)的IOCTL,我在参考getting routes(SIOCGTCONF)中发现了IOCTL,但我使用的内核版本似乎不支持SIOCGTCONF。我认为reading/proc/net/route将是最好的选择。你认为这是“文件”吗? /proc/net/route的格式是众所周知的,并且在内存中,因此没有I/O惩罚或担心这种更改(即与从/etc/net

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


我不想对shell发出调用或读取文件。有用于添加和删除路由(SIOCADDRT、SIOCDELRT)的IOCTL,我在参考getting routes(SIOCGTCONF)中发现了IOCTL,但我使用的内核版本似乎不支持SIOCGTCONF。

我认为reading/proc/net/route将是最好的选择。你认为这是“文件”吗?
/proc/net/route的格式是众所周知的,并且在内存中,因此没有I/O惩罚或担心这种更改(即与从/etc/network/*读取内容相比)

您可能需要使用套接字,它是套接字家族的一部分。查看“iproute”的“ip”程序部分的源代码。特别是它的“路由”子命令

您可以像这样使用/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;
}

NIC没有默认网关,路由表有默认网关。我已经通过一些修改实现了这一点,并且它工作得很好。如果您有多个接口,那么在第二个If语句中检查接口名称更有意义。它必须使用“strtoul”,否则某些情况下会溢出。例如,默认网关是FEA9(“169.254.254.254”)。它应该是‘unsigned long int ng=strtoul(g,&pEnd,16);’