Всё довольно просто, но к моему удивлению информацию я искал очень долго.
Рассмотрим программу преобразующую доменное имя в IP адрес.
Нам понадобятся следующие библиотеки:
#include <stdio.h> #include <arpa/inet.h> #include <string.h> #include <netdb.h>
Предопределим необходимые структуры:
struct hostent *he; struct in_addr a;
Главная функция программы имеет вид:
int main (int argc, char **argv) { /* если принято меньше 1 аргумента (первый аргумент - имя программы) вывести информацию о применении программы */ if (argc != 2) { fprintf(stderr, "usage: %s hostname\n", argv[0]); return 1; } he = gethostbyname (argv[1]); /* Если функция выполнилась удачно выведем на экран необходимые данные */ if (he) { /* выводим имя */ printf("name: %s\n", he->h_name); /* выводим список IP адресов */ while (*he->h_addr_list) { bcopy(*he->h_addr_list++, (char *) &a, sizeof(a)); printf("address: %s\n", inet_ntoa(a)); } } return 0; }
Для преобразования доменного имени в IP адрес используется библиотечная функция gethostbyname, она принимает в качестве параметра строку с именем домена и возвращает структуру hostent.
#include <netdb.h> struct hostent *gethostbyname(const char *name);
В свою очередь структура имеет вид:
struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; }; #define h_addr h_addr_list[0]
- h_name — имя хоста
- h_aliases — массив строк, содержащий псевдонимы хоста
- h_addrtype — тип адреса. В настоящее время для интернет срединений всегда используется AF_INET
- h_length — длина адреса в байтах
- h_addr_list — массив адресов хоста в сетевом порядке
Для обеспечения совместимости используется h_addr. Он содержит нулевой элемент из массива адресов.
Функция inet_ntoa преобразует адрес представленный в сетевом порядке в привычный нам четырёхциферный формат:
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> char *inet_ntoa(struct in_addr in);
В качестве параметра же она принимает структуру типа in_addr:
struct in_addr { unsigned long s_addr; };
Вот и всё! Скомпилировав и запустив программу вы увидите:
Спасибо за внимание.