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

Семейства сокетов, поддерживаемых модулем socket в Python

В зависимости от системы и параметров сборки модуль socket поддерживает различные семейства сокетов, которые заданы как константы модуля.

Формат адреса, необходимый для конкретного объекта сокета Socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта сокета.

Если использовать имя хоста в части хоста адреса сокета IPv4/v6, программа может показывать недетерминированное поведение, поскольку Python использует первый адрес, возвращенный из разрешения DNS. Адрес сокета будет по-разному преобразован в фактический адрес IPv4/v6, в зависимости от результатов разрешения DNS и/или конфигурации хоста. Для детерминированного поведения используйте числовой адрес в части хоста.

Все ошибки вызывают исключения. Могут возникать обычные исключения для недопустимых типов аргументов и условий нехватки памяти. Начиная с Python 3.3, ошибки, связанные с семантикой сокета или адреса, вызывают OSError или один из его подклассов.

Неблокирующий режим поддерживается через метод объекта сокета Socket.setblocking(). Обобщение этого режима на основе тайм-аутов поддерживается через Socket.settimeout().

Содержание:

Адрес сокета socket.AF_UNIX.

Адрес сокета socket.AF_UNIX, привязанного к узлу файловой системы, представлен в виде строки с использованием кодировки файловой системы и обработчика ошибок surrogateescape.

Адрес в абстрактном пространстве имен Linux возвращается как байтовый объект с начальным нулевым байтом. Обратите внимание, что сокеты в этом пространстве имен могут взаимодействовать с обычными сокетами файловой системы, поэтому программам, предназначенным для работы в Linux, может потребоваться иметь дело с обоими типами адресов.

Строковый или байтовый объект может использоваться для любого типа адреса при передаче его в качестве аргумента.

Семейство адресов сокета socket.AF_INET.

Для семейства адресов socket.AF_INET используется парный кортеж (host, port), где:

  • host - это строка, представляющая либо имя хоста в нотации домена Интернета, например либо docs-python.ru, либо IPv4-адрес, например, 100.50.200.5
  • port - целое число.

Для адресов IPv4 вместо адреса хоста принимаются две специальные формы:

  • строка '' - представляет константа модуля socket.INADDR_ANY, который используется для привязки ко всем интерфейсам,
  • строка '<broadcast>' - представляет константа модуля socket.INADDR_BROADCAST.

Такое поведение несовместимо с IPv6, поэтому необходимо избегать этого, если собираетесь поддерживать IPv6 в своих программах Python.

Семейство адресов сокета socket.AF_INET6.

Для семейства адресов socket.AF_INET6 используется кортеж (host, port, flowinfo, scope_id), где: flowinfo и scope_id - представляют члены sin6_flowinfo и sin6_scope_id в структуре sockaddr_in6 в языке C. Для методов flowinfo и scope_id модуля сокета языка C, могут быть опущены только для обратной совместимости.

Обратите внимание,что пропуск scope_id может вызвать проблемы при манипулировании IPv6-адресами с областью действия.

Изменено в Python 3.7: для многоадресных адресов со значением scope_id, адрес может не содержать части %scope_id или идентификатора зоны. Эта информация является излишней и может быть безопасно опущена (рекомендуется).

Семейство адресов сокета socket.AF_NETLINK.

Для семейства адресов socket.AF_NETLINK используется парный кортеж (pid, groups).

Семейство адресов сокета socket.AF_TIPC.

С использованием семейства адресов socket.AF_TIPC (только для Linux) доступна поддержка TIPC.

TIPC - это открытый сетевой протокол, не основанный на IP, разработанный для использования в кластерных компьютерных средах.

Адреса представлены кортежем, а поля зависят от типа адреса. Общая форма кортежа (addr_type, v1, v2, v3 [, scope]), где:

  • addr_type - может быть одним из констант модуля:
    • Если addr_type=socket.TIPC_ADDR_NAME, то v1 - это тип сервера, v2 - идентификатор порта, а v3 должен быть 0.
    • Если addr_type=socket.TIPC_ADDR_NAMESEQ, то v1 - это тип сервера, v2 - нижний номер порта, а v3 - верхний номер порта.
    • Если addr_type=socket.TIPC_ADDR_ID, тогда v1 - это узел, v2 - ссылка, а v3 должно быть установлено в 0.
  • scope - одна из констант модуля socket.TIPC_ZONE_SCOPE, socket.TIPC_CLUSTER_SCOPE и socket.TIPC_NODE_SCOPE.

Семейство адресов сокета socket.AF_CAN.

Для семейства адресов socket.AF_CAN используется кортеж (interface,), где interface - это строка, представляющая имя сетевого интерфейса, например: can0. Имя сетевого интерфейса '' можно использовать для приема пакетов от всех сетевых интерфейсов этого семейства.

Протокол socket.CAN_ISOTP требует кортежа (interface, rx_addr, tx_addr), где оба дополнительных параметра представляют собой длинное целое число без знака, представляющее стандартный или расширенный идентификатор CAN.

