разрешение DNS в коде

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

разрешение DNS в коде

Непрочитанное сообщение Olej » 02 мар 2023, 18:54

Тут прилетело обновление:

Код: Выделить всё

Start-Date: 2023-03-02  16:58:58
Commandline: /usr/sbin/synaptic --hide-main-window --non-interactive --parent-window-id 65011726 -o Synaptic::closeZvt=true --set-selections-file /tmp/tmpn31bfsaq
Requested-By: olej (1000)
Upgrade: libc-ares2:amd64 (1.18.1-1build1, 1.18.1-1ubuntu0.22.04.1), libpq5:amd64 (14.6-0ubuntu0.22.04.1, 14.7-0ubuntu0.22.04.1)
End-Date: 2023-03-02  16:58:59
И в связи с разбирательствами с DNS в Сети...

Код: Выделить всё

olej@R420:~$ apt show libc-ares2
Package: libc-ares2
Version: 1.18.1-1ubuntu0.22.04.1
Priority: extra
Section: libs
Source: c-ares
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Gregor Jasny <gjasny@googlemail.com>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 115 kB
Depends: libc6 (>= 2.17)
Conflicts: libcares2
Replaces: libc-ares1
Homepage: https://c-ares.org/
Task: ubuntu-desktop-minimal, ubuntu-desktop, ubuntu-mate-core, ubuntu-mate-desktop
Download-Size: 45,1 kB
APT-Manual-Installed: yes
APT-Sources: http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages
Description: asynchronous name resolver
 c-ares is a C library that performs DNS requests and name resolution
 asynchronously.
 .
 It is a fork of the library named "ares", with additional features:
  * IPv6 support;
  * extended cross-platform portability;
  * 64-bit clean sources.
 .
 This package provides the shared libraries.

N: Есть 1 дополнительная запись. Используйте «-a» для просмотра.
Асинхронная DNS разрешалка...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

разрешение DNS

Непрочитанное сообщение Olej » 02 мар 2023, 19:00

Примеры прикладного программирования c-ares
c-ares - это библиотека асинхронного разрешения DNS. Эта статья в основном знакомит с применением c-ares в программировании на c / c ++.
Официальный сайт c-areshttps://c-ares.haxx.se/
В этой статье используется версия c-ares-1.12.0.
Пришлось несколько причесать их текст:

Код: Выделить всё

#include <cstdarg>
#include <time.h>
#include <iostream>
#include <netdb.h>
#include <arpa/inet.h>
#include <ares.h>
#include <sys/select.h>
#include <string.h>
 
#define IP_LEN 32
 
typedef struct {
    char host[64];
    char ip[10][IP_LEN]; 
    int count;   
} IpList;
 
void dns_callback (void * arg, int status, int timeouts, struct hostent * hptr) // обработка ares завершена, возвращаем информацию о разрешении DNS
{
    IpList *ips = (IpList*)arg;
    if( ips == NULL ) return;
    if(status == ARES_SUCCESS) {
        strncpy(ips->host, hptr->h_name, sizeof(ips->host));
        char **pptr=hptr->h_addr_list;
        for(int i=0; *pptr!=NULL && i<10; pptr++,++i) {
            inet_ntop(hptr->h_addrtype, *pptr, ips->ip[ips->count++], IP_LEN);
        } 
    } else {
        std::cout << "lookup failed: " << status << std::endl;
    }
}
 
