2015-03-25 1 views
2

У меня есть ip, подсеть и широковещательный адрес, используя вызов ioctl. , но не знаю, как получить шлюз по умолчанию и сервер имен. если я возьму сервер имен от /etc/resolv.conf, тогда он надежен?Как получить IP-адрес шлюза и ip-сервера имен с помощью ioctl в linux

Вот мой код:

int main(void) 
{ 
char buf[1024]; 
struct ifconf ifc; 
struct ifreq *ifr; 
int sck, nInterfaces; 
int i; 
unsigned char mac[6]; 

sck = socket(AF_INET, SOCK_DGRAM, 0); 
if(sck < 0) 
{ 
    perror("socket"); 
    return 1; 
} 

ifc.ifc_len = sizeof(buf); 
ifc.ifc_buf = buf; 
if(ioctl(sck, SIOCGIFCONF, &ifc) < 0) 
{ 
    perror("ioctl(SIOCGIFCONF)"); 
    return 1; 
} 

ifr = ifc.ifc_req; 
nInterfaces = ifc.ifc_len/sizeof(struct ifreq); 
for(i = 0; i < nInterfaces; i++) 
{ 
    struct ifreq *item = &ifr[i]; 
    printf("Interface Name = %s\nIP = %s\n", 
      item->ifr_name, 
      inet_ntoa(((struct sockaddr_in *)&item->ifr_addr)->sin_addr)); 

    ioctl(sck, SIOCGIFNETMASK, item); 
    printf("SubNet Mask = %s\n", inet_ntoa(((struct sockaddr_in *)&item->ifr_netmask)->sin_addr)); 

    ioctl(sck, SIOCGIFBRDADDR, item); 
    printf("BroadCat Address = %s\n", inet_ntoa(((struct sockaddr_in *)&item->ifr_broadaddr)->sin_addr)); 

    ioctl(sck, SIOCGIFHWADDR, item); 
    memcpy(mac, item->ifr_hwaddr.sa_data, 6); 
    printf("MAC:%02X:%02X:%02X:%02X:%02X:%02X\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); 
} 
return 0; 
} 
+1

Вы не можете получить сервер имен с ioctl, потому что разрешение имени не обрабатывается ядром. Он живет в глубинах библиотеки glibc. – myaut

+0

@myaut: Но как насчет шлюза? то откуда я могу получить IP-адрес сервера имен? можешь мне помочь?? –

+0

проверьте следующий код - [link] (http://www.linuxquestions.org/questions/linux-networking-3/howto-find-gateway-address-through-code-397078/#post4913964) –

ответ

1

Чтобы получить шлюз по умолчанию можно разобрать /proc/net/route:

# cat /proc/net/route 
Iface Destination  Gateway   Flags RefCnt Use  Metric Mask MTU  Window IRTT 
eth0 00000000  010110AC  0003 0  0  0  000000000  0  0 

Если вам нужно адрес сервера имен, разбор /etc/resolv.conf кажется надежным вариантом для меня.

+0

Будьте осторожны, когда используя '/ etc/resolv.conf', в моем случае DHCPCD переопределяет серверы имен (выполните' resolvconf -l'), которые перечислены в '/ etc/resolv.conf', не обновляя этот файл. Поэтому используемые фактические серверы имен отличаются от того, что указано в конфигурации. – Yeti

+0

@Yeti Возможно, вы установили 'nohook resolv.conf' в конфигурацию DHCPCD. Этот параметр запрещает DHCPCD обновлять файл. –