/* 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);
}
}
루프백 주소 *는 실제 주소입니다. conencted * hardware * 인터페이스의 주소를 얻으려면 플랫폼 특정 코드를 사용해야합니다. 당신이 조금만 검색하면 많은 예가 있습니다. –
그런데 목록에서 IPv6 주소를 얻으면 어떻게 될까요? 그러면'p-> ai_addr'은'sockaddr_in' 포인터가 아니기 때문에'ipv4-> sin_addr'에 접근하는 것은 정의되지 않은 행동입니다. –
'getifaddrs()'를 사용하여 로컬 인터페이스의 IP 주소를 얻을 수 있습니다 (예 : http://stackoverflow.com/a/12883978/1187415). –