2009-10-15 2 views
2

Как получить IP-адрес локальной машины с помощью кода C?C код для получения IP-адреса

Если есть несколько интерфейсов, я должен иметь возможность отображать IP-адрес каждого интерфейса.

ПРИМЕЧАНИЕ: Не используйте такие команды, как IFCONFIG в коде C для получения IP-адреса.

+2

Домашнее задание? Что у вас есть до сих пор? – GManNickG

+0

Вы должны отметить, что в производственном коде, использующем 'ifconfig', не самое худшее решение. –

+0

Не волнуйтесь, это не моя домашняя головоломка .... Я становлюсь более вовлеченным в какое-то серьезное программирование на C, в результате пытаюсь исправить недостающие ссылки в моем приложении .... – codingfreak

ответ

3

С входами от Michael Foukarakis я могу показать IP-адрес для различных интерфейсов на одной и той же машине:

#include <arpa/inet.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <ifaddrs.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int 
main(int argc, char *argv[]) 
{ 
    struct ifaddrs *ifaddr, *ifa; 
    int family, s; 
    char host[NI_MAXHOST]; 

    if (getifaddrs(&ifaddr) == -1) { 
     perror("getifaddrs"); 
     exit(EXIT_FAILURE); 
    } 

    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { 
     family = ifa->ifa_addr->sa_family; 

     if (family == AF_INET) { 
      s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), 
              host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); 
      if (s != 0) { 
       printf("getnameinfo() failed: %s\n", gai_strerror(s)); 
       exit(EXIT_FAILURE); 
      } 
      printf("<Interface>: %s \t <Address> %s\n", ifa->ifa_name, host); 
     } 
    } 
    return 0; 
} 
10
#include <stdio.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <netinet/in.h> 
#include <net/if.h> 

int main() 
{ 
    int fd; 
    struct ifreq ifr; 

    fd = socket(AF_INET, SOCK_DGRAM, 0); 

    ifr.ifr_addr.sa_family = AF_INET; 

    snprintf(ifr.ifr_name, IFNAMSIZ, "eth0"); 

    ioctl(fd, SIOCGIFADDR, &ifr); 

    /* and more importantly */ 
    printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); 

    close(fd); 
} 

Если вы хотите, чтобы перечислить все интерфейсы, посмотрите на функцию getifaddrs() - если вы на Linux.

-1

Получите информацию о всех интерфейсах от «/ proc/net/dev». Примечание: он не может использовать все интерфейсы только с помощью ioctl.

#define PROC_NETDEV "/proc/net/dev" 

fp = fopen(PROC_NETDEV, "r"); 
while (NULL != fgets(buf, sizeof buf, fp)) { 
    s = strchr(buf, ':'); 
    *s = '\0'; 
    s = buf; 

    // Filter all space ' ' here 
    got one interface name here, continue for others 
} 
fclose(fp); 

Тогда получите адрес, используя IOCTL():

struct ifreq ifr; 
struct ifreq ifr_copy; 
struct sockaddr_in *sin; 

for each interface name { 
    strncpy(ifr.ifr_name, ifi->name, sizeof(ifr.ifr_name) - 1); 
    ifr_copy = ifr; 
    ioctl(fd, SIOCGIFFLAGS, &ifr_copy); 
    ifi->flags = ifr_copy.ifr_flags; 
    ioctl(fd, SIOCGIFADDR, &ifr_copy); 
    sin = (struct sockaddr_in*)&ifr_copy.ifr_addr; 
    ifi->addr = allocating address memory here 
    bzero(ifi->addr, sizeof *ifi->addr); 
    *(struct sockaddr_in*)ifi->addr = *sin; 

    /* Here also you could get netmask and hwaddr. */ 
} 
+0

посмотреть другие сообщения, как откройте "fd" – Test

Смежные вопросы