void dns_resolve(const char* host, IpList &ips)
{
    ares_channel channel;                               // Создаем ares_channel
    int res;
    if ((res = ares_init (& channel)) != ARES_SUCCESS) {// ares инициализируют канал
        std::cout << "ares feiled: " << res << std::endl;
        return;
    }
    //set dns server
    ares_set_servers_csv(channel, "114.114.114.114");
    //get host by name
    ares_gethostbyname(channel, host, AF_INET, dns_callback, (void*)(&ips));
 
    int nfds;  
    fd_set readers, writers;  
    timeval tv, *tvp;  
    while (true) 
    {  
        FD_ZERO(&readers);  
        FD_ZERO(&writers);  
        nfds = ares_fds (channel, &readers, &writers); // Получить FD, используемую каналом ares  
        if (nfds == 0) break;  
        tvp = ares_timeout(channel, NULL, &tv);      
        select (nfds, &readers, &writers, NULL, tvp);  // Добавляем SOCKET FD площадей в цикл событий  
        ares_process (channel, &readers, &writers);    // событие происходит и обрабатывается ares
    }
    ares_destroy(channel);
}
 
int main(int argc, char **argv)
{
    if(argc < 2 ) {
        std::cout << "usage: " << argv[0] << " ip.address"<< std::endl;
        return 1;
    }

    IpList ips;
    do {
        memset(&ips, 0, sizeof(ips));
        dns_resolve(argv[1],ips);
        std::cout <<"hostname:"<< ips.host << std::endl;
        for(int i=0; i < ips.count; ++i) {
            std::cout<< "address ip:" << ips.ip[i] << std::endl;
        }
        std::cout<< std::endl;
    } while(0);
    std::cout << "program end.." << std::endl;
    return 0;
}

Код: Выделить всё

olej@R420:~/2023/own.WORK/DNS/c-ares$ c++ c-ares-dns.cc
c-ares-dns.cc:9:10: fatal error: ares.h: Нет такого файла или каталога
    9 | #include <ares.h>
      |          ^~~~~~~~
compilation terminated.
Нужно доустанавливать:

Код: Выделить всё

olej@R420:~$ aptitude search c-ares
p   libc-ares-dev                                           - asynchronous name resolver - development files
p   libc-ares-dev:i386                                      - asynchronous name resolver - development files
i   libc-ares2                                              - asynchronous name resolver
p   libc-ares2:i386                                         - asynchronous name resolver

Код: Выделить всё

olej@R420:~/2023/own.WORK/DNS/c-ares$ sudo apt install libc-ares-dev
[sudo] пароль для olej:
Чтение списков пакетов… Готово
Построение дерева зависимостей… Готово
Чтение информации о состоянии… Готово
Следующие НОВЫЕ пакеты будут установлены:
  libc-ares-dev
Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 48 пакетов не обновлено.
Необходимо скачать 135 kB архивов.
После данной операции объём занятого дискового пространства возрастёт на 379 kB.
Пол:1 http://security.ubuntu.com/ubuntu jammy-security/main amd64 libc-ares-dev amd64 1.18.1-1ubuntu0.22.04.1 [135 kB]
Получено 135 kB за 1с (156 kB/s)
Выбор ранее не выбранного пакета libc-ares-dev:amd64.
(Чтение базы данных … на данный момент установлено 535994 файла и каталога.)
Подготовка к распаковке …/libc-ares-dev_1.18.1-1ubuntu0.22.04.1_amd64.deb …
Распаковывается libc-ares-dev:amd64 (1.18.1-1ubuntu0.22.04.1) …
Настраивается пакет libc-ares-dev:amd64 (1.18.1-1ubuntu0.22.04.1) …
Обрабатываются триггеры для man-db (2.10.2-1) …

Код: Выделить всё

olej@R420:~/2023/own.WORK/DNS/c-ares$ c++ c-ares-dns.cc -o c-ares-dns
/usr/bin/ld: /tmp/ccrO9RY9.o: в функции «dns_resolve(char const*, IpList&)»:
c-ares-dns.cc:(.text+0x140): неопределённая ссылка на «ares_init»
/usr/bin/ld: c-ares-dns.cc:(.text+0x1b0): неопределённая ссылка на «ares_set_servers_csv»
/usr/bin/ld: c-ares-dns.cc:(.text+0x1df): неопределённая ссылка на «ares_gethostbyname»
/usr/bin/ld: c-ares-dns.cc:(.text+0x27d): неопределённая ссылка на «ares_fds»
/usr/bin/ld: c-ares-dns.cc:(.text+0x2a7): неопределённая ссылка на «ares_timeout»
/usr/bin/ld: c-ares-dns.cc:(.text+0x2f8): неопределённая ссылка на «ares_process»
/usr/bin/ld: c-ares-dns.cc:(.text+0x30d): неопределённая ссылка на «ares_destroy»
collect2: error: ld returned 1 exit status
Т.е. компиляция к этому месту уже идёт без ошибок...
Вложения
c-ares-dns.cc
(2.69 КБ) 20 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

