如何在Linux上使用C查找路由表的默認網關?Linux中C上的默認網關
我不想發出調用shell或讀取文件。有添加和刪除路由的Ioctls(SIOCADDRT,SIOCDELRT),我發現參照獲取路由(SIOCGRTCONF),但似乎我使用的內核版本不支持SIOCGRTCONF。
如何在Linux上使用C查找路由表的默認網關?Linux中C上的默認網關
我不想發出調用shell或讀取文件。有添加和刪除路由的Ioctls(SIOCADDRT,SIOCDELRT),我發現參照獲取路由(SIOCGRTCONF),但似乎我使用的內核版本不支持SIOCGRTCONF。
您可能需要使用NETLINK_ROUTE插座,作爲PF_NETLINK插座系列的一部分。查看'iproute'的'ip'程序部分的源代碼。具體來說,它的'路由'子命令。
以下是示例代碼的鏈接。 http://www.linuxquestions.org/questions/linux-networking-3/howto-find-gateway-address-through-code-397078/ 我已經實施了一些修改,它運作良好。 – Matt 2009-02-17 20:11:05
我認爲閱讀/ proc/net/route將是您最好的選擇。你會認爲這是一個「文件」?
的/ proc /淨/路線的格式是衆所周知的,並且在內存中,所以有這個變化沒有I/O損失或恐懼(即對從/ etc /網絡/ *讀點)
你可以使用這樣的/ proc /淨/路線:
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;
}
如果您有多個接口,則更有意義的是在第二個if語句中檢查接口名稱。 – 3bdalla 2015-01-29 15:52:15
網卡沒有默認網關,路由表中有默認網關。 – womble 2009-02-14 01:26:19