Рубрики
Без рубрики

Взаимодействие со службами доменных имен

Автор оригинала: Doug Hellmann.

Приложения используют сеть для связи с серверами для операций службы доменных имен (DNS), таких как преобразование между именами хостов и IP-адресами. asyncio имеет удобные методы в цикле событий, чтобы выполнять эти операции в фоновом режиме, чтобы избежать блокировки во время запросов.

Поиск адреса по имени

Используйте сопрограмму getaddrinfo () для преобразования имени хоста и номера порта в IP- или IPv6-адрес. Как и в случае с версией функции в модуле сокета, возвращаемое значение представляет собой список кортежей, содержащий пять частей информации.

  1. А
  2. д
  3. р
  4. е
  5. с
  6. н
  7. а
  8. я
  9. с
  10. е
  11. м
  12. ь
  13. я
  14. Т
  15. и
  16. п
  17. а
  18. д
  19. р
  20. е
  21. с
  22. а
  23. П
  24. р
  25. о
  26. т
  27. о
  28. к
  29. о
  30. л
  31. К
  32. а
  33. н
  34. о
  35. н
  36. и
  37. ч
  38. е
  39. с
  40. к
  41. о
  42. е
  43. и
  44. м
  45. я
  46. с
  47. е
  48. р
  49. в
  50. е
  51. р
  52. а
  53. К
  54. о
  55. р
  56. т
  57. е
  58. ж
  59. а
  60. д
  61. р
  62. е
  63. с
  64. о
  65. в
  66. с
  67. о
  68. к
  69. е
  70. т
  71. а
  72. ,
  73. п
  74. о
  75. д
  76. х
  77. о
  78. д
  79. я
  80. щ
  81. и
  82. й
  83. д
  84. л
  85. я
  86. о
  87. т
  88. к
  89. р
  90. ы
  91. т
  92. и
  93. я
  94. с
  95. о
  96. е
  97. д
  98. и
  99. н
  100. е
  101. н
  102. и
  103. я
  104. с
  105. с
  106. е
  107. р
  108. в
  109. е
  110. р
  111. о
  112. м
  113. н
  114. а
  115. п
  116. е
  117. р
  118. в
  119. о
  120. н
  121. а
  122. ч
  123. а
  124. л
  125. ь
  126. н
  127. о
  128. у
  129. к
  130. а
  131. з
  132. а
  133. н
  134. н
  135. о
  136. м
  137. п
  138. о
  139. р
  140. т
  141. у
  142. .

Запросы можно фильтровать по протоколу, как в этом примере, где возвращаются только ответы 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

Смотрите также

  • Обсуждение модуля сокета включает более подробное рассмотрение этих операций.