2009-02-13 21 views
9

Wie finden Sie das Standardgateway einer Routingtabelle mit C unter Linux?Standardgateway in C unter Linux

Ich möchte keinen Aufruf an die Shell oder eine Datei lesen. Es gibt ioctls zum Hinzufügen und Löschen von Routen (SIOCADDRT, SIOCDELRT) und ich habe in Bezug auf den Erhalt von Routen (SIOCGRTCONF) gefunden, aber es scheint, dass die Version des Kernels, den ich verwende, SIOCGRTCONF nicht unterstützt.

+0

NICs haben keine Standard-Gateways, Routing-Tabellen haben Standard-Gateways. – womble

Antwort

5

Sie müssen wahrscheinlich eine NETLINK_ROUTE Buchse verwenden, die Teil der PF_NETLINK Familie von Sockeln ist. Sehen Sie sich den Quellcode des Programmteils 'ip' von 'iproute' an. Insbesondere der Unterbefehl route.

+0

Hier ist ein Link zum Beispielcode. http://www.linuxquestions.org/questions/linux-networking-3/howto-find-gateway-address-through-code-397078/ Ich habe dies mit einigen Modifikationen implementiert und es funktioniert gut. – Matt

8

Ich denke, dass Lesen/Proc/Net/Route Ihre beste Wette sein wird. Würden Sie das als "Datei" betrachten?

Das Format von/proc/net/route ist bekannt, und im Speicher, so gibt es keine E/A-Strafe oder Angst vor diesem Wechsel (dh gegen das Lese etwas von/etc/network/*)

3

könnten Sie verwenden/proc/net/route wie folgt aus:

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

Wenn Sie mehrere Schnittstellen haben, ist es sinnvoller, in der 2. if-Anweisung nach dem Schnittstellennamen zu suchen. – 3bdalla

+1

Es muss "strtoul" verwendet werden, sonst würde eine Situation überlaufen. Zum Beispiel ist das Standard-Gateway FEFEFEA9 ('169.254.254.254'). Es sollte 'unsigned long int ng = strtoul (g, & pEnd, 16) sein;' –