Spec-Zone.ru › Python 3.14

socket — низкоуровневый интерфейс сетевого взаимодействия

Исходный код: Lib/socket.py

Этот модуль предоставляет доступ к интерфейсу BSD socket. Он доступен во всех современных Unix-системах, Windows, MacOS и, вероятно, на некоторых других платформах.

Примечание

Некоторое поведение может зависеть от платформы, поскольку вызовы выполняются через API сокетов операционной системы.

Доступность: недоступен в WASI.

Этот модуль не работает или недоступен в WebAssembly. Подробнее см. в разделе Платформы WebAssembly.

Интерфейс Python представляет собой прямой перенос системного вызова Unix и библиотечного интерфейса для сокетов в объектно-ориентированный стиль Python: функция socket() возвращает объект сокета, методы которого реализуют различные системные вызовы для сокетов. Типы параметров несколько более высокоуровневые, чем в интерфейсе C: как и при операциях read() и write() с файлами Python, выделение буфера при операциях получения выполняется автоматически, а длина буфера при операциях отправки указывается неявно.

См. также

Module socketserver

Классы, упрощающие написание сетевых серверов.

Module ssl

Обёртка TLS/SSL для объектов сокетов.

Семейства сокетов

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

Необходимый для конкретного объекта сокета формат адреса выбирается автоматически на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представлены следующим образом:

  • Адрес сокета AF_UNIX, привязанного к узлу файловой системы, представлен строкой с использованием кодировки файловой системы и обработчика ошибок 'surrogateescape' (см. PEP 383). Адрес в абстрактном пространстве имён Linux возвращается как объект, подобный bytes, начинающийся с нулевого байта; обратите внимание, что сокеты в этом пространстве имён могут взаимодействовать с обычными сокетами файловой системы, поэтому программам, предназначенным для работы в Linux, возможно, потребуется обрабатывать оба типа адресов. При передаче в качестве аргумента для любого из этих типов адресов можно использовать строку или объект, подобный bytes.

    Изменено в версии 3.3: Ранее предполагалось, что пути сокетов AF_UNIX используют кодировку UTF-8.

    Изменено в версии 3.5: Теперь принимаются записываемые объекты, подобные bytes.

  • Для семейства адресов AF_INET используется пара (host, port), где host — строка, представляющая либо имя хоста в формате доменного имени интернета, например 'daring.cwi.nl', либо адрес IPv4, например '100.50.200.5', а port — целое число.

    • Для адресов IPv4 вместо адреса хоста допускаются две специальные формы: '' представляет INADDR_ANY и используется для привязки ко всем интерфейсам, а строка '<broadcast>' представляет INADDR_BROADCAST. Такое поведение несовместимо с IPv6, поэтому, если вы планируете поддерживать IPv6 в своих программах на Python, возможно, стоит избегать этих форм.
  • Для семейства адресов AF_INET6 используется кортеж из четырёх элементов (host, port, flowinfo, scope_id), где flowinfo и scope_id представляют поля sin6_flowinfo и sin6_scope_id в struct sockaddr_in6 в C. Для методов модуля socket flowinfo и scope_id можно опустить только для обратной совместимости. Однако учтите, что опускание scope_id может вызвать проблемы при работе с IPv6-адресами с заданной областью действия.

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

  • Сокеты AF_NETLINK представлены парами (pid, groups).
  • Поддержка TIPC доступна только в Linux через семейство адресов AF_TIPC. TIPC — открытый сетевой протокол, не основанный на IP, разработанный для использования в кластерных вычислительных средах. Адреса представлены кортежем, поля которого зависят от типа адреса. Общая форма кортежа: (addr_type, v1, v2, v3 [, scope]), где:

    • addr_type — один из вариантов: TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME или TIPC_ADDR_ID.
    • scope — один из вариантов: TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE и TIPC_NODE_SCOPE.
    • Если addr_type равен TIPC_ADDR_NAME, то v1 — это тип сервера, v2 — идентификатор порта, а v3 должен быть равен 0.

      Если addr_type равен TIPC_ADDR_NAMESEQ, то v1 — это тип сервера, v2 — нижний номер порта, а v3 — верхний номер порта.

      Если addr_type равен TIPC_ADDR_ID, то v1 — это узел, v2 — ссылка, а v3 должен быть равен 0.

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

    • Для протокола CAN_ISOTP требуется кортеж (interface, rx_addr, tx_addr), где оба дополнительных параметра — беззнаковые целые числа типа long, представляющие идентификатор CAN (стандартный или расширенный).
    • Для протокола CAN_J1939 требуется кортеж (interface, name, pgn, addr), где дополнительные параметры — беззнаковое 64-битное целое число, представляющее имя ECU, беззнаковое 32-битное целое число, представляющее номер группы параметров (PGN), и 8-битное целое число, представляющее адрес.
  • Для протокола SYSPROTO_CONTROL семейства PF_SYSTEM используется строка или кортеж (id, unit). Строка — это имя элемента управления ядра с динамически назначенным идентификатором. Кортеж можно использовать, если известны идентификатор и номер экземпляра элемента управления ядра или если используется зарегистрированный идентификатор.

    Добавлено в версии 3.3.

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

    • BTPROTO_L2CAP принимает кортеж (bdaddr, psm[, cid[, bdaddr_type]]), где:

      • bdaddr — строка, задающая адрес Bluetooth.
      • psm — целое число, задающее мультиплексор протокола/службы.
      • cid — необязательное целое число, задающее идентификатор канала. Если оно не указано, по умолчанию используется ноль.
      • bdaddr_type — необязательное целое число, задающее тип адреса; одно из значений BDADDR_BREDR (по умолчанию), BDADDR_LE_PUBLIC, BDADDR_LE_RANDOM.

      Изменено в версии 3.14: Добавлены поля cid и bdaddr_type.

    • BTPROTO_RFCOMM принимает (bdaddr, channel), где bdaddr — адрес Bluetooth в виде строки, а channel — целое число.
    • BTPROTO_HCI принимает формат, зависящий от вашей ОС.

      • В Linux принимается целое число device_id или кортеж (device_id, [channel]), где device_id задаёт номер устройства Bluetooth, а channel — необязательное целое число, задающее канал HCI (по умолчанию — HCI_CHANNEL_RAW).
      • В FreeBSD, NetBSD и DragonFly BSD принимается bdaddr, где bdaddr — адрес Bluetooth в виде строки.

      Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.

      Изменено в версии 3.13.3: Добавлена поддержка FreeBSD.

      Изменено в версии 3.14: Добавлено поле channel. Теперь принимается device_id, не упакованное в кортеж.

    • BTPROTO_SCO принимает bdaddr, где bdaddr — адрес Bluetooth в виде строки или объекта bytes. (Например, '12:23:34:45:56:67' или b'12:23:34:45:56:67'.)

      Изменено в версии 3.14: Добавлена поддержка FreeBSD.

  • 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.

    Для некоторых типов алгоритмов требуются более новые версии ядра.

    Добавлено в версии 3.6.

  • AF_VSOCK обеспечивает связь между виртуальными машинами и их хостами. Сокеты представлены кортежем (CID, port), где идентификатор контекста (CID) и порт являются целыми числами.

    Доступность: Linux >= 3.9

    См. vsock(7)

    Добавлено в версии 3.7.

  • AF_PACKET — это низкоуровневый интерфейс, напрямую взаимодействующий с сетевыми устройствами. Адреса представлены кортежем (ifname, proto[, pkttype[, hatype[, addr]]]), где:

    • ifname — строка с именем устройства.
    • proto — номер протокола Ethernet. Для перехвата всех протоколов можно указать ETH_P_ALL, одну из констант ETHERTYPE_* или любой другой номер протокола Ethernet.
    • pkttype — необязательное целое число, задающее тип пакета:

      • PACKET_HOST (по умолчанию) — пакет, адресованный локальному хосту.
      • PACKET_BROADCAST — широковещательный пакет канального уровня.
      • PACKET_MULTICAST — пакет, отправленный на многоадресный адрес канального уровня.
      • PACKET_OTHERHOST — пакет для другого хоста, перехваченный драйвером устройства в неразборчивом режиме.
      • PACKET_OUTGOING — пакет, исходящий от локального хоста и возвращённый в сокет пакетов.
    • hatype — необязательное целое число, задающее тип аппаратного адреса ARP.
    • addr — необязательный объект, подобный bytes, задающий физический аппаратный адрес; его интерпретация зависит от устройства.

    Доступность: Linux >= 2.2.

  • AF_QIPCRTR — доступный только в Linux интерфейс на основе сокетов для связи со службами, работающими на сопроцессорах платформ Qualcomm. Семейство адресов представлено кортежем (node, port), где node и port — неотрицательные целые числа.

    Доступность: Linux >= 4.7.

    Добавлено в версии 3.8.

  • 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

    Добавлено в версии 3.9.

  • AF_HYPERV — доступный только в Windows интерфейс на основе сокетов для связи с хостами и гостевыми системами Hyper-V. Семейство адресов представлено кортежем (vm_id, service_id), где vm_id и service_id — строки UUID.

    vm_id — это идентификатор виртуальной машины или одно из известных значений VMID, если целевая система не является конкретной виртуальной машиной. Известные константы VMID, определённые в socket:

    • HV_GUID_ZERO
    • HV_GUID_BROADCAST
    • HV_GUID_WILDCARD — используется для привязки к себе и принятия подключений от всех разделов.
    • HV_GUID_CHILDREN — используется для привязки к себе и принятия подключений от дочерних разделов.
    • HV_GUID_LOOPBACK — используется как цель для подключения к себе.
    • HV_GUID_PARENT — при использовании для привязки принимает подключение от родительского раздела. При использовании в качестве адреса назначения подключается к родительскому разделу.

    service_id — это идентификатор зарегистрированной службы.

    Добавлено в версии 3.12.

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

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

