Spec-Zone.ru › Python 3.9

socket — Интерфейс низкого уровня для сетевых соединений

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

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

Примечание

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

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

См. также

Module socketserver

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

Module ssl

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

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

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

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

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

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

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

  • Пара (host, port) используется для семейства адресов AF_INET, где 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.

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

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

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

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

    • BTPROTO_L2CAP принимает (bdaddr, psm), где bdaddr — Bluetooth-адрес в виде строки, а psm — целое число.
    • BTPROTO_RFCOMM принимает (bdaddr, channel), где bdaddr — Bluetooth-адрес в виде строки, а channel — целое число.
    • BTPROTO_HCI принимает (device_id,), где device_id — либо целое число, либо строка с Bluetooth-адресом интерфейса. (Это зависит от вашей ОС; NetBSD и DragonFlyBSD ожидают Bluetooth-адрес, а все остальное — целое число.)

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

    • BTPROTO_SCO принимает bdaddr, где bdaddr — объект bytes, содержащий Bluetooth-адрес в строковом формате. (например, b'12:23:34:45:56:67') Этот протокол не поддерживается в 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 >= 4.8 QEMU >= 2.8 ESX >= 4.0 ESX Workstation >= 6.5.

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

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

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

      • PACKET_HOST (по умолчанию) — пакет, адресованный локальному хосту.
      • PACKET_BROADCAST — пакет физического уровня широковещательного типа.
      • PACKET_MULTIHOST — пакет, отправленный в адрес физического уровня multicast.
      • PACKET_OTHERHOST — пакет, отправленный другому хосту, перехваченный драйвером устройства в режиме promiscuous.
      • 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-RELEASE

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

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

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

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

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

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

Исключения

exception socket.error

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

Изменено в версии 3.3: Следуя PEP 3151, этот класс был переименован в псевдоним для OSError.

exception socket.herror

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

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

exception socket.gaierror

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

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

exception socket.timeout

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

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

Постоянные значения

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

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

socket.AF_UNIX
socket.AF_INET
socket.AF_INET6

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

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_*

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

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

Изменено в версии 3.6.5: В Windows, TCP_FASTOPEN, TCP_KEEPCNT появляются, если Windows поддерживает их во время выполнения.

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

В Windows, TCP_KEEPIDLE, TCP_KEEPINTVL появляются, если Windows поддерживает их во время выполнения.

socket.AF_CAN
socket.PF_CAN
SOL_CAN_*
CAN_*

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

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

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

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_PACKET
socket.PF_PACKET
PACKET_*

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

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

socket.AF_RDS
socket.PF_RDS
socket.SOL_RDS
RDS_*

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

Доступность: 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 на данной платформе.

END_OF_DOCUMENT_MARKER
socket.BDADDR_ANY
socket.BDADDR_LOCAL

These are string constants containing Bluetooth addresses with special meanings. For example, BDADDR_ANY can be used to indicate any address when specifying the binding socket with BTPROTO_RFCOMM.

socket.HCI_FILTER
socket.HCI_TIME_STAMP
socket.HCI_DATA_DIR

For use with BTPROTO_HCI. HCI_FILTER is not available for NetBSD or DragonFlyBSD. HCI_TIME_STAMP and HCI_DATA_DIR are not available for FreeBSD, NetBSD, or DragonFlyBSD.

socket.AF_QIPCRTR

Constant for Qualcomm’s IPC router protocol, used to communicate with service providing remote processors.

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

Функции

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

Следующие функции создают объекты сокета.

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: Когда битовые флаги SOCK_NONBLOCK или SOCK_CLOEXEC применяются к type, они очищаются, и 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.

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

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

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

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

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

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

socket.create_connection(address[, timeout[, source_address]])

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

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

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

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

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

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

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

Если dualstack_ipv6 равно True и платформа поддерживает это, сокет сможет принимать подключения как 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 устанавливается для того, чтобы немедленно повторно использовать предыдущие сокеты, которые были привязаны к тому же address и оставались в состоянии 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.SocketType

