2009-02-13 29 views
9

Linux'ta C kullanarak bir yönlendirme tablosunun varsayılan ağ geçidini nasıl buluyorsunuz?Varsayılan Ağ Geçidi, Linux'ta

Kabuk için arama yapmak veya dosya okumak istemiyorum. Rotaları (SIOCADDRT, SIOCDELRT) eklemek ve silmek için ioctls vardır ve rotaları (SIOCGRTCONF) almak için başvuruda bulduk ama kullanıyorum çekirdeği sürümü SIOCGRTCONF desteklemiyor gibi görünüyor.

+0

NIC'lerde varsayılan ağ geçitleri yok, yönlendirme tabloları varsayılan ağ geçitleri vardır. – womble

cevap

5

Muhtemelen PF_NETLINK soket ailesinin bir parçası olan NETLINK_ROUTE soketini kullanmanız gerekecektir. 'Iproute' 'ip' program bölümünün kaynak kodunu kontrol edin. Özellikle, onun 'rota' alt komut.

+0

İşte örnek kodun bir bağlantısı. http://www.linuxquestions.org/questions/linux-networking-3/howto-find-gateway-adrough-code-397078/ Bunu bazı değişiklikler ile uyguladık ve iyi çalışıyor. – Matt

8

Okuma/proc/net/rota okuma en iyi seçim olacaktır. Bunu bir "dosya" olarak düşünür müsün?

/proc/net/güzergahın biçimi iyi bilinmektedir ve bellek içi, bu nedenle bu değişen hiçbir G/Ç ceza ya da korku yoktur (yani karşı/etc/network/* bir şey okuma)

3

Böyle/proc/net/rotayı kullanabilirsiniz:

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

Birden çok arabiriminiz varsa, 2. if deyiminde arabirim adını kontrol etmek daha mantıklıdır. – 3bdalla

+1

'strtoul' kullanılmalı, aksi halde bazı durumlarda taşma olacaktır. örneğin, varsayılan ağ geçidi FEFEFEA9'dur ('169.254.254.254'). "İmzasız uzun int ng = strtoul (g, & pEnd, 16) olmalıdır;" –

İlgili konular