Неблокирующий режим поддерживается с помощью setblocking(). Более общий вариант на основе тайм-аутов поддерживается с помощью settimeout().

Содержимое модуля

Модуль socket экспортирует следующие элементы.

Исключения

exception socket.error

Устаревший псевдоним OSError.

Изменено в версии 3.3: В соответствии с PEP 3151 этот класс стал псевдонимом OSError.

exception socket.herror

Подкласс OSError. Это исключение вызывается при ошибках, связанных с адресами, то есть в функциях, использующих h_errno в POSIX API C, включая gethostbyname_ex() и gethostbyaddr(). Сопровождающее значение — пара (h_errno, string), представляющая ошибку, возвращённую вызовом библиотеки. h_errno — числовое значение, а string содержит описание h_errno, возвращаемое функцией C hstrerror().

Изменено в версии 3.3: Этот класс стал подклассом OSError.

exception socket.gaierror

Подкласс OSError. Это исключение вызывается при ошибках, связанных с адресами, функциями getaddrinfo() и getnameinfo(). Сопровождающее значение — пара (error, string), представляющая ошибку, возвращённую вызовом библиотеки. string содержит описание error, возвращаемое функцией C gai_strerror(). Числовое значение error совпадает с одной из констант EAI_*, определённых в этом модуле.

Изменено в версии 3.3: Этот класс стал подклассом OSError.

exception socket.timeout

Устаревший псевдоним TimeoutError.

Подкласс OSError. Это исключение вызывается при возникновении тайм-аута на сокете, для которого тайм-ауты были включены предыдущим вызовом settimeout() (или неявно через setdefaulttimeout()). Сопровождающее значение — строка, значение которой в настоящее время всегда равно «timed out».

Изменено в версии 3.3: Этот класс стал подклассом OSError.

Изменено в версии 3.10: Этот класс стал псевдонимом TimeoutError.

Константы

Константы AF_* и SOCK_* теперь являются коллекциями AddressFamily и SocketKind IntEnum.

Добавлено в версии 3.4.

socket.AF_UNIX
socket.AF_INET
socket.AF_INET6

Эти константы представляют семейства адресов (и протоколов), используемые в качестве первого аргумента для socket(). Если константа AF_UNIX не определена, этот протокол не поддерживается. В зависимости от системы могут быть доступны дополнительные константы.

socket.AF_UNSPEC

AF_UNSPEC означает, что getaddrinfo() должна возвращать адреса сокетов для любого доступного семейства адресов (IPv4, IPv6 или любого другого).

socket.SOCK_STREAM
socket.SOCK_DGRAM
socket.SOCK_RAW
socket.SOCK_RDM
socket.SOCK_SEQPACKET

Эти константы представляют типы сокетов, используемые в качестве второго аргумента для socket(). В зависимости от системы могут быть доступны дополнительные константы. (По-видимому, обычно полезны только SOCK_STREAM и SOCK_DGRAM.)

socket.SOCK_CLOEXEC
socket.SOCK_NONBLOCK

Эти две константы, если они определены, можно комбинировать с типами сокетов, чтобы атомарно устанавливать некоторые флаги (тем самым избегая возможных состояний гонки и необходимости в отдельных вызовах).

См. также

В статье Безопасная работа с файловыми дескрипторами приведено более подробное объяснение.

Доступность: Linux >= 2.6.27.

Добавлено в версии 3.2.

SO_*
socket.SOMAXCONN
MSG_*
SOL_*
SCM_*
IPPROTO_*
IPPORT_*
INADDR_*
IP_*
IPV6_*
EAI_*
AI_*
NI_*
TCP_*

В модуле socket также определены многие константы этих форм, описанные в документации Unix по сокетам и/или протоколу IP. Обычно они используются в качестве аргументов методов setsockopt() и getsockopt() объектов сокетов. В большинстве случаев определены только те символы, которые указаны в заголовочных файлах Unix; для некоторых символов предусмотрены значения по умолчанию.

Изменено в версии 3.6: добавлены SO_DOMAIN, SO_PROTOCOL, SO_PEERSEC, SO_PASSSEC, TCP_USER_TIMEOUT, TCP_CONGESTION.

Изменено в версии 3.6.5: добавлена поддержка TCP_FASTOPEN, TCP_KEEPCNT на платформах Windows, если они доступны.

Изменено в версии 3.7: добавлена TCP_NOTSENT_LOWAT.

Добавлена поддержка TCP_KEEPIDLE, TCP_KEEPINTVL на платформах Windows, если они доступны.

Изменено в версии 3.10: добавлена IP_RECVTOS. Добавлена TCP_KEEPALIVE. В macOS эту константу можно использовать так же, как TCP_KEEPIDLE используется в Linux.

Изменено в версии 3.11: добавлена TCP_CONNECTION_INFO. В macOS эту константу можно использовать так же, как TCP_INFO используется в Linux и BSD.

Изменено в версии 3.12: добавлены SO_RTABLE и SO_USER_COOKIE. В OpenBSD и FreeBSD соответственно эти константы можно использовать так же, как SO_MARK используется в Linux. Также добавлены отсутствовавшие параметры сокетов TCP из Linux: TCP_MD5SIG, TCP_THIN_LINEAR_TIMEOUTS, TCP_THIN_DUPACK, TCP_REPAIR, TCP_REPAIR_QUEUE, TCP_QUEUE_SEQ, TCP_REPAIR_OPTIONS, TCP_TIMESTAMP, TCP_CC_INFO, TCP_SAVE_SYN, TCP_SAVED_SYN, TCP_REPAIR_WINDOW, TCP_FASTOPEN_CONNECT, TCP_ULP, TCP_MD5SIG_EXT, TCP_FASTOPEN_KEY, TCP_FASTOPEN_NO_COOKIE, TCP_ZEROCOPY_RECEIVE, TCP_INQ, TCP_TX_DELAY. Добавлены IP_PKTINFO, IP_UNBLOCK_SOURCE, IP_BLOCK_SOURCE, IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP.

Изменено в версии 3.13: добавлена SO_BINDTOIFINDEX. В Linux эту константу можно использовать так же, как SO_BINDTODEVICE, но вместо имени указывается индекс сетевого интерфейса.

Изменено в версии 3.14: в Linux добавлены отсутствовавшие IP_FREEBIND, IP_RECVERR, IPV6_RECVERR, IP_RECVTTL и IP_RECVORIGDSTADDR.

Изменено в версии 3.14: добавлена поддержка TCP_QUICKACK на платформах Windows, если она доступна.

socket.AF_CAN
socket.PF_CAN
SOL_CAN_*
CAN_*

В модуле socket также определены многие константы этих форм, описанные в документации Linux.

Доступность: Linux >= 2.6.25, NetBSD >= 8.

Добавлено в версии 3.3.

Изменено в версии 3.11: добавлена поддержка NetBSD.

Изменено в версии 3.14: в Linux восстановлена отсутствовавшая CAN_RAW_ERR_FILTER.

socket.CAN_BCM
CAN_BCM_*

CAN_BCM в семействе протоколов CAN — это протокол диспетчера широковещательных рассылок (BCM). Константы диспетчера широковещательных рассылок, описанные в документации Linux, также определены в модуле socket.

Доступность: Linux >= 2.6.25.

Примечание

Флаг CAN_BCM_CAN_FD_FRAME доступен только в Linux >= 4.8.

Добавлено в версии 3.4.

socket.CAN_RAW_FD_FRAMES

Включает поддержку CAN FD в сокете CAN_RAW. По умолчанию она отключена. Это позволяет приложению отправлять как кадры CAN, так и кадры CAN FD; однако при чтении из сокета необходимо принимать и кадры CAN, и кадры CAN FD.

Эта константа описана в документации Linux.

Доступность: Linux >= 3.6.

Добавлено в версии 3.5.

socket.CAN_RAW_JOIN_FILTERS

Объединяет применённые фильтры CAN так, что в пространство пользователя передаются только кадры CAN, соответствующие всем указанным фильтрам CAN.

Эта константа описана в документации Linux.

Доступность: Linux >= 4.1.

Добавлено в версии 3.9.

socket.CAN_ISOTP

CAN_ISOTP в семействе протоколов CAN — это протокол ISO-TP (ISO 15765-2). Константы ISO-TP описаны в документации Linux.

Доступность: Linux >= 2.6.25.

Добавлено в версии 3.7.

socket.CAN_J1939

CAN_J1939 в семействе протоколов CAN — это протокол SAE J1939. Константы J1939 описаны в документации Linux.

Доступность: Linux >= 5.4.

Добавлено в версии 3.9.

socket.AF_DIVERT
socket.PF_DIVERT

Эти две константы, описанные на справочной странице FreeBSD divert(4), также определены в модуле socket.

Доступность: FreeBSD >= 14.0.

Добавлено в версии 3.12.

socket.AF_PACKET
socket.PF_PACKET
PACKET_*

В модуле socket также определены многие константы этих форм, описанные в документации Linux.

Доступность: Linux >= 2.2.

socket.ETH_P_ALL

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

Дополнительную информацию см. на справочной странице packet(7).

Доступность: Linux.

Добавлено в версии 3.12.

socket.AF_RDS
socket.PF_RDS
socket.SOL_RDS
RDS_*

