/* 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 * аппаратных * интерфейсов, тогда вам нужно прибегнуть к коду конкретной платформы. Есть много примеров, если вы просто ищете немного. –
О, и кстати, что, если вы получите IPv6-адрес в списке? Тогда 'p-> ai_addr' не будет указателем' sockaddr_in', поэтому доступ к 'ipv4-> sin_addr' является неопределенным поведением. –
Вы можете использовать 'getifaddrs()' для получения IP-адресов локальных интерфейсов, см. Здесь (например): http://stackoverflow.com/a/12883978/1187415. –