Шлюз по умолчанию в C на Linux - PullRequest
       15

Шлюз по умолчанию в C на Linux

9 голосов
/ 14 февраля 2009

Как найти шлюз по умолчанию для таблицы маршрутизации с использованием C в Linux?

Я не хочу вызывать оболочку или читать файл. Существуют ioctl для добавления и удаления маршрутов (SIOCADDRT, SIOCDELRT), и я обнаружил ссылки на получение маршрутов (SIOCGRTCONF), но кажется, что используемая версия ядра не поддерживает SIOCGRTCONF.

Ответы [ 3 ]

8 голосов
/ 14 февраля 2009

Я думаю, что чтение / proc / net / route будет вашим лучшим выбором. Вы считаете это "файлом"?

Формат / proc / net / route хорошо известен и находится в оперативной памяти, поэтому нет штрафов за ввод-вывод или страха перед этим изменением (т. Е. По сравнению с чтением чего-либо из / etc / network / *)

5 голосов
/ 15 мая 2014

Вы можете использовать / 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;
}
5 голосов
/ 14 февраля 2009

Возможно, вам потребуется использовать NETLINK_ROUTE сокет, часть семейства сокетов PF_NETLINK Проверьте исходный код программной части ip в iproute. В частности, его подкоманда route.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...