В модуле socket также определены многие константы этих форм, описанные в документации Linux.

Доступность: Linux >= 2.6.30.

Добавлено в версии 3.3.

socket.SIO_RCVALL
socket.SIO_KEEPALIVE_VALS
socket.SIO_LOOPBACK_FAST_PATH
RCVALL_*

Константы для WSAIoctl() в Windows. Они используются в качестве аргументов метода ioctl() объектов сокетов.

Изменено в версии 3.6: добавлена SIO_LOOPBACK_FAST_PATH.

TIPC_*

Константы, связанные с TIPC и соответствующие константам, экспортируемым API сокетов C. Дополнительную информацию см. в документации TIPC.

socket.AF_ALG
socket.SOL_ALG
ALG_*

Константы для криптографии ядра Linux.

Доступность: Linux >= 2.6.38.

Добавлено в версии 3.6.

socket.AF_VSOCK
socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
VMADDR*
SO_VM*

Константы для взаимодействия между хостом и гостевой системой в Linux.

Доступность: Linux >= 4.8.

Добавлено в версии 3.7.

socket.AF_LINK

Доступность: BSD, macOS.

Добавлено в версии 3.4.

socket.has_ipv6

Эта константа содержит логическое значение, указывающее, поддерживается ли IPv6 на данной платформе.

socket.AF_BLUETOOTH
socket.BTPROTO_L2CAP
socket.BTPROTO_RFCOMM
socket.BTPROTO_HCI
socket.BTPROTO_SCO

Целочисленные константы для использования с адресами Bluetooth.

socket.BDADDR_ANY
socket.BDADDR_LOCAL

Это строковые константы, содержащие адреса Bluetooth со специальным значением. Например, BDADDR_ANY можно использовать для указания любого адреса при привязке сокета с помощью BTPROTO_RFCOMM.

socket.BDADDR_BREDR
socket.BDADDR_LE_PUBLIC
socket.BDADDR_LE_RANDOM

Эти константы определяют тип адреса Bluetooth при привязке или подключении сокета BTPROTO_L2CAP.

Доступность: Linux, FreeBSD

Добавлено в версии 3.14.

socket.SOL_RFCOMM
socket.SOL_L2CAP
socket.SOL_HCI
socket.SOL_SCO
socket.SOL_BLUETOOTH

Используются в аргументе level методов setsockopt() и getsockopt() объектов Bluetooth-сокетов.

SOL_BLUETOOTH доступна только в Linux. Другие константы доступны, если поддерживается соответствующий протокол.

SO_L2CAP_*
socket.L2CAP_LM
L2CAP_LM_*
SO_RFCOMM_*
RFCOMM_LM_*
SO_SCO_*
SO_BTH_*
BT_*

Используются в аргументах, задающих имя и значение параметра, методов setsockopt() и getsockopt() объектов Bluetooth-сокетов.

BT_* и L2CAP_LM доступны только в Linux. SO_BTH_* доступны только в Windows. Другие константы могут быть доступны в Linux и различных системах BSD.

Добавлено в версии 3.14.

socket.HCI_FILTER
socket.HCI_TIME_STAMP
socket.HCI_DATA_DIR
socket.SO_HCI_EVT_FILTER
socket.SO_HCI_PKT_FILTER

Имена параметров для использования с BTPROTO_HCI. Доступность и формат значений параметров зависят от платформы.

Изменено в версии 3.14: добавлены SO_HCI_EVT_FILTER и SO_HCI_PKT_FILTER в NetBSD и DragonFly BSD. Добавлена HCI_DATA_DIR в FreeBSD, NetBSD и DragonFly BSD.

socket.HCI_DEV_NONE

Значение device_id, используемое для создания сокета HCI, не привязанного к одному конкретному адаптеру Bluetooth.

Доступность: Linux

Добавлено в версии 3.14.

socket.HCI_CHANNEL_RAW
socket.HCI_CHANNEL_USER
socket.HCI_CHANNEL_MONITOR
socket.HCI_CHANNEL_CONTROL
socket.HCI_CHANNEL_LOGGING

Возможные значения поля channel в адресе BTPROTO_HCI.

Доступность: Linux

Добавлено в версии 3.14.

socket.AF_QIPCRTR

Константа для протокола маршрутизатора IPC компании Qualcomm, используемого для связи со службами, предоставляемыми удалёнными процессорами.

Доступность: Linux >= 4.7.

socket.SCM_CREDS2
socket.LOCAL_CREDS
socket.LOCAL_CREDS_PERSISTENT

LOCAL_CREDS и LOCAL_CREDS_PERSISTENT можно использовать с сокетами SOCK_DGRAM и SOCK_STREAM; они эквивалентны SO_PASSCRED в Linux/DragonFlyBSD. LOCAL_CREDS отправляет учётные данные при первом чтении, а LOCAL_CREDS_PERSISTENT — при каждом чтении; в последнем случае для типа сообщения необходимо использовать SCM_CREDS2.

Добавлено в версии 3.11.

Доступность: FreeBSD.

socket.SO_INCOMING_CPU

Константа для оптимизации локальности CPU, используется совместно с SO_REUSEPORT.

Добавлено в версии 3.11.

Доступность: Linux >= 3.9

socket.SO_REUSEPORT_LB

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

Добавлено в версии 3.14.

Доступность: FreeBSD >= 12.0

socket.AF_HYPERV
socket.HV_PROTOCOL_RAW
socket.HVSOCKET_CONNECT_TIMEOUT
socket.HVSOCKET_CONNECT_TIMEOUT_MAX
socket.HVSOCKET_CONNECTED_SUSPEND
socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU
socket.HV_GUID_ZERO
socket.HV_GUID_WILDCARD
socket.HV_GUID_BROADCAST
socket.HV_GUID_CHILDREN
socket.HV_GUID_LOOPBACK
socket.HV_GUID_PARENT

Константы для сокетов Windows Hyper-V, обеспечивающих взаимодействие хоста и гостевой системы.

Доступность: Windows.

Добавлено в версии 3.12.

socket.ETHERTYPE_ARP
socket.ETHERTYPE_IP
socket.ETHERTYPE_IPV6
socket.ETHERTYPE_VLAN

Константы — номер протокола IEEE 802.3.

Доступность: Linux, FreeBSD, macOS.

Добавлено в версии 3.12.

socket.SHUT_RD
socket.SHUT_WR
socket.SHUT_RDWR

Эти константы используются методом shutdown() объектов сокетов.

Доступность: недоступно в WASI.

Функции

Создание сокетов

Все перечисленные ниже функции создают объекты сокетов.

Конструктор класса socket создаёт новый сокет напрямую; параметры и полное описание см. в разделе Объекты сокетов.

socket.socketpair([family[, type[, proto]]])

Создаёт пару связанных объектов сокетов с указанными семейством адресов, типом сокета и номером протокола. Семейство адресов, тип сокета и номер протокола задаются так же, как для функции socket(). Семейство по умолчанию — AF_UNIX, если оно определено на платформе; в противном случае используется AF_INET.

Созданные сокеты являются не наследуемыми.

Изменено в версии 3.2: Возвращаемые объекты сокетов теперь поддерживают весь API сокетов, а не только его часть.

Изменено в версии 3.4: Возвращаемые сокеты теперь не наследуются.

Изменено в версии 3.5: Добавлена поддержка Windows.

socket.create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False)

Подключается к TCP-службе, прослушивающей интернет-адрес (2-кортеж (host, port)), и возвращает объект сокета. Это функция более высокого уровня, чем socket.connect(): если host — нечисловое имя узла, функция попытается разрешить его как для AF_INET, так и для AF_INET6, а затем по очереди попытается подключиться ко всем возможным адресам, пока подключение не будет установлено. Это упрощает создание клиентов, совместимых как с IPv4, так и с IPv6.

При передаче необязательного параметра timeout время ожидания для экземпляра сокета устанавливается перед попыткой подключения. Если timeout не указан, используется глобальное значение времени ожидания по умолчанию, возвращаемое функцией getdefaulttimeout().

Если указан параметр source_address, он должен быть 2-кортежем (host, port), по которому сокет привязывается к исходному адресу перед подключением. Если host или port равны ‘’ или 0 соответственно, используется поведение ОС по умолчанию.

Если установить подключение не удаётся, возникает исключение. По умолчанию это исключение, возникшее при попытке подключения к последнему адресу в списке. Если all_errors равно True, возникает ExceptionGroup, содержащая ошибки всех попыток.

Изменено в версии 3.2: Добавлен параметр source_address.

Изменено в версии 3.11: Добавлен параметр all_errors.

socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False)

Вспомогательная функция, создающая TCP-сокет, привязанный к адресу (2-кортеж (host, port)), и возвращающая объект сокета.

Значением family должно быть AF_INET или AF_INET6. backlog — размер очереди, передаваемый в socket.listen(); если он не указан, выбирается подходящее значение по умолчанию. Параметр reuse_port определяет, следует ли устанавливать параметр сокета SO_REUSEPORT.

Если dualstack_ipv6 имеет значение true, family равно AF_INET6, а платформа поддерживает эту возможность, сокет сможет принимать подключения как IPv4, так и IPv6; в противном случае возникнет ValueError. Предполагается, что большинство POSIX-платформ и Windows поддерживают эту функциональность. Если эта функция включена, адрес, возвращаемый методом socket.getpeername() при подключении IPv4, будет адресом IPv6, представленным в виде IPv4-отображённого адреса IPv6. Если dualstack_ipv6 имеет значение false, эта функция будет явно отключена на платформах, где она включена по умолчанию (например, в Linux). Этот параметр можно использовать вместе с has_dualstack_ipv6():

import socket

addr = ("", 8080)  # all interfaces, port 8080
if socket.has_dualstack_ipv6():
    s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)
else:
    s = socket.create_server(addr)

Примечание

На POSIX-платформах параметр сокета SO_REUSEADDR устанавливается, чтобы можно было немедленно повторно использовать ранее привязанные к тому же адресу сокеты, оставшиеся в состоянии TIME_WAIT.

Добавлено в версии 3.8.

socket.has_dualstack_ipv6()

Возвращает True, если платформа поддерживает создание TCP-сокета, способного обрабатывать подключения как IPv4, так и IPv6.

Добавлено в версии 3.8.

socket.fromfd(fd, family, type, proto=0)

Дублирует файловый дескриптор fd (целое число, возвращаемое методом fileno() файлового объекта) и создаёт из результата объект сокета. Семейство адресов, тип сокета и номер протокола задаются так же, как для функции socket(). Файловый дескриптор должен ссылаться на сокет, но это не проверяется — последующие операции над объектом могут завершиться ошибкой, если файловый дескриптор недействителен. Эта функция редко бывает нужна, но её можно использовать для получения или установки параметров сокета, переданного программе в качестве стандартного ввода или вывода (например, сервером, запущенным демоном inet в Unix). Предполагается, что сокет работает в блокирующем режиме.

Созданный сокет является не наследуемым.

Изменено в версии 3.4: Возвращаемый сокет теперь не наследуется.

socket.fromshare(data)

Создаёт экземпляр сокета из данных, полученных методом socket.share(). Предполагается, что сокет работает в блокирующем режиме.

Доступность: Windows.

Добавлено в версии 3.3.

Другие функции

Модуль socket также предоставляет различные сетевые службы:

socket.close(fd)

Закрывает файловый дескриптор сокета. Это аналог os.close(), но для сокетов. На некоторых платформах (в частности, в Windows) os.close() не работает с файловыми дескрипторами сокетов.

Добавлено в версии 3.7.

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

Эта функция обёртывает системную функцию C getaddrinfo.

Преобразует аргументы host/port в последовательность кортежей из 5 элементов, содержащих все необходимые аргументы для создания сокета, подключённого к этой службе. host — это доменное имя, строковое представление адреса IPv4/IPv6 или None. port — строковое имя службы, например 'http', номер порта или None. Передав None в качестве значения host и port, можно передать NULL в нижележащий API C.

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

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

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

(family, type, proto, canonname, sockaddr)

В этих кортежах значения family, type, proto — целые числа, предназначенные для передачи функции socket(). canonname будет строкой с каноническим именем host, если AI_CANONNAME включён в аргумент flags; в противном случае canonname будет пустым. sockaddr — это кортеж с адресом сокета, формат которого зависит от возвращённого значения family (кортеж из 2 элементов (address, port) для AF_INET, кортеж из 4 элементов (address, port, flowinfo, scope_id) для AF_INET6). Он предназначен для передачи методу socket.connect().

Примечание

Если вы собираетесь использовать результаты getaddrinfo() для создания сокета (а не, например, для получения canonname), рассмотрите возможность ограничить результаты с помощью type (например, SOCK_STREAM или SOCK_DGRAM) и/или proto (например, IPPROTO_TCP или IPPROTO_UDP), которые поддерживает ваше приложение.

Поведение при значениях по умолчанию для family, type, proto и flags зависит от системы.

Многие системы (например, большинство конфигураций Linux) возвращают отсортированный список всех подходящих адресов. Обычно следует пробовать эти адреса по порядку, пока подключение не будет установлено (возможно, параллельно, например, с помощью алгоритма Happy Eyeballs). В таких случаях ограничение type и/или proto может помочь исключить неудачные или непригодные попытки подключения.

Однако некоторые системы возвращают только один адрес. (Например, такое поведение отмечалось в конфигурациях Solaris и AIX.) В этих системах ограничение type и/или proto помогает убедиться, что этот адрес пригоден для использования.

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

В следующем примере извлекаются сведения об адресе для гипотетического TCP-подключения к example.org через порт 80 (результаты могут отличаться в вашей системе, если IPv6 не включён):

>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP)
[(socket.AF_INET6, socket.SOCK_STREAM,
 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),
 (socket.AF_INET, socket.SOCK_STREAM,
 6, '', ('93.184.216.34', 80))]

Изменено в версии 3.2: параметры теперь можно передавать с помощью именованных аргументов.

Изменено в версии 3.7: для адресов многоадресной рассылки IPv6 строковое представление адреса не будет содержать часть %scope_id.

socket.getfqdn([name])

Возвращает полное доменное имя для name. Если name не задано или пусто, оно интерпретируется как имя локального узла. Чтобы найти полное имя, проверяется имя узла, возвращённое функцией gethostbyaddr(), а затем, если они доступны, псевдонимы узла. Выбирается первое имя, содержащее точку. Если полное доменное имя недоступно и name было задано, оно возвращается без изменений. Если name было пустым или равнялось '0.0.0.0', возвращается имя узла из gethostname().

socket.gethostbyname(hostname)

Преобразует имя узла в формат адреса IPv4. Адрес IPv4 возвращается в виде строки, например '100.50.200.5'. Если имя узла само является адресом IPv4, оно возвращается без изменений. Более полный интерфейс предоставляет функция gethostbyname_ex(). gethostbyname() не поддерживает разрешение имён IPv6; для поддержки IPv4/IPv6 в двойном стеке следует использовать getaddrinfo().

Вызывает событие аудита socket.gethostbyname с аргументом hostname.

Доступность: недоступно в WASI.

socket.gethostbyname_ex(hostname)

Преобразует имя узла в формат адреса IPv4; расширенный интерфейс. Возвращает кортеж из 3 элементов (hostname, aliaslist, ipaddrlist), где hostname — основное имя узла, aliaslist — (возможно, пустой) список альтернативных имён того же узла, а ipaddrlist — список адресов IPv4 того же интерфейса на том же узле (часто, но не всегда, содержащий один адрес). gethostbyname_ex() не поддерживает разрешение имён IPv6; для поддержки IPv4/IPv6 в двойном стеке следует использовать getaddrinfo().

Вызывает событие аудита socket.gethostbyname с аргументом hostname.

Доступность: недоступно в WASI.

socket.gethostname()

Возвращает строку с именем узла компьютера, на котором в данный момент выполняется интерпретатор Python.

Вызывает событие аудита socket.gethostname без аргументов.

Примечание: gethostname() не всегда возвращает полное доменное имя; для этого используйте getfqdn().

Доступность: недоступно в WASI.

socket.gethostbyaddr(ip_address)

Возвращает кортеж из 3 элементов (hostname, aliaslist, ipaddrlist), где hostname — основное имя узла, отвечающего на запрос по заданному ip_address, aliaslist — (возможно, пустой) список альтернативных имён того же узла, а ipaddrlist — список адресов IPv4/IPv6 того же интерфейса на том же узле (скорее всего, содержащий только один адрес). Чтобы найти полное доменное имя, используйте функцию getfqdn(). gethostbyaddr() поддерживает IPv4 и IPv6.

Вызывает событие аудита socket.gethostbyaddr с аргументом ip_address.

Доступность: недоступно в WASI.

socket.getnameinfo(sockaddr, flags)

Преобразует адрес сокета sockaddr в кортеж из 2 элементов (host, port). В зависимости от значения flags, результат может содержать полное доменное имя или числовое представление адреса в host. Аналогично, port может содержать строковое имя порта или его номер.

Для адресов IPv6 к части узла добавляется %scope_id, если sockaddr содержит значимый scope_id. Обычно это происходит для адресов многоадресной рассылки.

Дополнительные сведения об аргументе flags можно найти в getnameinfo(3).

Вызывает событие аудита socket.getnameinfo с аргументом sockaddr.

Доступность: недоступно в WASI.

socket.getprotobyname(protocolname)

Преобразует имя интернет-протокола (например, 'icmp') в константу, подходящую для передачи в качестве третьего (необязательного) аргумента функции socket(). Обычно это требуется только для сокетов, открытых в «необработанном» режиме (SOCK_RAW); в обычных режимах сокета правильный протокол выбирается автоматически, если он не указан или равен нулю.

Доступность: недоступно в WASI.

socket.getservbyname(servicename[, protocolname])

Преобразует имя интернет-службы и имя протокола в номер порта этой службы. Если необязательное имя протокола задано, оно должно быть 'tcp' или 'udp'; в противном случае подойдёт любой протокол.

Вызывает событие аудита socket.getservbyname с аргументами servicename, protocolname.

Доступность: недоступно в WASI.

socket.getservbyport(port[, protocolname])

Преобразует номер интернет-порта и имя протокола в имя службы, использующей этот порт. Если необязательное имя протокола задано, оно должно быть 'tcp' или 'udp'; в противном случае подойдёт любой протокол.

Вызывает событие аудита socket.getservbyport с аргументами port, protocolname.

Доступность: недоступно в WASI.

socket.ntohl(x)

Преобразует положительные 32-разрядные целые числа из сетевого порядка байтов в порядок байтов узла. На компьютерах, где порядок байтов узла совпадает с сетевым, функция ничего не делает; в противном случае она меняет местами 4 байта.

socket.ntohs(x)

Преобразует положительные 16-разрядные целые числа из сетевого порядка байтов в порядок байтов узла. На компьютерах, где порядок байтов узла совпадает с сетевым, функция ничего не делает; в противном случае она меняет местами 2 байта.

