如何在Linux上使用C语言查找路由表的默认网关?
我不想调用shell或读取文件。有添加和删除路由的ioctl(SIOCADDRT,SIOCDELRT)以及我找到了一个获取路由的参考(SIOCGRTCONF),但似乎我正在使用的内核版本不支持SIOCGRTCONF。
如何在Linux上使用C语言查找路由表的默认网关?
我不想调用shell或读取文件。有添加和删除路由的ioctl(SIOCADDRT,SIOCDELRT)以及我找到了一个获取路由的参考(SIOCGRTCONF),但似乎我正在使用的内核版本不支持SIOCGRTCONF。
我认为阅读/proc/net/route将是最好的选择。你会认为这是一个“文件”吗?
/proc/net/route的格式是众所周知的,并且是内存中的,因此没有I/O惩罚或担心它的更改(即相对于从/etc/network/*读取某些内容)。
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;
}