Сообщить об ошибке.

DNS запросы из цикла событий asyncio в Python

Асинхронные DNS запросы из низкоуровнего кода asyncio

В разделе рассмотрены низкоуровневые методы цикла событий модуля asyncio, при помощи которых можно создавать асинхронные DNS запросы из низкоуровнего кода.

Прежде чем что-то делать с циклом событий, его необходимо создать или получить функциями, описанными в разделе "Создание, запуск и получение цикла событий".

Содержание:


loop.getaddrinfo(host, port, *, family=0, type=0, proto=0, flags=0):

Метод loop.getaddrinfo() представляет собой сопрограмму асинхронной версии функции socket.getaddrinfo().

loop.getnameinfo(sockaddr, flags=0):

Метод loop.getnameinfo() представляет собой сопрограмму асинхронной версии функции socket.getnameinfo().

Изменено в Python 3.7: методы loop.getaddrinfo() и loop.getnameinfo() документировались, как возвращающие сопрограмму, но до Python 3.7 они фактически возвращали объекты asyncio.Future.

Начиная с Python 3.7 оба метода являются сопрограммами.

Пример асинхронных DNS запросов из кода asyncio.

В примере осуществляется определение имя хоста в сети по его IPv4 адресу.

import asyncio

async def get_name():
    TARGETS = [
        ('8.8.8.8', 443),
        ('1.1.1.1', 443),
        ('8.8.4.4', 443),
        ('77.88.8.8', 443),
        ('77.88.8.88', 443),
        ('77.88.8.7', 443)
    ]
    
    # получаем текущий цикл событий
    loop = asyncio.get_event_loop()
    
    for target in TARGETS:
        # запускаем асинхронный вариант 
        # функции socket.getnameinfo()
        host, port = await loop.getnameinfo(target)
        # выводим результаты
        print(f'{target[0]:15}: {host}')

if __name__ == '__main__':
    asyncio.run(get_name())

# 8.8.8.8        : dns.google
# 1.1.1.1        : one.one.one.one
# 8.8.4.4        : dns.google
# 77.88.8.8      : dns.yandex.ru
# 77.88.8.88     : safe.dns.yandex.ru
# 77.88.8.7      : family.dns.yandex.ru