Изменено в версии 3.10: вызывает OverflowError, если значение x не помещается в беззнаковое 16-разрядное целое число.

socket.htonl(x)

Преобразует положительные 32-разрядные целые числа из порядка байтов узла в сетевой порядок байтов. На компьютерах, где порядок байтов узла совпадает с сетевым, функция ничего не делает; в противном случае она меняет местами 4 байта.

socket.htons(x)

Преобразует положительные 16-разрядные целые числа из порядка байтов узла в сетевой порядок байтов. На компьютерах, где порядок байтов узла совпадает с сетевым, функция ничего не делает; в противном случае она меняет местами 2 байта.

Изменено в версии 3.10: вызывает OverflowError, если значение x не помещается в беззнаковое 16-разрядное целое число.

socket.inet_aton(ip_string)

Преобразует адрес IPv4 из строкового формата с точками (например, ‘123.45.67.89’) в упакованный двоичный формат длиной 32 бита — объект bytes длиной четыре символа. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа in_addr, которым в C обозначается упакованный двоичный формат длиной 32 бита, возвращаемый этой функцией.

inet_aton() также принимает строки с менее чем тремя точками; подробности см. на странице руководства Unix inet(3).

Если переданная этой функции строка адреса IPv4 недопустима, будет вызвано исключение OSError. Обратите внимание, что точное определение допустимого значения зависит от нижележащей реализации C inet_aton().

inet_aton() не поддерживает IPv6; для поддержки IPv4/IPv6 в двойном стеке следует использовать inet_pton().

socket.inet_ntoa(packed_ip)

Преобразует упакованный 32-разрядный адрес IPv4 (объект подобный bytes длиной четыре байта) в стандартное строковое представление с точками (например, ‘123.45.67.89’). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа in_addr, которым в C обозначаются упакованные двоичные данные длиной 32 бита, принимаемые этой функцией в качестве аргумента.

Если переданная этой функции последовательность байтов имеет длину, отличную от 4 байт, будет вызвано исключение OSError. inet_ntoa() не поддерживает IPv6; для поддержки IPv4/IPv6 в двойном стеке следует использовать inet_ntop().

Изменено в версии 3.5: теперь принимаются доступные для записи объекты подобные bytes.

socket.inet_pton(address_family, ip_string)

Преобразует IP-адрес из строкового формата, специфичного для его семейства, в упакованный двоичный формат. inet_pton() полезна, когда библиотеке или сетевому протоколу требуется объект типа in_addr (аналогичный inet_aton()) или in6_addr.

В настоящее время поддерживаются значения address_family AF_INET и AF_INET6. Если строка IP-адреса ip_string недопустима, будет вызвано исключение OSError. Обратите внимание, что точное определение допустимого значения зависит как от значения address_family, так и от нижележащей реализации inet_pton().

Доступность: Unix, Windows.

Изменено в версии 3.4: добавлена поддержка Windows

socket.inet_ntop(address_family, packed_ip)

Преобразует упакованный IP-адрес (объект подобный bytes некоторой длины) в стандартное строковое представление, специфичное для его семейства (например, '7.10.0.5' или '5aef:2b::8'). inet_ntop() полезна, когда библиотека или сетевой протокол возвращает объект типа in_addr (аналогичный inet_ntoa()) или in6_addr.

В настоящее время поддерживаются значения address_family AF_INET и AF_INET6. Если объект bytes packed_ip имеет длину, не соответствующую указанному семейству адресов, будет вызвано исключение ValueError. При ошибках вызова inet_ntop() вызывается исключение OSError.

Доступность: Unix, Windows.

Изменено в версии 3.4: добавлена поддержка Windows

Изменено в версии 3.5: теперь принимаются доступные для записи объекты подобные bytes.

socket.CMSG_LEN(length)

Возвращает общую длину элемента вспомогательных данных с данными заданной длины length без учёта завершающего заполнения. Это значение часто можно использовать как размер буфера для recvmsg(), чтобы получить один элемент вспомогательных данных, однако RFC 3542 требует, чтобы переносимые приложения использовали CMSG_SPACE() и тем самым резервировали место для заполнения, даже если элемент будет последним в буфере. Вызывает исключение OverflowError, если значение length выходит за допустимый диапазон.

Доступность: Unix, кроме WASI.

Большинство платформ Unix.

Добавлено в версии 3.3.

socket.CMSG_SPACE(length)

Возвращает размер буфера, необходимый для recvmsg(), чтобы получить элемент вспомогательных данных с данными заданной длины length вместе с завершающим заполнением. Размер буфера, необходимый для получения нескольких элементов, равен сумме значений CMSG_SPACE() для длин данных этих элементов. Вызывает исключение OverflowError, если значение length выходит за допустимый диапазон.

Обратите внимание, что некоторые системы могут поддерживать вспомогательные данные, не предоставляя эту функцию. Кроме того, установка размера буфера на основе результата этой функции может не ограничить точно объём получаемых вспомогательных данных, поскольку дополнительные данные могут поместиться в области заполнения.

Доступность: Unix, кроме WASI.

Большинство платформ Unix.

Добавлено в версии 3.3.

socket.getdefaulttimeout()

Возвращает значение времени ожидания по умолчанию в секундах (число с плавающей точкой) для новых объектов сокетов. Значение None означает, что у новых объектов сокетов нет времени ожидания. При первом импорте модуля socket значение по умолчанию равно None.

socket.setdefaulttimeout(timeout)

Задаёт значение времени ожидания по умолчанию в секундах (число с плавающей точкой) для новых объектов сокетов. При первом импорте модуля socket значение по умолчанию равно None. Возможные значения и их значения см. в settimeout().

socket.sethostname(name)

Задаёт компьютеру имя узла name. Если у вас недостаточно прав, будет вызвано исключение OSError.

Вызывает событие аудита socket.sethostname с аргументом name.

Доступность: Unix, кроме Android.

Добавлено в версии 3.3.

socket.if_nameindex()

Возвращает список кортежей со сведениями о сетевых интерфейсах (целочисленный индекс, строковое имя). Вызывает исключение OSError при сбое системного вызова.

Доступность: Unix, Windows, кроме WASI.

Добавлено в версии 3.3.

Изменено в версии 3.8: добавлена поддержка Windows.

Примечание

В Windows сетевые интерфейсы имеют разные имена в разных контекстах (все примеры):

  • UUID: {FB605B73-AAC2-49A6-9A2F-25416AEA0573}
  • имя: ethernet_32770
  • понятное имя: vEthernet (nat)
  • описание: Hyper-V Virtual Ethernet Adapter

Эта функция возвращает имена второго типа из списка — в данном примере ethernet_32770.

socket.if_nametoindex(if_name)

Возвращает номер индекса сетевого интерфейса, соответствующий имени интерфейса. Вызывает исключение OSError, если интерфейса с указанным именем не существует.

Доступность: Unix, Windows, кроме WASI.

Добавлено в версии 3.3.

Изменено в версии 3.8: добавлена поддержка Windows.

См. также

«Имя интерфейса» — это имя, описанное в if_nameindex().

socket.if_indextoname(if_index)

Возвращает имя сетевого интерфейса, соответствующее номеру его индекса. Вызывает исключение OSError, если интерфейса с указанным индексом не существует.

Доступность: Unix, Windows, кроме WASI.

Добавлено в версии 3.3.

Изменено в версии 3.8: добавлена поддержка Windows.

См. также

«Имя интерфейса» — это имя, описанное в if_nameindex().

socket.send_fds(sock, buffers, fds[, flags[, address]])

Отправляет список файловых дескрипторов fds через сокет AF_UNIX sock. Параметр fds — это последовательность файловых дескрипторов. Описание этих параметров см. в sendmsg().

Доступность: Unix, кроме WASI.

Платформы Unix с поддержкой sendmsg() и механизма SCM_RIGHTS.

Добавлено в версии 3.9.

socket.recv_fds(sock, bufsize, maxfds[, flags])

Получает до maxfds файловых дескрипторов из сокета AF_UNIX sock. Возвращает (msg, list(fds), flags, addr). Описание этих параметров см. в recvmsg().

Доступность: Unix, кроме WASI.

Платформы Unix с поддержкой recvmsg() и механизма SCM_RIGHTS.

Добавлено в версии 3.9.

Примечание

Любые усечённые целые числа в конце списка файловых дескрипторов.

Объекты сокетов

class socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

Создаёт новый сокет, используя заданные семейство адресов, тип сокета и номер протокола. Семейство адресов должно быть AF_INET (по умолчанию), AF_INET6, AF_UNIX, AF_CAN, AF_PACKET или AF_RDS. Тип сокета должен быть SOCK_STREAM (по умолчанию), SOCK_DGRAM, SOCK_RAW или, возможно, одной из других констант SOCK_. Номер протокола обычно равен нулю, поэтому его можно не указывать; в случае, когда семейство адресов — AF_CAN, протоколом должен быть один из CAN_RAW, CAN_BCM, CAN_ISOTP или CAN_J1939.

Если указан fileno, значения family, type и proto автоматически определяются по указанному файловому дескриптору. Автоматическое определение можно переопределить, вызвав функцию с явными аргументами family, type или proto. Это влияет только на представление данных в Python, например на возвращаемое значение socket.getpeername(), но не на сам ресурс ОС. В отличие от socket.fromfd(), fileno возвращает тот же сокет, а не его дубликат. Это может помочь закрыть отсоединённый сокет с помощью socket.close().

