Для связи между двумя хостами мне нужно отправить IP-адрес моего хоста на другой сайт. Проблема заключается в том, что, если я запрашиваю свой IP-адрес, возможно, я получаю обратно свои локальные петлевые IP-адреса (127.x.x.x), а не сетевой (ethernet) IP-адрес.
Я использую следующий код:
char myhostname[32];
gethostname(myhostname, 32);
hp = gethostbyname(myhostname);
unsigned my_ip = *(unsigned*)(hp->h_addr);
if( (my_ip % 256) == 127) {
/* Wrong IP adress as it's 127.x.x.x */
printf("Error, local IP address!");
return;
}
Единственный способ решить эту проблему - убедиться, что мое имя хоста в / etc / hosts находится за реальным сетевым адресом, а не за локальной петлей (по умолчанию, например, в Ubuntu).
Есть ли способ решить эту проблему, не полагаясь на содержимое / etc / hosts?
Редактировать: Я изменил вышеуказанный код, чтобы он использовал getaddrinfo, но я все равно получаю номер устройства обратной связи (127.0,0,1) вместо реального IP-адреса:
struct addrinfo hint = {0};
struct addrinfo *aip = NULL;
unsigned ip = 0;
struct sockaddr_in *sinp = NULL;
hint.ai_family = AF_INET; /* IPv4 */
hint.ai_socktype = SOCK_STREAM;
if(getaddrinfo(hostname, NULL, &hint, &aip) != 0) {
return 0;
}
sinp = (struct sockaddr_in *) aip->ai_addr;
ip = *(unsigned *) &sinp->sin_addr;
(Раньше я получал список из 3-х аддринфо с тремя SOCK_STREAM, SOCK_DGRAM и SOCK_RAW, но подсказка предотвращает это)
Так что мой вопрос все еще стоит ...