network programming - saber - Puerta de enlace predeterminada en C en Linux
saber mis dns linux (3)
Creo que leer / proc / net / route será tu mejor apuesta. ¿Considerarías esto un "archivo"?
El formato de / proc / net / route es bien conocido, y en memoria, por lo que no hay penalización de E / S o miedo a este cambio (es decir, frente a leer algo de / etc / network / *)
¿Cómo se encuentra la puerta de enlace predeterminada de una tabla de enrutamiento con C en Linux?
No deseo emitir 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.
Probablemente necesite usar un socket NETLINK_ROUTE , 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''.
Puede usar / proc / net / route de esta manera:
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;
}