Созданный сокет является не наследуемым.

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

Изменено в версии 3.3: Добавлено семейство AF_CAN. Добавлено семейство AF_RDS.

Изменено в версии 3.4: Добавлен протокол CAN_BCM.

Изменено в версии 3.4: Теперь возвращаемый сокет не наследуется.

Изменено в версии 3.7: Добавлен протокол CAN_ISOTP.

Изменено в версии 3.7: Если к type применяются битовые флаги SOCK_NONBLOCK или SOCK_CLOEXEC, они сбрасываются, и socket.type их не отражает. При этом они по-прежнему передаются нижележащему системному вызову socket(). Поэтому

sock = socket.socket(
    socket.AF_INET,
    socket.SOCK_STREAM | socket.SOCK_NONBLOCK)

по-прежнему создаст неблокирующий сокет в ОС, поддерживающих SOCK_NONBLOCK, но sock.type будет установлено в socket.SOCK_STREAM.

Изменено в версии 3.9: Добавлен протокол CAN_J1939.

Изменено в версии 3.10: Добавлен протокол IPPROTO_MPTCP.

Объекты сокетов имеют следующие методы. За исключением makefile(), они соответствуют системным вызовам Unix, применимым к сокетам.

Изменено в версии 3.2: Добавлена поддержка протокола менеджера контекста. Выход из менеджера контекста равносилен вызову close().

accept()

Принимает соединение. Сокет должен быть привязан к адресу и ожидать входящих соединений. Возвращаемое значение — пара (conn, address), где conn — новый объект сокета, который можно использовать для отправки и получения данных в рамках соединения, а address — адрес, к которому привязан сокет на другом конце соединения.

Созданный сокет является не наследуемым.

Изменено в версии 3.4: Теперь сокет не наследуется.

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).

bind(address)

Привязывает сокет к адресу address. Сокет ещё не должен быть привязан. Формат address зависит от семейства адресов — см. Семейства сокетов.

Вызывает событие аудита socket.bind с аргументами self, address.

Доступность: недоступно в WASI.

close()

Помечает сокет как закрытый. Нижележащий системный ресурс (например, файловый дескриптор) также закрывается, когда закрыты все файловые объекты, созданные с помощью makefile(). После этого все дальнейшие операции с объектом сокета завершатся ошибкой. Удалённый конец больше не будет получать данные (после отправки данных, находящихся в очереди).

Сокеты автоматически закрываются при сборке мусора, но рекомендуется закрывать их явно с помощью close() или использовать для них оператор with.

Изменено в версии 3.6: Теперь вызывается OSError, если при выполнении нижележащего вызова close() возникает ошибка.

Примечание

close() освобождает ресурс, связанный с соединением, но не обязательно немедленно закрывает само соединение. Чтобы закрыть соединение без задержки, вызовите shutdown() перед close().

connect(address)

Подключается к удалённому сокету по адресу address. Формат address зависит от семейства адресов — см. Семейства сокетов.

Если соединение прерывается сигналом, метод ожидает его установления или при истечении времени ожидания вызывает TimeoutError, если обработчик сигнала не вызывает исключение, а сокет является блокирующим или для него установлен тайм-аут. Для неблокирующих сокетов метод вызывает исключение InterruptedError, если соединение прерывается сигналом (или исключение, вызванное обработчиком сигнала).

Вызывает событие аудита socket.connect с аргументами self, address.

Изменено в версии 3.5: Теперь метод ожидает завершения соединения вместо того, чтобы вызывать исключение InterruptedError, если соединение прерывается сигналом, обработчик сигнала не вызывает исключение, а сокет является блокирующим или для него установлен тайм-аут (обоснование см. в PEP 475).

Доступность: недоступно в WASI.

connect_ex(address)

Как connect(address), но вместо вызова исключения при ошибках, возвращённых вызовом connect() на уровне C, возвращает индикатор ошибки (другие проблемы, например «узел не найден», всё ещё могут приводить к исключениям). Если операция выполнена успешно, индикатор ошибки равен 0; в противном случае возвращается значение переменной errno. Это полезно, например, для поддержки асинхронных подключений.

Вызывает событие аудита socket.connect с аргументами self, address.

Доступность: недоступно в WASI.

detach()

Переводит объект сокета в закрытое состояние, фактически не закрывая нижележащий файловый дескриптор. Файловый дескриптор возвращается и может быть использован для других целей.

Добавлено в версии 3.2.

dup()

Создаёт копию сокета.

Созданный сокет является не наследуемым.

Изменено в версии 3.4: Теперь сокет не наследуется.

Доступность: недоступно в WASI.

fileno()

Возвращает файловый дескриптор сокета (небольшое целое число) или -1 в случае сбоя. Это полезно при использовании с select.select().

В Windows небольшое целое число, возвращаемое этим методом, нельзя использовать там, где допустим файловый дескриптор (например, в os.fdopen()). В Unix такого ограничения нет.

get_inheritable()

Возвращает флаг наследования файлового дескриптора или дескриптора сокета: True, если сокет может наследоваться дочерними процессами, и False, если не может.

Добавлено в версии 3.4.

getpeername()

Возвращает удалённый адрес, к которому подключён сокет. Например, это полезно, чтобы узнать номер порта удалённого сокета IPv4/v6. Формат возвращаемого адреса зависит от семейства адресов — см. Семейства сокетов. В некоторых системах эта функция не поддерживается.

getsockname()

Возвращает собственный адрес сокета. Например, это полезно, чтобы узнать номер порта сокета IPv4/v6. Формат возвращаемого адреса зависит от семейства адресов — см. Семейства сокетов.

getsockopt(level, optname[, buflen])

Возвращает значение заданной опции сокета (см. страницу руководства Unix getsockopt(2)). Необходимые символьные константы (SO_* и т. д.) определены в этом модуле. Если buflen не задан, предполагается, что опция целочисленная, и функция возвращает её целочисленное значение. Если buflen задан, он указывает максимальную длину буфера, используемого для получения опции; этот буфер возвращается как объект bytes. Вызывающий код должен самостоятельно декодировать содержимое буфера (способ декодирования структур C, закодированных в виде байтовых строк, см. в необязательном встроенном модуле struct).

Доступность: недоступно в WASI.

getblocking()

Возвращает True, если сокет работает в блокирующем режиме, и False, если в неблокирующем.

Это эквивалентно проверке socket.gettimeout() != 0.

Добавлено в версии 3.7.

gettimeout()

Возвращает тайм-аут в секундах (число с плавающей точкой), установленный для операций с сокетом, или None, если тайм-аут не задан. Значение соответствует последнему вызову setblocking() или settimeout().

ioctl(control, option)

Метод ioctl() предоставляет ограниченный интерфейс к системному интерфейсу WSAIoctl. Дополнительную информацию см. в документации Win32.

На других платформах можно использовать универсальные функции fcntl.fcntl() и fcntl.ioctl(); они принимают объект сокета в качестве первого аргумента.

В настоящее время поддерживаются только следующие управляющие коды: SIO_RCVALL, SIO_KEEPALIVE_VALS и SIO_LOOPBACK_FAST_PATH.

Доступность: Windows

Изменено в версии 3.6: Добавлен SIO_LOOPBACK_FAST_PATH.

listen([backlog])

Позволяет серверу принимать соединения. Если указан backlog, он должен быть не меньше 0 (если значение меньше, оно устанавливается равным 0); он задаёт количество непринятых соединений, которое система допускает до отказа принимать новые соединения. Если значение не указано, выбирается разумное значение по умолчанию.

Доступность: недоступно в WASI.

Изменено в версии 3.5: Параметр backlog теперь необязателен.

makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)

Возвращает файловый объект, связанный с сокетом. Точный тип возвращаемого объекта зависит от аргументов, переданных в makefile(). Эти аргументы интерпретируются так же, как и встроенной функцией open(), за исключением того, что поддерживаются только следующие значения mode: 'r' (по умолчанию), 'w', 'b' или их сочетание.

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

Закрытие файлового объекта, возвращённого makefile(), не закроет исходный сокет, если не закрыты все остальные файловые объекты и для объекта сокета не был вызван socket.close().

Примечание

В Windows файловый объект, созданный с помощью makefile(), нельзя использовать там, где требуется файловый объект с файловым дескриптором, например в аргументах потоков subprocess.Popen().

recv(bufsize[, flags])

Получает данные из сокета. Возвращаемое значение — объект bytes, содержащий полученные данные. Максимальный объём данных, получаемых за один раз, задаётся параметром bufsize. Пустой возвращаемый объект bytes означает, что клиент отключился. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию он равен нулю.

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).

recvfrom(bufsize[, flags])

Получает данные из сокета. Возвращаемое значение — пара (bytes, address), где bytes — объект bytes, содержащий полученные данные, а address — адрес сокета, отправившего данные. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию он равен нулю. Формат address зависит от семейства адресов — см. Семейства сокетов.

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).

Изменено в версии 3.7: Для многоадресного IPv6-адреса первый элемент address больше не содержит часть %scope_id. Чтобы получить полный IPv6-адрес, используйте getnameinfo().

recvmsg(bufsize[, ancbufsize[, flags]])

Получает обычные данные (до bufsize байт) и вспомогательные данные из сокета. Аргумент ancbufsize задаёт размер в байтах внутреннего буфера, используемого для получения вспомогательных данных; по умолчанию он равен 0, то есть вспомогательные данные не получаются. Подходящие размеры буфера для вспомогательных данных можно вычислить с помощью CMSG_SPACE() или CMSG_LEN(); элементы, не помещающиеся в буфер, могут быть усечены или отброшены. По умолчанию аргумент flags равен 0; он имеет то же значение, что и для recv().

