Автор оригинала: Doug Hellmann.
Приложения используют сеть для связи с серверами для операций службы доменных имен (DNS), таких как преобразование между именами хостов и IP-адресами. asyncio
имеет удобные методы в цикле событий, чтобы выполнять эти операции в фоновом режиме, чтобы избежать блокировки во время запросов.
Поиск адреса по имени
Используйте сопрограмму getaddrinfo ()
для преобразования имени хоста и номера порта в IP- или IPv6-адрес. Как и в случае с версией функции в модуле сокета, возвращаемое значение представляет собой список кортежей, содержащий пять частей информации.
- А
- д
- р
- е
- с
- н
- а
- я
- с
- е
- м
- ь
- я
- Т
- и
- п
- а
- д
- р
- е
- с
- а
- П
- р
- о
- т
- о
- к
- о
- л
- К
- а
- н
- о
- н
- и
- ч
- е
- с
- к
- о
- е
- и
- м
- я
- с
- е
- р
- в
- е
- р
- а
- К
- о
- р
- т
- е
- ж
- а
- д
- р
- е
- с
- о
- в
- с
- о
- к
- е
- т
- а
- ,
- п
- о
- д
- х
- о
- д
- я
- щ
- и
- й
- д
- л
- я
- о
- т
- к
- р
- ы
- т
- и
- я
- с
- о
- е
- д
- и
- н
- е
- н
- и
- я
- с
- с
- е
- р
- в
- е
- р
- о
- м
- н
- а
- п
- е
- р
- в
- о
- н
- а
- ч
- а
- л
- ь
- н
- о
- у
- к
- а
- з
- а
- н
- н
- о
- м
- п
- о
- р
- т
- у
- .
Запросы можно фильтровать по протоколу, как в этом примере, где возвращаются только ответы TCP.
asyncio_getaddrinfo.py
import asyncio import logging import socket import sys TARGETS [ ('pymotw.com', 'https'), ('doughellmann.com', 'https'), ('python.org', 'https'), ] async def main(loop, targets): for target in targets: info await loop.getaddrinfo( *target, protosocket.IPPROTO_TCP, ) for host in info: print('{:20}: {}'.format(target[0], host[4][0])) event_loop asyncio.get_event_loop() try: event_loop.run_until_complete(main(event_loop, TARGETS)) finally: event_loop.close()
Пример программы преобразует имя хоста и имя протокола в IP-адрес и номер порта.
$ python3 asyncio_getaddrinfo.py pymotw.com : 66.33.211.242 doughellmann.com : 66.33.211.240 python.org : 23.253.135.79
Поиск имени по адресу
Сопрограмма getnameinfo ()
работает в обратном направлении, преобразуя IP-адрес в имя хоста и номер порта в имя протокола, где это возможно.
asyncio_getnameinfo.py
import asyncio import logging import socket import sys TARGETS [ ('66.33.211.242', 443), ('104.130.43.121', 443), ] async def main(loop, targets): for target in targets: info await loop.getnameinfo(target) print('{:15}: {} {}'.format(target[0], *info)) event_loop asyncio.get_event_loop() try: event_loop.run_until_complete(main(event_loop, TARGETS)) finally: event_loop.close()
В этом примере показано, что IP-адрес для pymotw.com
относится к серверу DreamHost, хостинговой компании, на которой работает сайт. Второй проверенный IP-адрес предназначен для python.org
, и он не разрешается обратно в имя хоста.
$ python3 asyncio_getnameinfo.py 66.33.211.242 : n821.com https 104.130.43.121 : 104.130.43.121 https
Смотрите также
- Обсуждение модуля сокета включает более подробное рассмотрение этих операций.