Это объект типа Python, представляющий тип объекта сокета. Он совпадает с type(socket(...)).

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

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

socket.close(fd)

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

Новое в версии 3.7.

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

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

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

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

(family, type, proto, canonname, sockaddr)

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

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

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

>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP)
[(<AddressFamily.AF_INET6: 10>, <SocketType.SOCK_STREAM: 1>,
 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),
 (<AddressFamily.AF_INET: 2>, <SocketType.SOCK_STREAM: 1>,
 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, и getaddrinfo() следует использовать вместо этого для поддержки стеков IPv4/v6.

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

socket.gethostbyname_ex(hostname)

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

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

socket.gethostname()

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

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

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

socket.gethostbyaddr(ip_address)

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

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

socket.getnameinfo(sockaddr, flags)

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

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

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

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

socket.getprotobyname(protocolname)

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

socket.getservbyname(servicename[, protocolname])

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

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

socket.getservbyport(port[, protocolname])

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

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

socket.ntohl(x)

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

socket.ntohs(x)

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

Устарело начиная с версии 3.7: В случае, если x не помещается в 16-битное беззнаковое целое число, но помещается в положительное целое число C, оно молчаливо усекается до 16-битного беззнакового целого числа. Эта функция молчаливого усечения устарела и в будущих версиях Python будет вызывать исключение.

socket.htonl(x)

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

socket.htons(x)

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

Устарело начиная с версии 3.7: В случае, если x не помещается в 16-битное беззнаковое целое число, но помещается в положительное целое число C, оно молчаливо усекается до 16-битного беззнакового целого числа. Эта функция молчаливого усечения устарела и в будущих версиях Python будет вызывать исключение.

socket.inet_aton(ip_string)

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

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

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

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

socket.inet_ntoa(packed_ip)

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

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

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

socket.inet_pton(address_family, ip_string)

Преобразование IP-адреса из его семейно-специфичного строкового формата в упакованный двоичный формат. inet_pton() полезно, когда библиотека или сетевой протокол требуют объект типа struct in_addr (аналогично inet_aton()) или struct 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-like object некоторой длины в байтах) в его стандартное, семейно-специфичное строковое представление (например, '7.10.0.5' или '5aef:2b::8'). inet_ntop() полезно, когда библиотека или сетевой протокол возвращает объект типа struct in_addr (аналогично inet_ntoa()) или struct in6_addr.

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

Доступность: Unix (возможно, не на всех платформах), Windows.

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

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

socket.CMSG_LEN(length)

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

Доступность: большинство платформ Unix, возможно, и другие.

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

socket.CMSG_SPACE(length)

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

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

Доступность: большинство платформ Unix, возможно, и другие.

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

socket.getdefaulttimeout()

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

socket.setdefaulttimeout(timeout)

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

socket.sethostname(name)

Установите имя узла машины на name. Это вызовет OSError, если у вас недостаточно прав.

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

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

Введено в версии 3.3.

socket.if_nameindex()

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

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

Введено в версии 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.

Введено в версии 3.3.

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

См. также

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

socket.if_indextoname(if_index)

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

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

Введено в версии 3.3.

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

См. также

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

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

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

Доступность: Unix, поддерживающий sendmsg() и механизм SCM_RIGHTS.

Введено в версии 3.9.

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

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

Доступность: Unix, поддерживающий recvmsg() и механизм SCM_RIGHTS.

Введено в версии 3.9.

Примечание

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

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

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

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

socket.accept()

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

Новый созданный сокет является непередаваемым.

Изменено в версии 3.4: Сокет теперь непередаваемый.

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

socket.bind(address)

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

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

socket.close()

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

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

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

Примечание

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

socket.connect(address)

Подключиться к удаленному сокету по адресу address. (Формат адреса зависит от семейства адресов — см. выше.)

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

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

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

socket.connect_ex(address)

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

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

socket.detach()

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

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

socket.dup()

Дублировать сокет.

Новый созданный сокет является непередаваемым.

Изменено в версии 3.4: Сокет теперь непередаваемый.

socket.fileno()

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

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

socket.get_inheritable()

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

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

socket.getpeername()

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

socket.getsockname()

Возвращает собственный адрес сокета. Это полезно, например, для определения номера порта IPv4/v6 сокета. (Формат возвращаемого адреса зависит от семейства адресов — см. выше.)

socket.getsockopt(level, optname[, buflen])

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

socket.getblocking()

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

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

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

socket.gettimeout()

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

socket.ioctl(control, option)
Платформа

Windows

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

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

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

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

socket.listen([backlog])

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

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

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

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

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

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

Примечание

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

socket.recv(bufsize[, flags])

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

Примечание

Для наилучшего соответствия аппаратным и сетевым реалиям, значение bufsize должно быть относительно малой степенью двойки, например, 4096.

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

socket.recvfrom(bufsize[, flags])

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

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

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

socket.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, возможно, другие.

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

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

socket.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, возможно, и другие.

Новая в версии 3.3.

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

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

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

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

socket.send(bytes[, flags])

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

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

socket.sendall(bytes[, flags])

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

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

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

socket.sendto(bytes, address)
socket.sendto(bytes, flags, address)

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

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

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

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

Отправка обычных и дополнительных данных в сокет, собирая не-дополнительные данные из ряда буферов и объединяя их в единое сообщение. Аргумент buffers задаёт не-дополнительные данные как итерируемый набор объектов-подобных байтам (например, объекты bytes); операционная система может установить ограничение (sysconf() значение SC_IOV_MAX) на количество используемых буферов. Аргумент ancdata задаёт дополнительные данные (сообщения управления) как итерируемый набор из нуля или более кортежей (cmsg_level, cmsg_type, cmsg_data), где cmsg_level и cmsg_type — целые числа, соответственно определяющие уровень протокола и тип, специфичный для протокола, а cmsg_data — объект типа bytes-like, содержащий связанные данные. Обратите внимание, что некоторые системы (в частности, системы без 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, возможно, и другие.

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

Новая в версии 3.3.

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

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

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

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

Новая в версии 3.6.

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

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

Новое в версии 3.5.

socket.set_inheritable(inheritable)

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

Новое в версии 3.4.

socket.setblocking(flag)

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

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

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

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

socket.settimeout(value)

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

Дополнительную информацию можно найти в примечаниях о таймаутах сокета.

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

socket.setsockopt(level, optname, value: int)
socket.setsockopt(level, optname, value: buffer)
socket.setsockopt(level, optname, None, optlen: int)

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

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

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

socket.shutdown(how)

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

socket.share(process_id)

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

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

Новое в версии 3.3.

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

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

socket.family

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

socket.type

Тип сокета.

socket.proto

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

Заметки о таймаутах сокетов

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

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

Примечание

На уровне операционной системы сокеты в режиме с таймаутом внутренне устанавливаются в неблокирующий режим. Кроме того, режимы блокирования и таймаута совместно используются между дескрипторами файлов и объектами сокетов, которые ссылаются на один и тот же сетевой конечный пункт. Эта деталь реализации может иметь видимые последствия, если, например, вы решите использовать 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))

Следующий пример показывает, как написать очень простой сетевой сниффер с сырыми сокетами в 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 packages
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

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

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

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

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

После привязки (CAN_RAW) или подключения (CAN_BCM) сокета, вы можете использовать операции 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, дополнительные документы 1 (разделы PS1:7 и PS1:8). Платформенно-специфическая справочная информация по различным системным вызовам, связанным с сокетами, также является ценным источником информации о деталях семантики сокетов. Для Unix см. страницы руководств; для Windows см. спецификацию WinSock (или Winsock 2). Для API с поддержкой IPv6 читатели могут обратиться к RFC 3493 с названием Basic Socket Interface Extensions for IPv6.

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

Spec-Zone.ru

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