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
- это кортеж, описывающий адрес сокета, формат которого зависит от возвращаемого семейства:
(address, port)
;(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)) # ]