Протокол socket.CAN_J1939 требует кортежа (interface, name, pgn, addr), где дополнительными параметрами являются:

  • 64-битное целое число без знака, представляющее имя ECU,
  • 32-битное целое число без знака, представляющее номер группы параметров (PGN),
  • 8-битное целое число, представляющее адрес.

Протокол socket.SYSPROTO_CONTROL.

Для протокола socket.SYSPROTO_CONTROL семейства socket.PF_SYSTEM используется cтрока или кортеж:

  • cтрока - это имя элемента управления ядра с динамически назначаемым идентификатором,
  • кортеж (id, unit) можно использовать, если известны идентификатор и номер блока управления ядром или если используется зарегистрированный идентификатор.

Сокеты Bluetooth socket.AF_BLUETOOTH.

Сокет Bluetooth socket.AF_BLUETOOTH поддерживает следующие протоколы и форматы адресов:

  • протокол socket.BTPROTO_L2CAP принимает (bdaddr, psm), где bdaddr - это адрес Bluetooth в виде строки, а psm - целое число.
  • протокол socket.BTPROTO_RFCOMM принимает (bdaddr, channel), где bdaddr - это адрес Bluetooth в виде строки, а channel - целое число.
  • протокол socket.BTPROTO_HCI принимает (device_id,), где device_id является либо целым числом, либо строкой с адресом Bluetooth интерфейса. Это зависит от ОС: NetBSD и DragonFlyBSD ожидают адрес Bluetooth, а все остальное - целое число.
  • протокол socket.BTPROTO_SCO принимает bdaddr, где bdaddr - байтовый объект, содержащий адрес Bluetooth в строковом формате. Например, b'12: 23: 34: 45: 56: 67'. Этот протокол не поддерживается FreeBSD.

Сокет socket.AF_ALG, функции криптографии ядра.

Сокет socket.AF_ALG - это интерфейс на основе сокетов только для Linux для криптографии ядра. Сокет алгоритма конфигурируется с кортежем из двух-четырех элементов (type, name [, feat [, mask]]), где:

  • type - это тип алгоритма в виде строки, например aead, hash, skcipher или rng.
  • name - это имя алгоритма и режим работы в виде строки, например sha256, hmac(sha256), cbc(aes) или drbg_nopr_ctr_aes256.
  • feat и mask - 32-битные целые числа без знака.

Доступность: Linux 2.6.38, для некоторых типов алгоритмов требуются более свежие ядра.

Новое в Python 3.6.

Сокеты socket.AF_VSOCK, связь между виртуальными машинами.

Сокет socket.AF_VSOCK разрешает связь между виртуальными машинами и их хостами.

Сокет представлен как парный кортеж (CID, port), где идентификатор контекста или CID и port являются целыми числами.

Доступность: Linux >= 4.8 QEMU >= 2.8 ESX >= 4.0 ESX Workstation >= 6.5.

Новое в Python 3.7.

Сокет socket.AF_PACKET, низкоуровневая связь сетевым устройствам.

Сокет socket.AF_PACKET - это низкоуровневый интерфейс непосредственно к сетевым устройствам. Пакеты представлены кортежем (ifname, proto [, pkttype [, hatype [, addr]]]), где:

  • ifname - строка, определяющая имя устройства.
  • proto - целое число в сетевом порядке байтов, указывающее номер протокола Ethernet.
  • pkttype - необязательное целое число, указывающее тип пакета:
    • socket.PACKET_HOST (по умолчанию) - пакет, адресованный локальному хосту.
    • socket.PACKET_BROADCAST - широковещательный пакет физического уровня.
    • socket.PACKET_MULTIHOST - пакет, отправленный на групповой адрес физического уровня.
    • socket.PACKET_OTHERHOST - пакет на другой хост, который был перехвачен драйвером устройства в неразборчивом режиме.
    • socket.PACKET_OUTGOING - пакет, исходящий от локального хоста, который возвращается в пакетный сокет.
  • hatype - необязательное целое число, указывающее тип аппаратного адреса ARP.
  • addr - необязательный байтовый объект, указывающий физический адрес оборудования, интерпретация которого зависит от устройства.

Сокет Qualcomm socket.AF_QIPCRTR.

Сокет socket.AF_QIPCRTR - это интерфейс на основе сокетов только для Linux для связи со службами, работающими на сопроцессорах платформ Qualcomm.

Семейство адресов представлено в виде кортежа (node, port), где node и port являются неотрицательными целыми числами.

Новое в Python 3.8.

Сокет socket.IPPROTO_UDPLITE.

Сокет socket.IPPROTO_UDPLITE - это вариант UDP, который позволяет указать, какая часть пакета покрывается контрольной суммой. Он добавляет два параметра сокета, которые можно изменить.

  • self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length) изменит, какая часть исходящих пакетов покрывается контрольной суммой,
  • self.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length) отфильтрует пакеты, которые покрывают слишком мало данных.

В обоих случаях длина length должна быть в диапазоне range(8, 2**16, 8).

Такой сокет должен быть построен:

  • с socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE) для IPv4
  • с socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE) для IPv6.

Доступность: Linux >= 2.6.20, FreeBSD >= 10.1-RELEASE

Новое в Python 3.9.