Список формируется путём чтения из файла:
Код: Выделить всё
fscanf("%s",ip_s);
ip=inet_addr(ip_s);
Захотелось иметь возможность задавать IP адрес не явно, а через имя (которое определяется в /etc/hosts. Для этого решил использовать функцию gethostbyname. Для начала написал тестовую программу:
Код: Выделить всё
#include <stdio.h>
#include <netdb.h>
struct hostent *h;
int main(int argc, char **argv) {
int i;
h = gethostbyname(argv[1]);
printf(" h_addr = ");
for(i=0;i<4;i++) printf(" %d",h->h_addr[i]&255);
putchar('\n');
return 0;
}
Код: Выделить всё
$ ./th server
h_addr = 10 20 30 1
Код: Выделить всё
#include <netdb.h>
in_addr_t IP_addr(char *host) {
char *addr;
in_addr_t *ip;
struct hostent *h=gethostbyname(host);
if(!h) return h_errno;
addr = h->h_addr; // Вариант А
addr = h->h_addr_list[0]; // Вариант Б
ip = (in_addr_t *) addr;
return *ip;
}
Компилирую Вариант А -- выдаёт ошибку ‘struct hostent’ has no member named ‘h_addr’. Такого члена в этой структуре действительно нет, но в man gethostbyname есть запись #define h_addr h_addr_list[0] /* for backward compatibility */. И тестовый пример транслируется без ошибок. Ладно. Транслирую Вариант Б. Транслируется без ошибок. Но работает только если в файле заданы IP адреса. Имена разрешать не хочет -- gethostbyname выдаёт ошибку HOST_NOT_FOUND. Хотя тестовая программа их нормально разрешает.
В чём может быть причина?