Возвращаемое значение — кортеж из 4 элементов: (data, ancdata, msg_flags, address). Элемент data — объект bytes, содержащий полученные данные, не относящиеся к вспомогательным. Элемент ancdata — список из нуля или более кортежей (cmsg_level, cmsg_type, cmsg_data), представляющих полученные вспомогательные данные (управляющие сообщения): cmsg_level и cmsg_type — целые числа, задающие соответственно уровень протокола и тип, специфичный для протокола, а cmsg_data — объект bytes, содержащий связанные с ними данные. Элемент msg_flags — побитовое ИЛИ различных флагов, указывающих на условия получения сообщения; подробности см. в документации вашей системы. Если принимающий сокет не подключён, address содержит адрес отправляющего сокета, если он доступен; в противном случае его значение не определено.

В некоторых системах sendmsg() и recvmsg() позволяют передавать файловые дескрипторы между процессами через сокет AF_UNIX. При использовании этой возможности (она часто ограничена сокетами SOCK_STREAM) recvmsg() возвращает во вспомогательных данных элементы вида (socket.SOL_SOCKET, socket.SCM_RIGHTS, fds), где fds — объект bytes, представляющий новые файловые дескрипторы в виде двоичного массива элементов нативного типа C int. Если recvmsg() вызывает исключение после возврата системного вызова, сначала будет предпринята попытка закрыть все файловые дескрипторы, полученные этим способом.

Некоторые системы не сообщают длину усечённых вспомогательных данных, полученных лишь частично. Если какой-либо элемент, судя по всему, выходит за пределы буфера, recvmsg() выдаст предупреждение RuntimeWarning и вернёт ту его часть, которая помещается в буфер, если только элемент не был усечён до начала связанных с ним данных.

В системах, поддерживающих механизм SCM_RIGHTS, следующая функция получит до maxfds файловых дескрипторов и вернёт данные сообщения и список с дескрипторами (игнорируя неожиданные ситуации, например получение посторонних управляющих сообщений). См. также sendmsg().

import socket, array

def recv_fds(sock, msglen, maxfds):
    fds = array.array("i")   # Array of ints
    msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))
    for cmsg_level, cmsg_type, cmsg_data in ancdata:
        if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:
            # Append data, ignoring any truncated integers at the end.
            fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
    return msg, list(fds)

Доступность: Unix.

Большинство платформ Unix.

Добавлено в версии 3.3.

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).

recvmsg_into(buffers[, ancbufsize[, flags]])

Получает обычные и вспомогательные данные из сокета, работая так же, как recvmsg(), но распределяет данные, не относящиеся к вспомогательным, по нескольким буферам вместо возврата нового объекта bytes. Аргумент buffers должен быть итерируемым объектом, элементы которого предоставляют доступные для записи буферы (например, объектами bytearray); эти буферы заполняются последовательными фрагментами обычных данных, пока все данные не будут записаны или не закончатся буферы. Операционная система может ограничивать число используемых буферов (значением sysconf() SC_IOV_MAX). Аргументы ancbufsize и flags имеют то же значение, что и для recvmsg().

Возвращаемое значение — кортеж из 4 элементов: (nbytes, ancdata, msg_flags, address), где nbytes — общее количество байтов обычных данных, записанных в буферы, а ancdata, msg_flags и address имеют то же значение, что и в recvmsg().

Пример:

>>> import socket
>>> s1, s2 = socket.socketpair()
>>> b1 = bytearray(b'----')
>>> b2 = bytearray(b'0123456789')
>>> b3 = bytearray(b'--------------')
>>> s1.send(b'Mary had a little lamb')
22
>>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])
(22, [], 0, None)
>>> [b1, b2, b3]
[bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]

Доступность: Unix.

Большинство платформ Unix.

Добавлено в версии 3.3.

recvfrom_into(buffer[, nbytes[, flags]])

Получает данные из сокета и записывает их в buffer, не создавая новую байтовую строку. Возвращаемое значение — пара (nbytes, address), где nbytes — количество полученных байтов, а address — адрес сокета, отправившего данные. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию он равен нулю. Формат address зависит от семейства адресов — см. Семейства сокетов.

recv_into(buffer[, nbytes[, flags]])

Получает из сокета не более nbytes байт и сохраняет данные в буфер, а не создаёт новую байтовую строку. Если nbytes не задано (или равно 0), получает не более объёма данных, доступного в указанном буфере. Возвращает количество полученных байт. О значении необязательного аргумента flags см. страницу руководства Unix recv(2); по умолчанию он равен нулю.

send(bytes[, flags])

Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и для recv(). Возвращает количество отправленных байт. Приложения отвечают за проверку того, что все данные отправлены; если передана только часть данных, приложению необходимо попытаться доставить оставшиеся данные. Дополнительные сведения см. в руководстве по программированию сокетов.

Изменено в версии 3.5: Если системный вызов прерван, а обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо вызова исключения InterruptedError (обоснование см. в PEP 475).

sendall(bytes[, flags])

Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и для recv(). В отличие от send(), этот метод продолжает отправлять данные из bytes, пока не будут отправлены все данные или не произойдёт ошибка. В случае успеха возвращается None. При ошибке вызывается исключение, и определить, сколько данных, если вообще сколько-нибудь, было успешно отправлено, невозможно.

Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается после каждой успешной отправки данных. Теперь тайм-аут сокета задаёт максимальную общую продолжительность отправки всех данных.

Изменено в версии 3.5: Если системный вызов прерван, а обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо вызова исключения InterruptedError (обоснование см. в PEP 475).

sendto(bytes, address)
sendto(bytes, flags, address)

Отправляет данные в сокет. Сокет не должен быть подключён к удалённому сокету, поскольку адрес сокета назначения задаётся аргументом address. Необязательный аргумент flags имеет то же значение, что и для recv(). Возвращает количество отправленных байт. Формат address зависит от семейства адресов — см. Семейства сокетов.

Вызывает событие аудита socket.sendto с аргументами self, address.

Изменено в версии 3.5: Если системный вызов прерван, а обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо вызова исключения InterruptedError (обоснование см. в PEP 475).

sendmsg(buffers[, ancdata[, flags[, address]]])

Отправляет обычные и вспомогательные данные в сокет, собирая обычные данные из последовательности буферов и объединяя их в одно сообщение. Аргумент buffers задаёт обычные данные как итерируемый объект из объектов, подобных bytes (например, объектов bytes); операционная система может ограничить (sysconf(), значение SC_IOV_MAX) количество используемых буферов. Аргумент ancdata задаёт вспомогательные данные (управляющие сообщения) как итерируемый объект с нулём или более кортежей (cmsg_level, cmsg_type, cmsg_data), где cmsg_level и cmsg_type — целые числа, задающие соответственно уровень протокола и тип, специфичный для протокола, а cmsg_data — объект, подобный bytes, содержащий связанные данные. Обратите внимание, что некоторые системы (в частности, системы без CMSG_SPACE()) могут поддерживать отправку только одного управляющего сообщения за вызов. Аргумент flags по умолчанию равен 0 и имеет то же значение, что и для send(). Если аргумент address задан и не равен None, он задаёт адрес назначения сообщения. Возвращаемое значение — количество отправленных байт обычных данных.

Следующая функция отправляет список файловых дескрипторов fds через сокет AF_UNIX в системах, поддерживающих механизм SCM_RIGHTS. См. также recvmsg().

import socket, array

def send_fds(sock, msg, fds):
    return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])

Доступность: Unix, кроме WASI.

Большинство платформ Unix.

Вызывает событие аудита socket.sendmsg с аргументами self, address.

Добавлено в версии 3.3.

Изменено в версии 3.5: Если системный вызов прерван, а обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо вызова исключения InterruptedError (обоснование см. в PEP 475).

sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])

Специализированная версия sendmsg() для сокета AF_ALG. Задаёт режим, IV, длину связанных данных AEAD и флаги для сокета AF_ALG.

Доступность: Linux >= 2.6.38.

Добавлено в версии 3.6.

sendfile(file, offset=0, count=None)

Отправляет файл до достижения EOF, используя высокопроизводительную функцию os.sendfile, и возвращает общее количество отправленных байт. file должен быть обычным файловым объектом, открытым в двоичном режиме. Если os.sendfile недоступна (например, в Windows) или file не является обычным файлом, вместо неё будет использоваться send(). offset указывает, с какого места начать чтение файла. Если задан аргумент count, он определяет общее количество байт для передачи, вместо отправки файла до достижения EOF. При возврате позиция в файле обновляется; она обновляется и в случае ошибки, и тогда для определения количества отправленных байт можно использовать file.tell(). Сокет должен иметь тип SOCK_STREAM. Неблокирующие сокеты не поддерживаются.

Добавлено в версии 3.5.

set_inheritable(inheritable)

Устанавливает флаг наследования файлового дескриптора или дескриптора сокета.

Добавлено в версии 3.4.

setblocking(flag)

Устанавливает для сокета блокирующий или неблокирующий режим: если flag имеет значение false, сокет переводится в неблокирующий режим, в противном случае — в блокирующий.

Этот метод является сокращённой записью для некоторых вызовов settimeout():

  • sock.setblocking(True) эквивалентно sock.settimeout(None)
  • sock.setblocking(False) эквивалентно sock.settimeout(0.0)

Изменено в версии 3.7: Метод больше не устанавливает флаг SOCK_NONBLOCK для socket.type.