разрешение DNS

Непрочитанное сообщение Olej » 02 мар 2023, 19:04

Olej писал(а):
02 мар 2023, 19:00
Т.е. компиляция к этому месту уже идёт без ошибок...

Код: Выделить всё

olej@R420:/usr/local$ pkg-config --list-all | grep ares
libcares                       c-ares - asynchronous DNS lookup library

Код: Выделить всё

olej@R420:/usr/local$ pkg-config --libs libcares
-lcares

Код: Выделить всё

olej@R420:~/2023/own.WORK/DNS/c-ares$ c++ c-ares-dns.cc `pkg-config --libs libcares` -o c-ares-dns

Код: Выделить всё

olej@R420:~/2023/own.WORK/DNS/c-ares$ ls -l c-ares-dns
-rwxrwxr-x 1 olej olej 17168 мар  2 17:30 c-ares-dns

Код: Выделить всё

olej@R420:~/2023/own.WORK/DNS/c-ares$ ./c-ares-dns
usage: ./c-ares-dns ip.address
И используем:

Код: Выделить всё

olej@R420:~/2023/own.WORK/DNS/c-ares$ ./c-ares-dns linux-ru.ru
hostname:linux-ru.ru
address ip:90.156.230.27

program end..
И проверяем (сверяем):

Код: Выделить всё

olej@R420:~/2023/own.WORK/DNS/c-ares$ host linux-ru.ru
linux-ru.ru has address 90.156.230.27
linux-ru.ru mail is handled by 10 mx1.timeweb.ru.
linux-ru.ru mail is handled by 10 mx2.timeweb.ru.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

разрешение DNS

Непрочитанное сообщение Olej » 02 мар 2023, 20:43

Olej писал(а):
02 мар 2023, 18:54
Асинхронная DNS разрешалка...
Теперь Python:
pycares 4.3.0
Python interface for c-ares

Код: Выделить всё

olej@R420:~$ pip install pycares
Defaulting to user installation because normal site-packages is not writeable
Collecting pycares
  Downloading pycares-4.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (288 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 288.7/288.7 KB 1.7 MB/s eta 0:00:00
Requirement already satisfied: cffi>=1.5.0 in /usr/local/lib/python3.10/dist-packages (from pycares) (1.15.1)
Requirement already satisfied: pycparser in /usr/local/lib/python3.10/dist-packages (from cffi>=1.5.0->pycares) (2.21)
Installing collected packages: pycares
Successfully installed pycares-4.3.0

Код: Выделить всё

olej@R420:~$ python -m pycares linux-ru.ru
;; QUESTION SECTION:
;linux-ru.ru                    IN      A

;; ANSWER SECTION:
linux-ru.ru             600     IN      A       90.156.230.27

Код: Выделить всё

olej@R420:~$ python -m pycares mx linux-ru.ru
;; QUESTION SECTION:
;linux-ru.ru			IN	MX

;; ANSWER SECTION:
linux-ru.ru		-1	IN	MX	10 mx1.timeweb.ru
linux-ru.ru		-1	IN	MX	10 mx2.timeweb.ru
И это всё уже готово для использования из кода Python:

Код: Выделить всё

olej@R420:~$ python
Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pycares
>>> pycares._version
<module 'pycares._version' from '/home/olej/.local/lib/python3.10/site-packages/pycares/_version.py'>
...

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя