2009-02-13 17 views
9

¿Cómo se encuentra la puerta de enlace predeterminada de una tabla de enrutamiento con C en Linux?Puerta de enlace predeterminada en C en Linux

No deseo realizar una llamada al shell o leer un archivo. Hay ioctls para agregar y eliminar rutas (SIOCADDRT, SIOCDELRT) y he encontrado referencias para obtener rutas (SIOCGRTCONF), pero parece que la versión del kernel que estoy usando no es compatible con SIOCGRTCONF.

+0

NIC no tienen puertas de enlace predeterminada, tablas de enrutamiento tienen puertas de enlace predeterminada. – womble

Respuesta

5

Probablemente necesitará utilizar un socket NETLINK_ROUTE, que forma parte de la familia de sockets PF_NETLINK. Consulte el código fuente de la parte del programa 'ip' de 'iproute'. Específicamente, su subcomando 'ruta'.

+0

Aquí hay un enlace al código de muestra. http://www.linuxquestions.org/questions/linux-networking-3/howto-find-gateway-address-through-code-397078/ Lo he implementado con algunas modificaciones y funciona bien. – Matt

8

Creo que leer/proc/net/route será su mejor apuesta. ¿Considerarías esto un "archivo"?

El formato de/proc/net/ruta es bien conocida, y en memoria, así que no hay pena de E/S o el miedo de este cambio (es decir, frente a la lectura de algo/etc/network/*)

3

Usted podría utilizar/proc/net/route así:

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; 
} 
+1

Si tiene múltiples interfaces, tiene más sentido verificar el nombre de la interfaz en la segunda instrucción if. – 3bdalla

+1

Debe usar 'strtoul', de lo contrario, alguna situación sería desbordante. por ejemplo, la puerta de enlace predeterminada es FEFEFEA9 ('169.254.254.254'). Debe ser 'unsigned long int ng = strtoul (g, & pEND, 16);' –

Cuestiones relacionadas