settimeout(value)

Устанавливает тайм-аут для блокирующих операций с сокетом. Аргумент value может быть неотрицательным вещественным числом, задающим секунды, или None. Если задано ненулевое значение, последующие операции с сокетом вызовут исключение timeout, если до завершения операции истечёт период тайм-аута value. Если задано нулевое значение, сокет переводится в неблокирующий режим. Если задано None, сокет переводится в блокирующий режим.

Дополнительные сведения см. в примечаниях о тайм-аутах сокетов.

Изменено в версии 3.7: Метод больше не переключает флаг SOCK_NONBLOCK для socket.type.

setsockopt(level, optname, value: int | Buffer)
setsockopt(level, optname, None, optlen: int)

Устанавливает значение указанной опции сокета (см. страницу руководства Unix setsockopt(2)). Необходимые символьные константы определены в этом модуле (SO_* и т. д. <socket-unix-constants>). Значение может быть целым числом, None или объектом, подобным bytes, представляющим буфер. В последнем случае вызывающий код должен обеспечить, чтобы байтовая строка содержала правильные биты (способ кодирования структур C в байтовые строки см. в необязательном встроенном модуле struct). Если для value задано None, необходимо указать аргумент optlen. Это эквивалентно вызову функции C setsockopt() с optval=NULL и optlen=optlen.

Изменено в версии 3.5: Теперь допускается записываемый объект, подобный bytes.

Изменено в версии 3.6: Добавлена форма setsockopt(level, optname, None, optlen: int).

Доступность: кроме WASI.

shutdown(how)

Завершает работу одной или обеих сторон соединения. Если how имеет значение SHUT_RD, дальнейший приём данных запрещён. Если how имеет значение SHUT_WR, дальнейшая отправка данных запрещена. Если how имеет значение SHUT_RDWR, дальнейшие отправка и приём данных запрещены.

Доступность: кроме WASI.

share(process_id)

Создаёт копию сокета и подготавливает её для совместного использования с целевым процессом. Необходимо указать process_id целевого процесса. Полученный объект bytes можно передать целевому процессу с помощью какого-либо механизма межпроцессного взаимодействия, а затем воссоздать там сокет с помощью fromshare(). После вызова этого метода сокет можно безопасно закрыть, поскольку операционная система уже создала его копию для целевого процесса.

Доступность: Windows.

Добавлено в версии 3.3.

Обратите внимание, что методов read() и write() нет; вместо них используйте recv() и send() без аргумента flags.

У объектов socket также есть следующие атрибуты (только для чтения), соответствующие значениям, переданным конструктору socket.

family

Семейство сокета.

type

Тип сокета.

proto

Протокол сокета.

class socket.SocketType

Базовый класс типа socket, повторно экспортируемый из _socket. Проверка экземпляра, например isinstance(socket(...), SocketType), возвращает true, но SocketType — не то же самое, что type(socket(...)), которым является сам socket.

Примечания о тайм-аутах сокетов

Объект socket может находиться в одном из трёх режимов: блокирующем, неблокирующем или с тайм-аутом. По умолчанию сокеты всегда создаются в блокирующем режиме, но это можно изменить, вызвав setdefaulttimeout().

  • В блокирующем режиме операции блокируются до завершения или до возврата системой ошибки (например, тайм-аута соединения).
  • В неблокирующем режиме операции завершаются с ошибкой (которая, к сожалению, зависит от системы), если их нельзя выполнить немедленно: функции модуля select можно использовать, чтобы узнать, доступен ли сокет для чтения или записи и когда именно.
  • В режиме с тайм-аутом операции завершаются с ошибкой, если их нельзя выполнить в течение указанного для сокета тайм-аута (вызывается исключение timeout) или если система возвращает ошибку.

Примечание

На уровне операционной системы сокеты в режиме с тайм-аутом внутренне переводятся в неблокирующий режим. Кроме того, блокирующий режим и режим с тайм-аутом являются общими для файловых дескрипторов и объектов socket, ссылающихся на одну и ту же сетевую конечную точку. Эта особенность реализации может иметь видимые последствия, если, например, вы решите использовать fileno() сокета.

Тайм-ауты и метод connect

На операцию connect() также распространяется настройка тайм-аута. В общем случае рекомендуется вызвать settimeout() перед вызовом connect() или передать параметр тайм-аута в create_connection(). Однако сетевой стек системы также может самостоятельно вернуть ошибку тайм-аута соединения независимо от настроек тайм-аута сокетов Python.

Тайм-ауты и метод accept

Если getdefaulttimeout() не равен None, сокеты, возвращаемые методом accept(), наследуют этот тайм-аут. В противном случае поведение зависит от настроек слушающего сокета:

  • если слушающий сокет работает в блокирующем режиме или в режиме с тайм-аутом, сокет, возвращаемый accept(), работает в блокирующем режиме;
  • если слушающий сокет работает в неблокирующем режиме, выбор между блокирующим и неблокирующим режимом для сокета, возвращаемого accept(), зависит от операционной системы. Для обеспечения единообразного поведения на разных платформах рекомендуется вручную переопределить эту настройку.

Пример

Ниже приведены четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который возвращает все полученные данные (обслуживая только одного клиента), и клиент, использующий этот сервер. Обратите внимание: сервер должен выполнить последовательность socket(), bind(), listen(), accept() (возможно, повторяя accept() для обслуживания нескольких клиентов), тогда как клиенту достаточно последовательности socket(), connect(). Также обратите внимание: сервер вызывает sendall()/recv() не для слушающего сокета, а для нового сокета, возвращённого accept().

Первые два примера поддерживают только IPv4.

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data: break
            conn.sendall(data)
# Echo client program
import socket

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))

Следующие два примера идентичны предыдущим, но поддерживают как IPv4, так и IPv6. Сервер будет слушать адрес первого доступного семейства адресов (вместо этого ему следовало бы слушать оба). В большинстве систем с поддержкой IPv6 приоритет будет у IPv6, поэтому сервер может не принимать трафик IPv4. Клиент попытается подключиться ко всем адресам, полученным в результате разрешения имени, и отправит трафик по первому адресу, с которым удалось установить соединение.

# Echo server program
import socket
import sys

HOST = None               # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.bind(sa)
        s.listen(1)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
conn, addr = s.accept()
with conn:
    print('Connected by', addr)
    while True:
        data = conn.recv(1024)
        if not data: break
        conn.send(data)
# Echo client program
import socket
import sys

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except OSError as msg:
        s = None
        continue
    try:
        s.connect(sa)
    except OSError as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print('could not open socket')
    sys.exit(1)
with s:
    s.sendall(b'Hello, world')
    data = s.recv(1024)
print('Received', repr(data))

В следующем примере показано, как написать очень простой сетевой анализатор с использованием raw-сокетов в Windows. Для изменения интерфейса примеру требуются права администратора:

import socket

# the public network interface
HOST = socket.gethostbyname(socket.gethostname())

# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# receive all packets
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# receive a packet
print(s.recvfrom(65565))

# disabled promiscuous mode
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

В следующем примере показано, как использовать интерфейс сокетов для взаимодействия с сетью CAN с помощью протокола raw-сокетов. Чтобы вместо этого использовать CAN с протоколом диспетчера широковещательной рассылки, откройте сокет следующим образом:

socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)

После привязки (CAN_RAW) или подключения (CAN_BCM) сокета можно, как обычно, использовать для объекта socket операции socket.send() и socket.recv() (и соответствующие им операции).

Для последнего примера могут потребоваться специальные привилегии:

import socket
import struct


# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)

can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)

def build_can_frame(can_id, data):
    can_dlc = len(data)
    data = data.ljust(8, b'\x00')
    return struct.pack(can_frame_fmt, can_id, can_dlc, data)

def dissect_can_frame(frame):
    can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
    return (can_id, can_dlc, data[:can_dlc])


# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))

while True:
    cf, addr = s.recvfrom(can_frame_size)

    print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))

    try:
        s.send(cf)
    except OSError:
        print('Error sending CAN frame')

    try:
        s.send(build_can_frame(0x01, b'\x01\x02\x03'))
    except OSError:
        print('Error sending CAN frame')

Повторный запуск примера с недостаточной задержкой между запусками может привести к этой ошибке:

OSError: [Errno 98] Address already in use

Это происходит потому, что после предыдущего запуска сокет остался в состоянии TIME_WAIT и его нельзя использовать повторно немедленно.

Чтобы предотвратить это, необходимо установить флаг socket: socket.SO_REUSEADDR:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))

флаг SO_REUSEADDR сообщает ядру, что нужно повторно использовать локальный сокет в состоянии TIME_WAIT, не дожидаясь истечения естественного тайм-аута.

См. также

Введение в программирование сокетов (на C) см. в следующих статьях:

  • Вводное руководство по межпроцессному взаимодействию в 4.3BSD, Стюарт Секрест
  • Расширенное руководство по межпроцессному взаимодействию в 4.3BSD, Сэмюэл Дж. Леффлер и др.,

обе статьи опубликованы в UNIX Programmer’s Manual, Supplementary Documents 1 (разделы PS1:7 и PS1:8). Справочные материалы, относящиеся к конкретным платформам и посвящённые различным системным вызовам, связанным с сокетами, также служат ценным источником информации о семантике сокетов. Для Unix см. страницы руководства; для Windows — спецификацию WinSock (или Winsock 2). Тем, кто работает с API, поддерживающими IPv6, может быть полезен документ RFC 3493 под названием «Расширения базового интерфейса сокетов для IPv6».

© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/socket.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API