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 * hardware * 인터페이스의 주소를 얻으려면 플랫폼 특정 코드를 사용해야합니다. 당신이 조금만 검색하면 많은 예가 있습니다. –

+1

그런데 목록에서 IPv6 주소를 얻으면 어떻게 될까요? 그러면'p-> ai_addr'은'sockaddr_in' 포인터가 아니기 때문에'ipv4-> sin_addr'에 접근하는 것은 정의되지 않은 행동입니다. –

+0

'getifaddrs()'를 사용하여 로컬 인터페이스의 IP 주소를 얻을 수 있습니다 (예 : http://stackoverflow.com/a/12883978/1187415). –

답변

0

는만큼 개발 시스템이 네트워크에 연결되지 않은 당신은 (물론, 로컬 네트워크에 완벽하게 유효) 루프백 주소를 얻을 수 있습니다. 기기를 네트워크에 연결하는 즉시 "올바른"주소를 결정할 수 있습니다. ipconfig, btw는 동일하게 동작합니다.

노드 이름 (첫 번째 매개 변수)에 대해 getaddrinfo을 NULL로 호출하면 "localhost"로 호출 할 때와 동일합니다. 루프백 IP를 받게됩니다. 그러나 "실제"호스트 이름을 사용하면 "실제"ip를 얻게됩니다.

+0

내 컴퓨터가 네트워크에 있습니다. ifconfig를 수행 할 때 172.28.3.225 (실제 IP)이고 다른 하나는 127.0.0.1 인 루프백 주소입니다. 172.28.3.225 – user3035481

+0

업데이트보기 (두 번째 단락)를 참조하십시오. – JeffRSon

+0

물론 가능합니까? – JeffRSon