2013-11-26 4 views
0
/* program to print the IP address of the Host*/ 
------------------------------------------------ 

Я пытаюсь распечатать IP-адрес хоста. когда я выполняю следующую программу Я получаю обратный адрес обратной связи, который равен 127.0.0.1. Что я должен изменить, чтобы получить фактический IP-адрес .Получение адреса обратной связи вместо фактического адреса?

# include <stdio.h> 
# include <stdlib.h> 
# include <arpa/inet.h> 
# include <string.h> 
# include <sys/types.h> 
# include <sys/socket.h> 
# include <netdb.h> 
# include <netinet/in.h> 

int main()  { 

     void *addr; 
     char ipstr[INET6_ADDRSTRLEN]; 
     int rv; 
     struct addrinfo hints, *res, *p; 

     memset (&hints, 0, sizeof hints); 
     hints.ai_family = AF_UNSPEC; 
     hints.ai_socktype = SOCK_STREAM; 
     //hints.ai_flags = AI_ADDRCONFIG; 
     hints.ai_flags = AI_PASSIVE; 

     if ((rv = getaddrinfo(NULL ,"3490" , &hints, &res)) != 0) { 
       fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
       return 1; 
     } 

     for(p = res;p != NULL; p = p->ai_next) { 

       struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; 
       addr = &(ipv4->sin_addr); 
       inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); 
       printf(" %s\n", ipstr); 
     } 

} 
+0

Адрес обратной связи * это * фактический адрес. Если вы хотите получить адрес conencted * аппаратных * интерфейсов, тогда вам нужно прибегнуть к коду конкретной платформы. Есть много примеров, если вы просто ищете немного. –

+1

О, и кстати, что, если вы получите IPv6-адрес в списке? Тогда 'p-> ai_addr' не будет указателем' sockaddr_in', поэтому доступ к 'ipv4-> sin_addr' является неопределенным поведением. –

+0

Вы можете использовать 'getifaddrs()' для получения IP-адресов локальных интерфейсов, см. Здесь (например): http://stackoverflow.com/a/12883978/1187415. –

ответ

0

Пока ваша машина развития не подключена к сети, вы получите адрес замыкания на себя (что вполне допустимо для локальной сети, конечно). Как только вы подключите машину к сети, вы можете определить «правильный» адрес. ipconfig, кстати, ведет себя одинаково.

Если вы вызываете getaddrinfo с NULL для имени узла (первый параметр), это то же самое, что и при его вызове с помощью «localhost». Вы получите IP-адрес loopback. Однако, если вы используете «реальное» имя хоста, вы получите «реальный» ip.

+0

Моя машина в сети. когда я делаю ifconfig, я получаю два IP-адреса: 172.28.3.225 (фактический IP-адрес), а другой - это loopback-адрес, который равен 127.0.0.1.что я должен сделать, чтобы получить 172.28.3.225 – user3035481

+0

См. обновление (второй абзац). – JeffRSon

+0

Несомненно, вы можете, почему бы и нет? – JeffRSon

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