2009-02-13 61 views
9

如何在Linux上使用C查找路由表的默認網關?Linux中C上的默認網關

我不想發出調用shell或讀取文件。有添加和刪除路由的Ioctls(SIOCADDRT,SIOCDELRT),我發現參照獲取路由(SIOCGRTCONF),但似乎我使用的內核版本不支持SIOCGRTCONF。

+0

網卡沒有默認網關,路由表中有默認網關。 – womble 2009-02-14 01:26:19

回答

5

您可能需要使用NETLINK_ROUTE插座,作爲PF_NETLINK插座系列的一部分。查看'iproute'的'ip'程序部分的源代碼。具體來說,它的'路由'子命令。

+0

以下是示例代碼的鏈接。 http://www.linuxquestions.org/questions/linux-networking-3/howto-find-gateway-address-through-code-397078/ 我已經實施了一些修改,它運作良好。 – Matt 2009-02-17 20:11:05

8

我認爲閱讀/ proc/net/route將是您最好的選擇。你會認爲這是一個「文件」?

的/ proc /淨/路線的格式是衆所周知的,並且在內存中,所以有這個變化沒有I/O損失或恐懼(即對從/ etc /網絡/ *讀點)

3

你可以使用這樣的/ 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; 
} 
+1

如果您有多個接口,則更有意義的是在第二個if語句中檢查接口名稱。 – 3bdalla 2015-01-29 15:52:15