Преобразование доменного имени в IP адрес

Всё довольно просто, но к моему удивлению информацию я искал очень долго.
Рассмотрим программу преобразующую доменное имя в 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;
};

Вот и всё! Скомпилировав и запустив программу вы увидите:

Спасибо за внимание.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий