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

Функция getaddrinfo() модуля socket в Python

По доменному имени и № порта получает сведения для подключения

Синтаксис:

import socket

socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)

Параметры:

  • host - доменное имя,
  • port - строковое имя службы,
  • family - семейства адресов,
  • type - типа соединения (константы модуля),
  • proto - номер протокола (константы модуля),
  • flags - способ вычисления результатов.

Возвращаемое значение:

Описание:

Функция getaddrinfo() модуля socket преобразует аргумент host/port в список из пяти элементных кортежей, которые содержат все необходимые аргументы для создания сокета, подключенного к этой службе.

Аргумент host - это доменное имя, строковое представление адреса IPv4/v6 или None.

Аргумент port - это строковое имя службы, такое как https/ssh или числовой номер порта или None. Передав None в качестве значения хоста host и порта port, вы можете передать NULL в базовый API языка C .

Аргументы семейства адресов family, типа соединения type и номер протокола proto могут быть дополнительно указаны, чтобы сузить список возвращаемых адресов. Передача нуля в качестве значения для каждого из этих аргументов выбирает полный диапазон результатов.

Аргумент flags может быть одной или несколькими константами модуля socket.AI_* и будет влиять на способ вычисления и возврата результатов. Например, socket.AI_NUMERICHOST отключит разрешение доменного имени и вызовет ошибку, если host является доменным именем.

Функция возвращает список из пяти элементных кортежей со следующей структурой:

(family, type, proto, canonname, sockaddr)

В этих кортежах family, type, proto являются целыми числами и предназначены для передачи в функцию socket().

Элемент кортежа canonname будет строкой, представляющей каноническое имя хоста, если socket.AI_CANONNAME является частью аргумента flags, иначе canonname будет пустым.

Элемент кортежа sockaddr - это кортеж, описывающий адрес сокета, формат которого зависит от возвращаемого семейства:

  • для семейства адресов AF_INET это 2-кортеж (address, port);
  • для семейства адресов AF_INET6 это 4-кортеж (address, port, flowinfo, scope_id).

и предназначен для передаваться в метод Socket.connect().

Вызывает событие аудита socket.getaddrinfo с аргументами host, port, family, type, protocol.

Изменено в Python 3.7: для адресов IPv6 строка, представляющая адрес, не будет содержать часть %scope_id.

Примеры использования:

В следующем примере извлекается адресная информация для TCP-соединения с google.com через порт 443, результаты могут отличаться, если не включен IPv6:

>>> import socket
>>> socket.getaddrinfo('google.com', 443, proto=socket.IPPROTO_TCP)
# [
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.221.139', 443)), 
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.221.101', 443)), 
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.221.113', 443)), 
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.221.138', 443)), 
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.221.100', 443)), 
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.221.102', 443))
#  (<AddressFamily.AF_INET6: 10>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2a00:1450:4010:c0d::71', 443, 0, 0)), 
#  (<AddressFamily.AF_INET6: 10>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2a00:1450:4010:c0d::8b', 443, 0, 0)), 
#  (<AddressFamily.AF_INET6: 10>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2a00:1450:4010:c0d::8a', 443, 0, 0)), 
#  (<AddressFamily.AF_INET6: 10>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('2a00:1450:4010:c0d::65', 443, 0, 0))
# ]

Если передать аргумент family=socket.AF_INET, то получим сведения только для IPv4 соединения.

Сведения для 22 порта и IPv4 соединения:

>>> import socket
>>> socket.getaddrinfo('google.com', 'ssh', family=socket.AF_INET, proto=socket.IPPROTO_TCP)
# [
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.222.102', 22)), 
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.222.101', 22)), 
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.222.138', 22)), 
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.222.113', 22)), 
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.222.100', 22)), 
#  (<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('173.194.222.139', 22))
# ]