socket.md · Markdown – Документация Python
Документация Python неофициальный перевод

socket.md

1650 строк · 153.6 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.15/library/socket.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `socket` – низкоуровневый сетевой интерфейс89**Исходный код:** [Lib/socket.py](https://python-all.ru/src/3.15/Lib/socket.py)1011---1213Этот модуль предоставляет доступ к интерфейсу *сокетов* BSD. Он доступен во всех современных системах Unix, Windows, MacOS и, возможно, на других платформах.1415> **Примечание**16>17> Некоторые аспекты поведения могут зависеть от платформы, поскольку вызовы выполняются через API сокетов операционной системы.1819[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.2021Этот модуль не работает или недоступен на WebAssembly. Подробнее см. [платформы WebAssembly](https://python-all.ru/3.15/library/intro.html#wasm-availability).2223Интерфейс Python представляет собой прямую трансляцию системных вызовов Unix и библиотечного интерфейса сокетов в объектно-ориентированный стиль Python: функция [`socket()`](https://python-all.ru/3.15/library/socket.html#socket.socket) возвращает *объект сокета*, методы которого реализуют различные системные вызовы сокетов. Типы параметров несколько более высокоуровневые, чем в интерфейсе C: как и при операциях `read()` и `write()` с файлами Python, выделение буфера при операциях приёма происходит автоматически, а длина буфера неявно задаётся при отправке.2425> **См. также**26>27> **Модуль [`socketserver`](https://python-all.ru/3.15/library/socketserver.html#module-socketserver)**28>29> Классы, упрощающие написание сетевых серверов.30>31> **Модуль [`ssl`](https://python-all.ru/3.15/library/ssl.html#module-ssl)**32>33> Обёртка TLS/SSL для объектов сокетов.3435## Семейства сокетов3637В зависимости от системы и параметров сборки этим модулем поддерживаются различные семейства сокетов.3839Формат адреса, требуемый для конкретного объекта сокета, автоматически выбирается на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представляются следующим образом:4041- Адрес сокета [`AF_UNIX`](https://python-all.ru/3.15/library/socket.html#socket.AF_UNIX), привязанного к узлу файловой системы, представляется в виде строки с использованием кодировки файловой системы и обработчика ошибок `'surrogateescape'` (см. [**PEP 383**](https://python-all.ru/3.15/library/socket.html)). Адрес в абстрактном пространстве имён Linux возвращается как [байтоподобный объект](https://python-all.ru/3.15/glossary.html#term-bytes-like-object) с начальным нулевым байтом; обратите внимание, что сокеты в этом пространстве имён могут взаимодействовать с обычными файловыми сокетами, поэтому программы, предназначенные для работы в Linux, возможно, должны работать с обоими типами адресов. Строка или байтоподобный объект могут использоваться для любого из этих типов адресов при передаче в качестве аргумента.4243  Изменено в версии 3.3: Ранее предполагалось, что пути сокетов [`AF_UNIX`](https://python-all.ru/3.15/library/socket.html#socket.AF_UNIX) используют кодировку UTF-8.4445  Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.15/glossary.html#term-bytes-like-object).4647- Пара `(host, port)` используется для семейства адресов [`AF_INET`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET), где *host* – строка, представляющая либо имя хоста в доменной нотации Интернета, например `'daring.cwi.nl'`, либо IPv4-адрес, например `'100.50.200.5'`, а *port* – целое число.4849  - Для IPv4-адресов вместо адреса хоста принимаются две специальные формы: `''` представляет `INADDR_ANY`, что используется для привязки ко всем интерфейсам, а строка `'<broadcast>'` представляет `INADDR_BROADCAST`. Такое поведение несовместимо с IPv6, поэтому, возможно, следует избегать их, если предполагается поддержка IPv6 в программах на Python.50- Для семейства адресов [`AF_INET6`](https://python-all.ru/3.15/library/socket.html#socket.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, имеющими область действия (scoped).5152  Изменено в версии 3.7: Для многоадресных адресов (когда *scope\_id* имеет значение) *address* может не содержать часть `%scope_id` (или `zone id`). Эта информация является избыточной и может быть безопасно опущена (рекомендуется).53- Сокеты `AF_NETLINK` представляются в виде пар `(pid, groups)`.54- Поддержка TIPC только в Linux доступна через семейство адресов `AF_TIPC`. TIPC – это открытый сетевой протокол, не основанный на IP, предназначенный для использования в кластерных средах. Адреса представляются кортежем, и поля зависят от типа адреса. Общий вид кортежа: `(addr_type, v1, v2, v3 [, scope])`, где:5556  - *addr\_type* – одно из значений `TIPC_ADDR_NAMESEQ`, `TIPC_ADDR_NAME` или `TIPC_ADDR_ID`.57  - *scope* – одно из значений `TIPC_ZONE_SCOPE`, `TIPC_CLUSTER_SCOPE` и `TIPC_NODE_SCOPE`.58  - Если *addr\_type* равно `TIPC_ADDR_NAME`, то *v1* – тип сервера, *v2* – идентификатор порта, а *v3* должно быть 0.5960    Если *addr\_type* равно `TIPC_ADDR_NAMESEQ`, то *v1* – тип сервера, *v2* – нижний номер порта, а *v3* – верхний номер порта.6162    Если *addr\_type* равно `TIPC_ADDR_ID`, то *v1* – узел, *v2* – ссылка, а *v3* должно быть установлено в 0.63- Кортеж `(interface, )` используется для семейства адресов [`AF_CAN`](https://python-all.ru/3.15/library/socket.html#socket.AF_CAN), где *interface* – строка, представляющая имя сетевого интерфейса, например `'can0'`. Имя сетевого интерфейса `''` может использоваться для приёма пакетов от всех сетевых интерфейсов данного семейства.6465  - Протокол [`CAN_ISOTP`](https://python-all.ru/3.15/library/socket.html#socket.CAN_ISOTP) требует кортеж `(interface, rx_addr, tx_addr)`, где оба дополнительных параметра являются целыми числами без знака (unsigned long), представляющими идентификатор CAN (стандартный или расширенный).66  - Протокол [`CAN_J1939`](https://python-all.ru/3.15/library/socket.html#socket.CAN_J1939) требует кортеж `(interface, name, pgn, addr)`, где дополнительные параметры – 64-битное целое без знака, представляющее имя ECU, 32-битное целое без знака, представляющее номер группы параметров (PGN), и 8-битное целое, представляющее адрес.67- Строка или кортеж `(id, unit)` используется для протокола `SYSPROTO_CONTROL` семейства `PF_SYSTEM`. Строка – это имя элемента управления ядра с динамически назначаемым ID. Кортеж может использоваться, если известны ID и номер устройства элемента управления ядра или если используется зарегистрированный ID.6869  Добавлено в версии 3.3.70- [`AF_BLUETOOTH`](https://python-all.ru/3.15/library/socket.html#socket.AF_BLUETOOTH) поддерживает следующие протоколы и форматы адресов:7172  - [`BTPROTO_L2CAP`](https://python-all.ru/3.15/library/socket.html#socket.BTPROTO_L2CAP) принимает кортеж `(bdaddr, psm[, cid[, bdaddr_type]])`, где:7374    - `bdaddr` – строка, задающая адрес Bluetooth.75    - `psm` – целое число, задающее мультиплексор протокола/службы.76    - `cid` – необязательное целое число, задающее идентификатор канала. Если не указано, по умолчанию равно нулю.77    - `bdaddr_type` – необязательное целое число, задающее тип адреса; один из [`BDADDR_BREDR`](https://python-all.ru/3.15/library/socket.html#socket.BDADDR_BREDR) (по умолчанию), [`BDADDR_LE_PUBLIC`](https://python-all.ru/3.15/library/socket.html#socket.BDADDR_LE_PUBLIC), [`BDADDR_LE_RANDOM`](https://python-all.ru/3.15/library/socket.html#socket.BDADDR_LE_RANDOM).7879    Изменено в версии 3.14: Добавлены поля `cid` и `bdaddr_type`.80  - [`BTPROTO_RFCOMM`](https://python-all.ru/3.15/library/socket.html#socket.BTPROTO_RFCOMM) принимает `(bdaddr, channel)`, где `bdaddr` – это Bluetooth-адрес в виде строки, а `channel` – целое число.81  - [`BTPROTO_HCI`](https://python-all.ru/3.15/library/socket.html#socket.BTPROTO_HCI) принимает формат, зависящий от вашей ОС.8283    - В Linux он принимает целое число `device_id` или кортеж `(device_id, [channel])`, где `device_id` задаёт номер Bluetooth-устройства, а `channel` – необязательное целое число, указывающее HCI-канал (по умолчанию [`HCI_CHANNEL_RAW`](https://python-all.ru/3.15/library/socket.html#socket.HCI_CHANNEL_RAW)).84    - На FreeBSD, NetBSD и DragonFly BSD он принимает `bdaddr`, где `bdaddr` – это Bluetooth-адрес в виде строки.8586    Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.8788    Изменено в версии 3.13.3: Добавлена поддержка FreeBSD.8990    Изменено в версии 3.14: Добавлено поле `channel`. Теперь также принимается `device_id`, не упакованный в кортеж.91  - [`BTPROTO_SCO`](https://python-all.ru/3.15/library/socket.html#socket.BTPROTO_SCO) принимает `bdaddr`, где `bdaddr` – Bluetooth-адрес в виде строки или объект [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes). (напр. `'12:23:34:45:56:67'` или `b'12:23:34:45:56:67'`)9293    Изменено в версии 3.14: Добавлена поддержка FreeBSD.94- [`AF_ALG`](https://python-all.ru/3.15/library/socket.html#socket.AF_ALG) – это интерфейс на основе сокетов, доступный только в Linux, для работы с криптографией ядра. Сокет алгоритма настраивается кортежем из двух-четырёх элементов `(type, name [, feat [, mask]])`, где:9596  - *type* – тип алгоритма в виде строки, напр. `aead`, `hash`, `skcipher` или `rng`.97  - *name* – имя алгоритма и режим работы в виде строки, напр. `sha256`, `hmac(sha256)`, `cbc(aes)` или `drbg_nopr_ctr_aes256`.98  - *feat* и *mask* – это 32-битные целые числа без знака.99100  [Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.6.38.101102  Некоторые типы алгоритмов требуют более новых версий ядра.103104  Добавлено в версии 3.6.105- [`AF_VSOCK`](https://python-all.ru/3.15/library/socket.html#socket.AF_VSOCK) обеспечивает взаимодействие между виртуальными машинами и их хостами. Сокеты представлены кортежем `(CID, port)`, где идентификатор контекста (CID) и порт – целые числа.106107  [Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 3.9108109  См. *[vsock(7)](https://python-all.ru/3.15/library/socket.html)*110111  Добавлено в версии 3.7.112- [`AF_PACKET`](https://python-all.ru/3.15/library/socket.html#socket.AF_PACKET) – низкоуровневый интерфейс для прямого доступа к сетевым устройствам. Адреса представляются кортежем `(ifname, proto[, pkttype[, hatype[, addr]]])`, где:113114  - *ifname* – строка, задающая имя устройства.115  - *proto* – номер протокола Ethernet. Может быть [`ETH_P_ALL`](https://python-all.ru/3.15/library/socket.html#socket.ETH_P_ALL) для захвата всех протоколов, одной из констант [ETHERTYPE\_\*](https://python-all.ru/3.15/library/socket.html#socket-ethernet-types) или любым другим номером протокола Ethernet.116  - *pkttype* – необязательное целое число, задающее тип пакета:117118    - `PACKET_HOST` (по умолчанию) – пакет, адресованный локальному хосту.119    - `PACKET_BROADCAST` – широковещательный пакет физического уровня.120    - `PACKET_MULTICAST` – пакет, отправленный на многоадресный адрес физического уровня.121    - `PACKET_OTHERHOST` – пакет, предназначенный другому хосту, но перехваченный драйвером устройства в неразборчивом режиме (promiscuous).122    - `PACKET_OUTGOING` – пакет, отправленный с локального хоста и возвращённый обратно на пакетный сокет.123  - *hatype* – необязательное целое число, задающее тип аппаратного адреса ARP.124  - *addr* – необязательный байтоподобный объект, задающий аппаратный физический адрес; его интерпретация зависит от устройства.125126  [Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.2.127- [`AF_QIPCRTR`](https://python-all.ru/3.15/library/socket.html#socket.AF_QIPCRTR) – это интерфейс на основе сокетов, доступный только в Linux, для связи с сервисами, работающими на сопроцессорах в платформах Qualcomm. Семейство адресов представляется в виде кортежа `(node, port)`, где *узел* и *порт* являются неотрицательными целыми числами.128129  [Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 4.7.130131  Добавлено в версии 3.8.132- `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)`.133134  Такой сокет следует создавать с помощью `socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)` для IPv4 или `socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)` для IPv6.135136  [Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.6.20, FreeBSD \>= 10.1137138  Добавлено в версии 3.9.139- [`AF_HYPERV`](https://python-all.ru/3.15/library/socket.html#socket.AF_HYPERV) – это интерфейс на основе сокетов, доступный только в Windows, для связи с узлами и гостями Hyper-V. Семейство адресов представляется в виде кортежа `(vm_id, service_id)`, где `vm_id` и `service_id` являются строками UUID.140141  `vm_id` – это идентификатор виртуальной машины или набор известных значений VMID, если цель не является конкретной виртуальной машиной. Известные константы VMID, определённые в `socket`:142143  - `HV_GUID_ZERO`144  - `HV_GUID_BROADCAST`145  - `HV_GUID_WILDCARD` – используется для привязки к себе и приёма подключений от всех разделов.146  - `HV_GUID_CHILDREN` – используется для привязки к себе и приёма подключений от дочерних разделов.147  - `HV_GUID_LOOPBACK` – используется как цель для себя.148  - `HV_GUID_PARENT` – при использовании в качестве привязки принимает подключения от родительского раздела. При использовании в качестве адреса назначения подключается к родительскому разделу.149150  `service_id` – это идентификатор службы зарегистрированной службы.151152  Добавлено в версии 3.12.153154Если в части *узел* адреса сокета IPv4/v6 указано имя узла, программа может демонстрировать недетерминированное поведение, так как Python использует первый адрес, возвращённый при разрешении DNS. Адрес сокета будет разрешаться по-разному в фактический IPv4/v6-адрес в зависимости от результатов разрешения DNS и/или конфигурации узла. Для детерминированного поведения используйте числовой адрес в части *узел*.155156Все ошибки порождают исключения. Могут возникать обычные исключения для недопустимых типов аргументов и состояний нехватки памяти. Ошибки, связанные с семантикой сокетов или адресов, порождают [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError) или одно из его подклассов.157158Неблокирующий режим поддерживается через [`setblocking()`](https://python-all.ru/3.15/library/socket.html#socket.socket.setblocking). Его обобщение на основе тайм-аутов поддерживается через [`settimeout()`](https://python-all.ru/3.15/library/socket.html#socket.socket.settimeout).159160## Содержимое модуля161162Модуль `socket` экспортирует следующие элементы.163164### Исключения165166#### `exception socket.error`167168Устаревший псевдоним [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).169170Изменено в версии 3.3: В соответствии с [**PEP 3151**](https://python-all.ru/3.15/library/socket.html) этот класс стал псевдонимом [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).171172#### `exception socket.herror`173174Подкласс [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError), это исключение возникает при ошибках, связанных с адресами, т.е. для функций, использующих *h\_errno* в POSIX C API, включая [`gethostbyname_ex()`](https://python-all.ru/3.15/library/socket.html#socket.gethostbyname_ex) и [`gethostbyaddr()`](https://python-all.ru/3.15/library/socket.html#socket.gethostbyaddr). Сопутствующее значение – пара `(h_errno, string)`, представляющая ошибку, возвращённую библиотечным вызовом. *h\_errno* – числовое значение, а *строка* представляет описание *h\_errno*, возвращаемое функцией языка C `hstrerror()`.175176Изменено в версии 3.3: Этот класс стал подклассом [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).177178#### `exception socket.gaierror`179180Подкласс [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError), это исключение возникает при ошибках, связанных с адресами, функциями [`getaddrinfo()`](https://python-all.ru/3.15/library/socket.html#socket.getaddrinfo) и [`getnameinfo()`](https://python-all.ru/3.15/library/socket.html#socket.getnameinfo). Сопутствующее значение – пара `(error, string)`, представляющая ошибку, возвращённую библиотечным вызовом. *строка* представляет описание *error*, возвращаемое функцией языка C `gai_strerror()`. Числовое значение *error* будет соответствовать одной из констант `EAI_*`, определённых в этом модуле.181182Изменено в версии 3.3: Этот класс стал подклассом [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).183184#### `exception socket.timeout`185186Устаревший псевдоним [`TimeoutError`](https://python-all.ru/3.15/library/exceptions.html#TimeoutError).187188Подкласс [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError), это исключение возникает при возникновении тайм-аута на сокете, для которого тайм-ауты были включены с помощью предыдущего вызова [`settimeout()`](https://python-all.ru/3.15/library/socket.html#socket.socket.settimeout) (или неявно через [`setdefaulttimeout()`](https://python-all.ru/3.15/library/socket.html#socket.setdefaulttimeout)). Сопутствующее значение – строка, которая в настоящее время всегда равна «timed out».189190Изменено в версии 3.3: Этот класс стал подклассом [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).191192Изменено в версии 3.10: Этот класс стал псевдонимом [`TimeoutError`](https://python-all.ru/3.15/library/exceptions.html#TimeoutError).193194### Константы195196Константы AF\_\* и SOCK\_\* теперь являются `AddressFamily` и `SocketKind` [`IntEnum`](https://python-all.ru/3.15/library/enum.html#enum.IntEnum) коллекциями.197198Добавлено в версии 3.4.199200#### `socket.AF_UNIX`201202#### `socket.AF_INET`203204#### `socket.AF_INET6`205206Эти константы представляют семейства адресов (и протоколов), используемые для первого аргумента [`socket()`](https://python-all.ru/3.15/library/socket.html#socket.socket). Если константа [`AF_UNIX`](https://python-all.ru/3.15/library/socket.html#socket.AF_UNIX) не определена, то данный протокол не поддерживается. В зависимости от системы могут быть доступны дополнительные константы.207208#### `socket.AF_UNSPEC`209210[`AF_UNSPEC`](https://python-all.ru/3.15/library/socket.html#socket.AF_UNSPEC) означает, что [`getaddrinfo()`](https://python-all.ru/3.15/library/socket.html#socket.getaddrinfo) должен возвращать сокетные адреса для любого семейства адресов (либо IPv4, IPv6, или любого другого), которое можно использовать.211212#### `socket.SOCK_STREAM`213214#### `socket.SOCK_DGRAM`215216#### `socket.SOCK_RAW`217218#### `socket.SOCK_RDM`219220#### `socket.SOCK_SEQPACKET`221222Эти константы представляют типы сокетов, которые используются для второго аргумента [`socket()`](https://python-all.ru/3.15/library/socket.html#socket.socket). В зависимости от системы могут быть доступны и другие константы. (Обычно полезны только [`SOCK_STREAM`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_STREAM) и [`SOCK_DGRAM`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_DGRAM).)223224#### `socket.SOCK_CLOEXEC`225226#### `socket.SOCK_NONBLOCK`227228Эти две константы, если они определены, можно комбинировать с типами сокетов, что позволяет устанавливать некоторые флаги атомарно (тем самым избегая возможных состояний гонки и необходимости отдельных вызовов).229230> **См. также**231>232> [Безопасная обработка файловых дескрипторов](https://python-all.ru/3.15/library/socket.html) для более подробного объяснения.233234[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.6.27.235236Добавлено в версии 3.2.237238#### `SO_*`239240#### `socket.SOMAXCONN`241242#### `MSG_*`243244#### `SOL_*`245246#### `SCM_*`247248#### `IPPROTO_*`249250#### `IPPORT_*`251252#### `INADDR_*`253254#### `IP_*`255256#### `IPV6_*`257258#### `EAI_*`259260#### `AI_*`261262#### `NI_*`263264#### `TCP_*`265266Многие константы этих форм, описанные в документации Unix по сокетам и/или протоколу IP, также определены в модуле socket. Они обычно используются в аргументах методов [`setsockopt()`](https://python-all.ru/3.15/library/socket.html#socket.socket.setsockopt) и [`getsockopt()`](https://python-all.ru/3.15/library/socket.html#socket.socket.getsockopt) объектов сокетов. В большинстве случаев определены только те символы, которые есть в заголовочных файлах Unix; для некоторых символов предоставлены значения по умолчанию.267268Изменено в версии 3.6: добавлены `SO_DOMAIN`, `SO_PROTOCOL`, `SO_PEERSEC`, `SO_PASSSEC`, `TCP_USER_TIMEOUT`, `TCP_CONGESTION`.269270Изменено в версии 3.6.5: Добавлена поддержка `TCP_FASTOPEN`, `TCP_KEEPCNT` на платформах Windows при наличии.271272Изменено в версии 3.7: добавлен `TCP_NOTSENT_LOWAT`.273274Добавлена поддержка `TCP_KEEPIDLE`, `TCP_KEEPINTVL` на платформах Windows при наличии.275276Изменено в версии 3.10: Добавлен `IP_RECVTOS`. Добавлен `TCP_KEEPALIVE`. На MacOS эта константа может использоваться так же, как `TCP_KEEPIDLE` используется на Linux.277278Изменено в версии 3.11: Добавлен `TCP_CONNECTION_INFO`. На MacOS эта константа может использоваться так же, как `TCP_INFO` используется на Linux и BSD.279280Изменено в версии 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`.281282Изменено в версии 3.13: Добавлен `SO_BINDTOIFINDEX`. На Linux эта константа может использоваться так же, как `SO_BINDTODEVICE`, но с индексом сетевого интерфейса вместо его имени.283284Изменено в версии 3.14: Добавлены отсутствовавшие `IP_FREEBIND`, `IP_RECVERR`, `IPV6_RECVERR`, `IP_RECVTTL` и `IP_RECVORIGDSTADDR` на Linux.285286Изменено в версии 3.14: Добавлена поддержка `TCP_QUICKACK` на платформах Windows при наличии.287288Изменено в версии 3.15: `IPV6_HDRINCL` было добавлено. Добавлена поддержка `SO_PASSRIGHTS` на платформах Linux при наличии.289290#### `socket.AF_CAN`291292#### `socket.PF_CAN`293294#### `SOL_CAN_*`295296#### `CAN_*`297298Множество констант такого вида, описанных в документации Linux, также определены в модуле socket.299300[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.6.25, NetBSD \>= 8.301302Добавлено в версии 3.3.303304Изменено в версии 3.11: Добавлена поддержка NetBSD.305306Изменено в версии 3.14: Восстановлены отсутствовавшие `CAN_RAW_ERR_FILTER` на Linux.307308#### `socket.CAN_BCM`309310#### `CAN_BCM_*`311312CAN\_BCM в семействе протоколов CAN – это протокол broadcast manager (BCM). Константы broadcast manager, описанные в документации Linux, также определены в модуле socket.313314[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.6.25.315316> **Примечание**317>318> Флаг `CAN_BCM_CAN_FD_FRAME` доступен только на Linux \>= 4.8.319320Добавлено в версии 3.4.321322#### `socket.CAN_RAW_FD_FRAMES`323324Включает поддержку CAN FD в сокете CAN\_RAW. По умолчанию отключено. Позволяет приложению отправлять как обычные CAN-кадры, так и CAN FD-кадры; однако при чтении из сокета необходимо принимать оба типа кадров.325326Эта константа описана в документации Linux.327328[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 3.6.329330Добавлено в версии 3.5.331332#### `socket.CAN_RAW_JOIN_FILTERS`333334Объединяет установленные CAN-фильтры так, что в пространство пользователя передаются только CAN-кадры, удовлетворяющие всем заданным фильтрам.335336Эта константа описана в документации Linux.337338[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 4.1.339340Добавлено в версии 3.9.341342#### `socket.CAN_ISOTP`343344CAN\_ISOTP в семействе протоколов CAN – это протокол ISO-TP (ISO 15765-2). Константы ISO-TP описаны в документации Linux.345346[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.6.25.347348Добавлено в версии 3.7.349350#### `socket.CAN_J1939`351352CAN\_J1939 в семействе протоколов CAN – это протокол SAE J1939. Константы J1939 описаны в документации Linux.353354[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 5.4.355356Добавлено в версии 3.9.357358#### `socket.AF_DIVERT`359360#### `socket.PF_DIVERT`361362Эти две константы, описанные на странице руководства FreeBSD divert(4), также определены в модуле socket.363364[Доступность](https://python-all.ru/3.15/library/intro.html#availability): FreeBSD \>= 14.0.365366Добавлено в версии 3.12.367368#### `socket.AF_PACKET`369370#### `socket.PF_PACKET`371372#### `PACKET_*`373374Множество констант такого вида, описанных в документации Linux, также определены в модуле socket.375376[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.2.377378#### `socket.ETH_P_ALL`379380`ETH_P_ALL` можно использовать в конструкторе [`socket`](https://python-all.ru/3.15/library/socket.html#socket.socket) в качестве аргумента *proto* для семейства [`AF_PACKET`](https://python-all.ru/3.15/library/socket.html#socket.AF_PACKET), чтобы захватывать все пакеты, независимо от протокола.381382Дополнительную информацию см. на странице руководства *[packet(7)](https://python-all.ru/3.15/library/socket.html)*.383384[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux.385386Добавлено в версии 3.12.387388#### `socket.AF_RDS`389390#### `socket.PF_RDS`391392#### `socket.SOL_RDS`393394#### `RDS_*`395396Множество констант такого вида, описанных в документации Linux, также определены в модуле socket.397398[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.6.30.399400Добавлено в версии 3.3.401402#### `socket.SIO_RCVALL`403404#### `socket.SIO_KEEPALIVE_VALS`405406#### `socket.SIO_LOOPBACK_FAST_PATH`407408#### `RCVALL_*`409410Константы для Windows’ WSAIoctl(). Эти константы используются в качестве аргументов метода [`ioctl()`](https://python-all.ru/3.15/library/socket.html#socket.socket.ioctl) объектов сокетов.411412Изменено в версии 3.6: добавлен `SIO_LOOPBACK_FAST_PATH`.413414#### `TIPC_*`415416Константы, связанные с TIPC, соответствующие тем, что экспортируются C API сокетов. Дополнительную информацию см. в документации TIPC.417418#### `socket.AF_ALG`419420#### `socket.SOL_ALG`421422#### `ALG_*`423424Константы для криптографии ядра Linux.425426[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.6.38.427428Добавлено в версии 3.6.429430#### `socket.AF_VSOCK`431432#### `socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID`433434#### `VMADDR*`435436#### `SO_VM*`437438Константы для взаимодействия между хостом и гостем в Linux.439440[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 4.8.441442Добавлено в версии 3.7.443444#### `socket.AF_LINK`445446[Доступность](https://python-all.ru/3.15/library/intro.html#availability): BSD, macOS.447448Добавлено в версии 3.4.449450#### `socket.has_ipv6`451452Эта константа содержит логическое значение, указывающее, поддерживается ли IPv6 на данной платформе.453454#### `socket.AF_BLUETOOTH`455456#### `socket.BTPROTO_L2CAP`457458#### `socket.BTPROTO_RFCOMM`459460#### `socket.BTPROTO_HCI`461462#### `socket.BTPROTO_SCO`463464Целочисленные константы для использования с Bluetooth-адресами.465466#### `socket.BDADDR_ANY`467468#### `socket.BDADDR_LOCAL`469470Это строковые константы, содержащие Bluetooth-адреса со специальным значением. Например, [`BDADDR_ANY`](https://python-all.ru/3.15/library/socket.html#socket.BDADDR_ANY) можно использовать для указания любого адреса при задании сокета привязки с помощью [`BTPROTO_RFCOMM`](https://python-all.ru/3.15/library/socket.html#socket.BTPROTO_RFCOMM).471472#### `socket.BDADDR_BREDR`473474#### `socket.BDADDR_LE_PUBLIC`475476#### `socket.BDADDR_LE_RANDOM`477478Эти константы описывают тип Bluetooth-адреса при привязке или подключении сокета [`BTPROTO_L2CAP`](https://python-all.ru/3.15/library/socket.html#socket.BTPROTO_L2CAP).479480[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux, FreeBSD481482Добавлено в версии 3.14.483484#### `socket.SOL_RFCOMM`485486#### `socket.SOL_L2CAP`487488#### `socket.SOL_HCI`489490#### `socket.SOL_SCO`491492#### `socket.SOL_BLUETOOTH`493494Используется в аргументе level методов [`setsockopt()`](https://python-all.ru/3.15/library/socket.html#socket.socket.setsockopt) и [`getsockopt()`](https://python-all.ru/3.15/library/socket.html#socket.socket.getsockopt) объектов Bluetooth-сокетов.495496[`SOL_BLUETOOTH`](https://python-all.ru/3.15/library/socket.html#socket.SOL_BLUETOOTH) доступна только в Linux. Другие константы доступны, если поддерживается соответствующий протокол.497498#### `SO_L2CAP_*`499500#### `socket.L2CAP_LM`501502#### `L2CAP_LM_*`503504#### `SO_RFCOMM_*`505506#### `RFCOMM_LM_*`507508#### `SO_SCO_*`509510#### `SO_BTH_*`511512#### `BT_*`513514Используется в аргументе имени и значения опции методов [`setsockopt()`](https://python-all.ru/3.15/library/socket.html#socket.socket.setsockopt) и [`getsockopt()`](https://python-all.ru/3.15/library/socket.html#socket.socket.getsockopt) объектов сокетов Bluetooth.515516`BT_*` и [`L2CAP_LM`](https://python-all.ru/3.15/library/socket.html#socket.L2CAP_LM) доступны только в Linux. `SO_BTH_*` доступны только в Windows. Другие константы могут быть доступны в Linux и на различных платформах BSD.517518Добавлено в версии 3.14.519520#### `socket.HCI_FILTER`521522#### `socket.HCI_TIME_STAMP`523524#### `socket.HCI_DATA_DIR`525526#### `socket.SO_HCI_EVT_FILTER`527528#### `socket.SO_HCI_PKT_FILTER`529530Имена опций для использования с [`BTPROTO_HCI`](https://python-all.ru/3.15/library/socket.html#socket.BTPROTO_HCI). Доступность и формат значений опций зависят от платформы.531532Изменено в версии 3.14: Добавлены `SO_HCI_EVT_FILTER` и `SO_HCI_PKT_FILTER` в NetBSD и DragonFly BSD. Добавлены `HCI_DATA_DIR` в FreeBSD, NetBSD и DragonFly BSD.533534#### `socket.HCI_DEV_NONE`535536Значение `device_id`, используемое для создания сокета HCI, не привязанного к одному адаптеру Bluetooth.537538[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux539540Добавлено в версии 3.14.541542#### `socket.HCI_CHANNEL_RAW`543544#### `socket.HCI_CHANNEL_USER`545546#### `socket.HCI_CHANNEL_MONITOR`547548#### `socket.HCI_CHANNEL_CONTROL`549550#### `socket.HCI_CHANNEL_LOGGING`551552Возможные значения для поля `channel` в адресе [`BTPROTO_HCI`](https://python-all.ru/3.15/library/socket.html#socket.BTPROTO_HCI).553554[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux555556Добавлено в версии 3.14.557558#### `socket.AF_QIPCRTR`559560Константа для протокола IPC-маршрутизатора Qualcomm, используемая для общения с удалёнными процессорами, предоставляющими сервисы.561562[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 4.7.563564#### `socket.SCM_CREDS2`565566#### `socket.LOCAL_CREDS`567568#### `socket.LOCAL_CREDS_PERSISTENT`569570LOCAL\_CREDS и LOCAL\_CREDS\_PERSISTENT можно использовать с сокетами SOCK\_DGRAM и SOCK\_STREAM; они эквивалентны SO\_PASSCRED в Linux/DragonFlyBSD. При этом LOCAL\_CREDS отправляет учётные данные при первом чтении, LOCAL\_CREDS\_PERSISTENT – при каждом чтении, а для типа сообщения в последнем случае необходимо использовать SCM\_CREDS2.571572Добавлено в версии 3.12.573574[Доступность](https://python-all.ru/3.15/library/intro.html#availability): FreeBSD575576#### `socket.SO_INCOMING_CPU`577578Константа для оптимизации локальности ЦП, используется совместно с `SO_REUSEPORT`.579580Добавлено в версии 3.12.581582[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 3.9583584#### `socket.SO_REUSEPORT_LB`585586> Константа, разрешающая привязку повторяющихся адресов и портов с балансировкой нагрузки.587588Добавлено в версии 3.14.589590[Доступность](https://python-all.ru/3.15/library/intro.html#availability): FreeBSD \>= 12.0591592#### `socket.AF_HYPERV`593594#### `socket.HV_PROTOCOL_RAW`595596#### `socket.HVSOCKET_CONNECT_TIMEOUT`597598#### `socket.HVSOCKET_CONNECT_TIMEOUT_MAX`599600#### `socket.HVSOCKET_CONNECTED_SUSPEND`601602#### `socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU`603604#### `socket.HV_GUID_ZERO`605606#### `socket.HV_GUID_WILDCARD`607608#### `socket.HV_GUID_BROADCAST`609610#### `socket.HV_GUID_CHILDREN`611612#### `socket.HV_GUID_LOOPBACK`613614#### `socket.HV_GUID_PARENT`615616Константы для сокетов Windows Hyper-V для взаимодействия между хостом и гостем.617618[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Windows.619620Добавлено в версии 3.12.621622#### `socket.ETHERTYPE_ARP`623624#### `socket.ETHERTYPE_IP`625626#### `socket.ETHERTYPE_IPV6`627628#### `socket.ETHERTYPE_VLAN`629630[Номер протокола IEEE 802.3](https://python-all.ru/3.15/library/socket.html). Константы.631632[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux, FreeBSD, macOS.633634Добавлено в версии 3.12.635636#### `socket.SHUT_RD`637638#### `socket.SHUT_WR`639640#### `socket.SHUT_RDWR`641642Эти константы используются методом [`shutdown()`](https://python-all.ru/3.15/library/socket.html#socket.socket.shutdown) объектов сокетов.643644[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.645646### Функции647648#### Создание сокетов649650Все следующие функции создают [объекты сокетов](https://python-all.ru/3.15/library/socket.html#socket-objects).651652Конструктор класса [`socket`](https://python-all.ru/3.15/library/socket.html#socket.socket) создаёт новый сокет напрямую; см. [Объекты сокетов](https://python-all.ru/3.15/library/socket.html#socket-objects) для получения полного описания и параметров.653654#### `socket.socketpair([family[, type[, proto]]])`655656Создаёт пару соединённых объектов сокетов, используя заданные семейство адресов, тип сокета и номер протокола. Семейство адресов, тип сокета и номер протокола такие же, как и для функции [`socket()`](https://python-all.ru/3.15/library/socket.html#socket.socket). Семейство по умолчанию – [`AF_UNIX`](https://python-all.ru/3.15/library/socket.html#socket.AF_UNIX), если оно определено на платформе; в противном случае по умолчанию используется [`AF_INET`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET).657658Новые созданные сокеты [ненаследуемые](https://python-all.ru/3.15/library/os.html#fd-inheritance).659660Изменено в версии 3.2: Возвращаемые объекты сокетов теперь поддерживают полный API сокетов, а не подмножество.661662Изменено в версии 3.4: Возвращаемые сокеты теперь являются ненаследуемыми.663664Изменено в версии 3.5: Добавлена поддержка Windows.665666#### `socket.create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False)`667668Подключается к TCP-сервису, слушающему интернет-адрес *address* (кортеж из двух элементов `(host, port)`), и возвращает объект сокета. Это функция более высокого уровня, чем [`socket.connect()`](https://python-all.ru/3.15/library/socket.html#socket.socket.connect): если *host* является нечисловым именем хоста, она попытается разрешить его как для [`AF_INET`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET), так и для [`AF_INET6`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET6), а затем попытается подключиться ко всем возможным адресам по очереди, пока соединение не будет установлено. Это упрощает написание клиентов, совместимых с IPv4 и IPv6.669670Передача необязательного параметра *timeout* установит тайм-аут для экземпляра сокета перед попыткой подключения. Если *timeout* не указан, используется глобальная настройка тайм-аута по умолчанию, возвращаемая [`getdefaulttimeout()`](https://python-all.ru/3.15/library/socket.html#socket.getdefaulttimeout).671672Если указан, *source\_address* должен быть кортежем из двух элементов `(host, port)`, к которому сокет должен привязаться как к своему исходному адресу перед подключением. Если хост или порт равны '' или 0 соответственно, будет использовано поведение ОС по умолчанию.673674Если соединение не удаётся создать, возникает исключение. По умолчанию это исключение от последнего адреса в списке. Если *all\_errors* равен `True`, это будет [`ExceptionGroup`](https://python-all.ru/3.15/library/exceptions.html#ExceptionGroup), содержащее ошибки всех попыток.675676Изменено в версии 3.2: Добавлен параметр *source\_address*.677678Изменено в версии 3.11: *all\_errors* был добавлен.679680#### `socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False)`681682Удобная функция, создающая TCP-сокет, привязанный к адресу *address* (кортеж из двух элементов `(host, port)`), и возвращающая объект сокета.683684*family* должен быть либо [`AF_INET`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET), либо [`AF_INET6`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET6). *backlog* – размер очереди, передаваемый в [`socket.listen()`](https://python-all.ru/3.15/library/socket.html#socket.socket.listen); если не указан, выбирается разумное значение по умолчанию. *reuse\_port* определяет, устанавливать ли опцию сокета `SO_REUSEPORT`.685686Если *dualstack\_ipv6* равен true, *family* равен [`AF_INET6`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET6) и платформа поддерживает это, сокет сможет принимать как IPv4-, так и IPv6-соединения; в противном случае будет вызвано [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError). Большинство POSIX-платформ и Windows должны поддерживать эту функциональность. Когда эта функция включена, адрес, возвращаемый [`socket.getpeername()`](https://python-all.ru/3.15/library/socket.html#socket.socket.getpeername) при IPv4-соединении, будет IPv6-адресом, представленным как IPv4-mapped IPv6-адрес. Если *dualstack\_ipv6* равен false, это явно отключит данную функцию на платформах, которые включают её по умолчанию (например, Linux). Этот параметр можно использовать совместно с [`has_dualstack_ipv6()`](https://python-all.ru/3.15/library/socket.html#socket.has_dualstack_ipv6):687688```python689import socket690691addr = ("", 8080)  # все интерфейсы, порт 8080692if socket.has_dualstack_ipv6():693    s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)694else:695    s = socket.create_server(addr)696```697698> **Примечание**699>700> На POSIX-платформах устанавливается опция сокета `SO_REUSEADDR`, чтобы немедленно повторно использовать предыдущие сокеты, которые были привязаны к тому же адресу *address* и оставались в состоянии TIME\_WAIT.701702Добавлено в версии 3.8.703704#### `socket.has_dualstack_ipv6()`705706Возвращает `True`, если платформа поддерживает создание TCP-сокета, который может обрабатывать как IPv4-, так и IPv6-соединения.707708Добавлено в версии 3.8.709710#### `socket.fromfd(fd, family, type, proto=0)`711712Дублирует файловый дескриптор *fd* (целое число, возвращаемое методом файлового объекта [`fileno()`](https://python-all.ru/3.15/library/io.html#io.IOBase.fileno)) и создаёт из результата объект сокета. Семейство адресов, тип сокета и номер протокола такие же, как у функции [`socket()`](https://python-all.ru/3.15/library/socket.html#socket.socket). Файловый дескриптор должен ссылаться на сокет, но это не проверяется – последующие операции с объектом могут завершиться ошибкой, если файловый дескриптор недействителен. Эта функция редко требуется, но может использоваться для получения или установки параметров сокета на сокете, переданном программе как стандартный ввод или вывод (например, сервер, запущенный демоном inet в Unix). Предполагается, что сокет находится в блокирующем режиме.713714Новый созданный сокет [ненаследуемый](https://python-all.ru/3.15/library/os.html#fd-inheritance).715716Изменено в версии 3.4: Возвращаемый сокет теперь ненаследуемый.717718#### `socket.fromshare(data)`719720Создаёт экземпляр сокета из данных, полученных из метода [`socket.share()`](https://python-all.ru/3.15/library/socket.html#socket.socket.share). Предполагается, что сокет находится в блокирующем режиме.721722[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Windows.723724Добавлено в версии 3.3.725726#### Другие функции727728Модуль `socket` также предоставляет различные сетевые службы:729730#### `socket.close(fd)`731732Закрывает файловый дескриптор сокета. Это похоже на [`os.close()`](https://python-all.ru/3.15/library/os.html#os.close), но для сокетов. На некоторых платформах (особенно в Windows) `os.close()` не работает для файловых дескрипторов сокетов.733734Добавлено в версии 3.7.735736#### `socket.getaddrinfo(host, port, family=AF_UNSPEC, type=0, proto=0, flags=0)`737738Эта функция является обёрткой над C-функцией `getaddrinfo` базовой системы.739740Преобразует аргументы *host*/*port* в последовательность кортежей из 5 элементов, содержащих все необходимые аргументы для создания сокета, подключенного к этому сервису. *host* – это доменное имя, строковое представление IPv4/v6-адреса или `None`. *port* – это строковое имя службы, такое как `'http'`, числовой номер порта или `None`. Передавая `None` в качестве значения *host* и *port*, можно передать `NULL` в базовый C API.741742Аргументы *family*, *type* и *proto* могут быть опционально указаны, чтобы предоставить опции и ограничить список возвращаемых адресов. Передайте их значения по умолчанию (соответственно [`AF_UNSPEC`](https://python-all.ru/3.15/library/socket.html#socket.AF_UNSPEC), 0 и 0), чтобы не ограничивать результаты. Подробнее см. примечание ниже.743744Аргумент *flags* может быть одной или несколькими константами `AI_*` и влияет на то, как вычисляются и возвращаются результаты. Например, `AI_NUMERICHOST` отключает разрешение доменных имён и вызовет ошибку, если *host* является доменным именем.745746Функция возвращает список кортежей из 5 элементов со следующей структурой:747748`(family, type, proto, canonname, sockaddr)`749750В этих кортежах *family*, *type* и *proto* – целые числа, предназначенные для передачи в функцию [`socket()`](https://python-all.ru/3.15/library/socket.html#socket.socket). *canonname* будет строкой, представляющей каноническое имя *хоста*, если `AI_CANONNAME` входит в аргумент *flags*; в противном случае *canonname* будет пустым. *sockaddr* – это кортеж, описывающий адрес сокета; его формат зависит от возвращённого *family* и флагов, с которыми был скомпилирован Python, и предназначен для передачи методу [`socket.connect()`](https://python-all.ru/3.15/library/socket.html#socket.socket.connect).751752*sockaddr* может быть одним из следующих:753754- кортеж из двух элементов `(address, port)` для [`AF_INET`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET)755- кортеж из четырёх элементов `(address, port, flowinfo, scope_id)` для [`AF_INET6`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET6), если Python был скомпилирован с `--enable-ipv6` (по умолчанию)756- кортеж из двух элементов, содержащий необработанные данные для [`AF_INET6`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET6), если Python был скомпилирован с `--disable-ipv6`757758> **Примечание**759>760> Если вы планируете использовать результаты из `getaddrinfo()` для создания сокета (а не, например, для получения *canonname*), рассмотрите возможность ограничения результатов по *type* (например, [`SOCK_STREAM`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_STREAM) или [`SOCK_DGRAM`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_DGRAM)) и/или *proto* (например, `IPPROTO_TCP` или `IPPROTO_UDP`), с которыми ваше приложение может работать.761>762> Поведение при значениях по умолчанию для *family*, *type*, *proto* и *flags* зависит от системы.763>764> Многие системы (например, большинство конфигураций Linux) возвращают отсортированный список всех совпадающих адресов. Обычно эти адреса следует перебирать по порядку до успешного установления соединения (возможен параллельный перебор, например, с использованием алгоритма [Happy Eyeballs](https://python-all.ru/3.15/library/socket.html)). В таких случаях ограничение по *type* и/или *proto* может помочь исключить неудачные или непригодные попытки подключения.765>766> Однако некоторые системы возвращают только один адрес (например, такое поведение наблюдалось в конфигурациях Solaris и AIX). На этих системах ограничение по *type* и/или *proto* помогает гарантировать, что этот адрес пригоден для использования.767768Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.getaddrinfo` с аргументами `host`, `port`, `family`, `type`, `protocol`.769770В следующем примере получается информация об адресе для гипотетического TCP-подключения к `example.org` на порту 80 (результаты могут отличаться на вашей системе, если IPv6 не включён):771772```python773>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP)774[(socket.AF_INET6, socket.SOCK_STREAM,775 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),776 (socket.AF_INET, socket.SOCK_STREAM,777 6, '', ('93.184.216.34', 80))]778```779780Изменено в версии 3.2: теперь параметры можно передавать в виде именованных аргументов.781782Изменено в версии 3.7: для IPv6-адресов многоадресной рассылки строка, представляющая адрес, не будет содержать часть `%scope_id`.783784#### `socket.getfqdn([name])`785786Возвращает полное доменное имя для *name*. Если *name* опущен или пуст, он интерпретируется как локальный хост. Для поиска полного доменного имени проверяется имя хоста, возвращаемое [`gethostbyaddr()`](https://python-all.ru/3.15/library/socket.html#socket.gethostbyaddr), затем псевдонимы хоста, если они доступны. Выбирается первое имя, содержащее точку. Если полное доменное имя недоступно, а *name* был предоставлен, он возвращается без изменений. Если *name* был пуст или равен `'0.0.0.0'`, возвращается имя хоста из [`gethostname()`](https://python-all.ru/3.15/library/socket.html#socket.gethostname).787788#### `socket.gethostbyname(hostname)`789790Преобразует имя хоста в формат IPv4-адреса. IPv4-адрес возвращается в виде строки, например `'100.50.200.5'`. Если имя хоста само является IPv4-адресом, оно возвращается без изменений. См. [`gethostbyname_ex()`](https://python-all.ru/3.15/library/socket.html#socket.gethostbyname_ex) для более полного интерфейса. `gethostbyname()` не поддерживает разрешение имён IPv6, вместо него для поддержки двойного стека IPv4/v6 следует использовать [`getaddrinfo()`](https://python-all.ru/3.15/library/socket.html#socket.getaddrinfo).791792Вызывает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.gethostbyname` с аргументом `hostname`.793794[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.795796#### `socket.gethostbyname_ex(hostname)`797798Преобразует имя хоста в формат IPv4-адреса, расширенный интерфейс. Возвращает кортеж из трёх элементов `(hostname, aliaslist, ipaddrlist)`, где *hostname* – основное имя хоста, *aliaslist* – (возможно пустой) список альтернативных имён хоста для того же адреса, а *ipaddrlist* – список IPv4-адресов того же интерфейса на том же хосте (часто, но не всегда, один адрес). `gethostbyname_ex()` не поддерживает разрешение имён IPv6, вместо него для поддержки двойного стека IPv4/v6 следует использовать [`getaddrinfo()`](https://python-all.ru/3.15/library/socket.html#socket.getaddrinfo).799800Вызывает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.gethostbyname` с аргументом `hostname`.801802[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.803804#### `socket.gethostname()`805806Возвращает строку, содержащую имя хоста машины, на которой в данный момент выполняется интерпретатор Python.807808Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.gethostname` без аргументов.809810Примечание: `gethostname()` не всегда возвращает полное доменное имя; для этого используйте [`getfqdn()`](https://python-all.ru/3.15/library/socket.html#socket.getfqdn).811812[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.813814#### `socket.gethostbyaddr(ip_address)`815816Возвращает кортеж из трёх элементов `(hostname, aliaslist, ipaddrlist)`, где *hostname* – основное имя хоста, соответствующее указанному *ip\_address*, *aliaslist* – (возможно пустой) список альтернативных имён хоста для того же адреса, а *ipaddrlist* – список IPv4/v6-адресов того же интерфейса на том же хосте (скорее всего, содержащий только один адрес). Чтобы найти полное доменное имя, используйте функцию [`getfqdn()`](https://python-all.ru/3.15/library/socket.html#socket.getfqdn). `gethostbyaddr()` поддерживает как IPv4, так и IPv6.817818Вызывает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.gethostbyaddr` с аргументом `ip_address`.819820[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.821822#### `socket.getnameinfo(sockaddr, flags)`823824Преобразует адрес сокета *sockaddr* в кортеж из двух элементов `(host, port)`. В зависимости от настроек *flags* результат может содержать полное доменное имя или числовое представление адреса в *host*. Аналогично, *port* может содержать строковое имя порта или номер порта.825826Для IPv6-адресов `%scope_id` добавляется к части хоста, если *sockaddr* содержит значимый *scope\_id*. Обычно это происходит для многоадресных адресов.827828Для получения дополнительной информации о *flags* можно обратиться к *[getnameinfo(3)](https://python-all.ru/3.15/library/socket.html)*.829830Вызывает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.getnameinfo` с аргументом `sockaddr`.831832[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.833834#### `socket.getprotobyname(protocolname)`835836Преобразует имя интернет-протокола (например, `'icmp'`) в константу, пригодную для передачи в качестве (необязательного) третьего аргумента функции [`socket()`](https://python-all.ru/3.15/library/socket.html#socket.socket). Обычно это требуется только для сокетов, открытых в «сыром» режиме ([`SOCK_RAW`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_RAW)); для обычных режимов сокетов правильный протокол выбирается автоматически, если протокол опущен или равен нулю.837838[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.839840#### `socket.getservbyname(servicename[, protocolname])`841842Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Если указано необязательное имя протокола, оно должно быть `'tcp'` или `'udp'`; в противном случае подойдёт любой протокол.843844Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.getservbyname` с аргументами `servicename`, `protocolname`.845846[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.847848#### `socket.getservbyport(port[, protocolname])`849850Преобразует номер интернет-порта и имя протокола в имя службы для этой службы. Если указано необязательное имя протокола, оно должно быть `'tcp'` или `'udp'`; в противном случае подойдёт любой протокол.851852Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.getservbyport` с аргументами `port`, `protocolname`.853854[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.855856#### `socket.ntohl(x)`857858Преобразует 32-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта операция ничего не делает; в противном случае выполняется перестановка 4 байтов.859860#### `socket.ntohs(x)`861862Преобразует 16-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.863864Изменено в версии 3.10: Возбуждает [`OverflowError`](https://python-all.ru/3.15/library/exceptions.html#OverflowError), если *x* не помещается в 16-битное беззнаковое целое.865866#### `socket.htonl(x)`867868Преобразует 32-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен четырёх байтов.869870#### `socket.htons(x)`871872Преобразует 16-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.873874Изменено в версии 3.10: Возбуждает [`OverflowError`](https://python-all.ru/3.15/library/exceptions.html#OverflowError), если *x* не помещается в 16-битное беззнаковое целое.875876#### `socket.inet_aton(ip_string)`877878Преобразует IPv4-адрес из строкового формата с точками (например, ‘123.45.67.89’) в 32-битный упакованный двоичный формат в виде объекта bytes длиной четыре символа. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `in_addr`, который является C-типом для 32-битного упакованного двоичного представления, возвращаемого этой функцией.879880`inet_aton()` также принимает строки с менее чем тремя точками; подробности см. в руководстве Unix *[inet(3)](https://python-all.ru/3.15/library/socket.html)*.881882Если переданная функции строка IPv4-адреса недопустима, будет возбуждено [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError). Обратите внимание: что именно считается допустимым, зависит от нижележащей C-реализации `inet_aton()`.883884`inet_aton()` не поддерживает IPv6; для поддержки двойного стека IPv4/IPv6 следует использовать [`inet_pton()`](https://python-all.ru/3.15/library/socket.html#socket.inet_pton).885886#### `socket.inet_ntoa(packed_ip)`887888Преобразует 32-битный упакованный IPv4-адрес ([объект, подобный bytes](https://python-all.ru/3.15/glossary.html#term-bytes-like-object) длиной четыре байта) в стандартное строковое представление с точками (например, ‘123.45.67.89’). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `in_addr`, который является C-типом для 32-битных упакованных двоичных данных, принимаемых этой функцией в качестве аргумента.889890Если переданная функции последовательность байтов имеет длину не ровно 4 байта, будет возбуждено [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError). `inet_ntoa()` не поддерживает IPv6; для поддержки двойного стека IPv4/IPv6 следует использовать [`inet_ntop()`](https://python-all.ru/3.15/library/socket.html#socket.inet_ntop).891892Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.15/glossary.html#term-bytes-like-object).893894#### `socket.inet_pton(address_family, ip_string)`895896Преобразует IP-адрес из строкового формата, специфичного для семейства адресов, в упакованный двоичный формат. `inet_pton()` полезен, когда библиотека или сетевой протокол требует объект типа `in_addr` (аналогично [`inet_aton()`](https://python-all.ru/3.15/library/socket.html#socket.inet_aton)) или `in6_addr`.897898В настоящее время поддерживаемые значения для *address\_family*: [`AF_INET`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET) и [`AF_INET6`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET6). Если строка IP-адреса *ip\_string* недопустима, будет возбуждено [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError). Обратите внимание: что именно считается допустимым, зависит как от значения *address\_family*, так и от нижележащей реализации `inet_pton()`.899900[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix, Windows.901902Изменено в версии 3.4: Добавлена поддержка Windows903904#### `socket.inet_ntop(address_family, packed_ip)`905906Преобразует упакованный IP-адрес ([объект, подобный bytes](https://python-all.ru/3.15/glossary.html#term-bytes-like-object) некоторой длины) в стандартное строковое представление, специфичное для семейства адресов (например, `'7.10.0.5'` или `'5aef:2b::8'`). `inet_ntop()` полезен, когда библиотека или сетевой протокол возвращает объект типа `in_addr` (аналогично [`inet_ntoa()`](https://python-all.ru/3.15/library/socket.html#socket.inet_ntoa)) или `in6_addr`.907908В настоящее время поддерживаемые значения для *address\_family*: [`AF_INET`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET) и [`AF_INET6`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET6). Если объект bytes *packed\_ip* имеет неправильную длину для указанного семейства адресов, будет возбуждено [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError). [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError) возбуждается при ошибках вызова `inet_ntop()`.909910[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix, Windows.911912Изменено в версии 3.4: Добавлена поддержка Windows913914Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.15/glossary.html#term-bytes-like-object).915916#### `socket.CMSG_LEN(length)`917918Return the total length, without trailing padding, of an ancillary data item with associated data of the given *length*. This value can often be used as the buffer size for [`recvmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recvmsg) to receive a single item of ancillary data, but [**RFC 3542**](https://python-all.ru/3.15/library/socket.html) requires portable applications to use [`CMSG_SPACE()`](https://python-all.ru/3.15/library/socket.html#socket.CMSG_SPACE) and thus include space for padding, even when the item will be the last in the buffer. Raises [`OverflowError`](https://python-all.ru/3.15/library/exceptions.html#OverflowError) if *length* is outside the permissible range of values.919920[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix, не WASI.921922Большинство Unix-платформ.923924Добавлено в версии 3.3.925926#### `socket.CMSG_SPACE(length)`927928Возвращает размер буфера, необходимый для [`recvmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recvmsg) для приёма одного вспомогательного элемента данных с соответствующими данными заданной *length*, включая любое завершающее выравнивание. Пространство буфера, необходимое для приёма нескольких элементов, представляет собой сумму значений `CMSG_SPACE()` для длин их соответствующих данных. Возбуждает [`OverflowError`](https://python-all.ru/3.15/library/exceptions.html#OverflowError), если *length* выходит за допустимый диапазон значений.929930Обратите внимание, что некоторые системы могут поддерживать вспомогательные данные, не предоставляя эту функцию. Также обратите внимание, что установка размера буфера с использованием результатов этой функции может не точно ограничить объём принимаемых вспомогательных данных, поскольку дополнительные данные могут поместиться в область выравнивания.931932[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix, не WASI.933934большинство Unix-платформ.935936Добавлено в версии 3.3.937938#### `socket.getdefaulttimeout()`939940Возвращает тайм-аут по умолчанию в секундах (число с плавающей запятой) для новых объектов сокетов. Значение `None` означает, что новые объекты сокетов не имеют тайм-аута. При первом импорте модуля socket значение по умолчанию равно `None`.941942#### `socket.setdefaulttimeout(timeout)`943944Устанавливает тайм-аут по умолчанию в секундах (вещественное число) для новых объектов сокета. При первом импорте модуля socket значение по умолчанию равно `None`. Допустимые значения и их описание приведены в [`settimeout()`](https://python-all.ru/3.15/library/socket.html#socket.socket.settimeout).945946Изменено в версии 3.15: принимает любое вещественное число, не только целое или float.947948#### `socket.sethostname(name)`949950Устанавливает имя узла (hostname) машины равным *name*. Если прав недостаточно, будет возбуждено исключение [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError).951952Вызывает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.sethostname` с аргументом `name`.953954[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix, не Android.955956Добавлено в версии 3.3.957958#### `socket.if_nameindex()`959960Возвращает список кортежей с информацией о сетевых интерфейсах (индекс в виде целого числа, имя в виде строки). [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError) в случае неудачного системного вызова.961962[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix, Windows, не WASI.963964Добавлено в версии 3.3.965966Изменено в версии 3.8: добавлена поддержка Windows.967968> **Примечание**969>970> В Windows сетевые интерфейсы имеют разные имена в разных контекстах (все имена приведены в качестве примера):971>972> - UUID: `{FB605B73-AAC2-49A6-9A2F-25416AEA0573}`973> - имя: `ethernet_32770`974> - понятное имя: `vEthernet (nat)`975> - описание: `Hyper-V Virtual Ethernet Adapter`976>977> Эта функция возвращает имена второй формы из списка; в данном примере это `ethernet_32770`.978979#### `socket.if_nametoindex(if_name)`980981Возвращает номер индекса сетевого интерфейса, соответствующий имени интерфейса. [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError), если интерфейс с таким именем не существует.982983[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix, Windows, не WASI.984985Добавлено в версии 3.3.986987Изменено в версии 3.8: добавлена поддержка Windows.988989> **См. также**990>991> «Имя интерфейса» – это имя, описанное в [`if_nameindex()`](https://python-all.ru/3.15/library/socket.html#socket.if_nameindex).992993#### `socket.if_indextoname(if_index)`994995Возвращает имя сетевого интерфейса, соответствующее номеру индекса интерфейса. [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError), если интерфейс с таким индексом не существует.996997[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix, Windows, не WASI.998999Добавлено в версии 3.3.10001001Изменено в версии 3.8: добавлена поддержка Windows.10021003> **См. также**1004>1005> «Имя интерфейса» – это имя, описанное в [`if_nameindex()`](https://python-all.ru/3.15/library/socket.html#socket.if_nameindex).10061007#### `socket.send_fds(sock, buffers, fds[, flags[, address]])`10081009Отправляет список файловых дескрипторов *fds* через [`AF_UNIX`](https://python-all.ru/3.15/library/socket.html#socket.AF_UNIX)-сокет *sock*. Параметр *fds* – последовательность файловых дескрипторов. Описание этих параметров см. в [`sendmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.sendmsg).10101011[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix, не WASI.10121013Платформы Unix, поддерживающие механизмы [`sendmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.sendmsg) и `SCM_RIGHTS`.10141015Добавлено в версии 3.9.10161017#### `socket.recv_fds(sock, bufsize, maxfds[, flags])`10181019Принимает до *maxfds* файловых дескрипторов из [`AF_UNIX`](https://python-all.ru/3.15/library/socket.html#socket.AF_UNIX)-сокета *sock*. Возвращает `(msg, list(fds), flags, addr)`. Описание этих параметров см. в [`recvmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recvmsg).10201021[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix, не WASI.10221023Платформы Unix, поддерживающие механизмы [`recvmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recvmsg) и `SCM_RIGHTS`.10241025Добавлено в версии 3.9.10261027> **Примечание**1028>1029> Любые усечённые целые числа в конце списка файловых дескрипторов.10301031## Объекты сокетов10321033#### `class socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)`10341035Создаёт новый сокет с заданным семейством адресов, типом сокета и номером протокола. Семейство адресов должно быть [`AF_INET`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET) (по умолчанию), [`AF_INET6`](https://python-all.ru/3.15/library/socket.html#socket.AF_INET6), [`AF_UNIX`](https://python-all.ru/3.15/library/socket.html#socket.AF_UNIX), [`AF_CAN`](https://python-all.ru/3.15/library/socket.html#socket.AF_CAN), [`AF_PACKET`](https://python-all.ru/3.15/library/socket.html#socket.AF_PACKET) или [`AF_RDS`](https://python-all.ru/3.15/library/socket.html#socket.AF_RDS). Тип сокета – [`SOCK_STREAM`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_STREAM) (по умолчанию), [`SOCK_DGRAM`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_DGRAM), [`SOCK_RAW`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_RAW) или, возможно, одна из других констант `SOCK_`. Номер протокола обычно равен нулю и может быть опущен; в случае, если семейство адресов `AF_CAN`, протоколом должно быть одно из значений `CAN_RAW`, [`CAN_BCM`](https://python-all.ru/3.15/library/socket.html#socket.CAN_BCM), [`CAN_ISOTP`](https://python-all.ru/3.15/library/socket.html#socket.CAN_ISOTP) или [`CAN_J1939`](https://python-all.ru/3.15/library/socket.html#socket.CAN_J1939).10361037Если указан *fileno*, значения *family*, *type* и *proto* автоматически определяются по указанному файловому дескриптору. Автоматическое определение можно переопределить, передав функции явные аргументы *family*, *type* или *proto*. Это влияет только на то, как Python представляет, например, возвращаемое значение [`socket.getpeername()`](https://python-all.ru/3.15/library/socket.html#socket.socket.getpeername), но не на реальный ресурс ОС. В отличие от [`socket.fromfd()`](https://python-all.ru/3.15/library/socket.html#socket.fromfd), *fileno* возвращает тот же сокет, а не его копию. Это может помочь закрыть отсоединённый сокет с помощью [`socket.close()`](https://python-all.ru/3.15/library/socket.html#socket.close).10381039Новый созданный сокет [ненаследуемый](https://python-all.ru/3.15/library/os.html#fd-inheritance).10401041Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.__new__` с аргументами `self`, `family`, `type`, `protocol`.10421043Изменено в версии 3.3: Добавлено семейство AF\_CAN. Добавлено семейство AF\_RDS.10441045Изменено в версии 3.4: Добавлен протокол CAN\_BCM.10461047Изменено в версии 3.4: Возвращаемый сокет теперь ненаследуемый.10481049Изменено в версии 3.7: Добавлен протокол CAN\_ISOTP.10501051Изменено в версии 3.7: Когда к *type* применяются битовые флаги [`SOCK_NONBLOCK`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_NONBLOCK) или [`SOCK_CLOEXEC`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_CLOEXEC), они сбрасываются, и [`socket.type`](https://python-all.ru/3.15/library/socket.html#socket.socket.type) не будет их отражать. Они по-прежнему передаются системному вызову `socket()`. Поэтому,10521053```python1054sock = socket.socket(1055    socket.AF_INET,1056    socket.SOCK_STREAM | socket.SOCK_NONBLOCK)1057```10581059будет по-прежнему создавать неблокирующий сокет в ОС, поддерживающих `SOCK_NONBLOCK`, но `sock.type` будет установлен в `socket.SOCK_STREAM`.10601061Изменено в версии 3.9: Добавлен протокол CAN\_J1939.10621063Изменено в версии 3.10: Добавлен протокол IPPROTO\_MPTCP.10641065Объекты сокетов имеют следующие методы. За исключением [`makefile()`](https://python-all.ru/3.15/library/socket.html#socket.socket.makefile), они соответствуют системным вызовам Unix, применимым к сокетам.10661067Изменено в версии 3.2: Добавлена поддержка протокола [менеджера контекста](https://python-all.ru/3.15/glossary.html#term-context-manager). Выход из менеджера контекста эквивалентен вызову [`close()`](https://python-all.ru/3.15/library/socket.html#socket.close).10681069#### `accept()`10701071Принимает соединение. Сокет должен быть привязан к адресу и находиться в режиме прослушивания. Возвращаемое значение – пара `(conn, address)`, где *conn* – это *новый* объект сокета, пригодный для отправки и получения данных по соединению, а *address* – адрес, привязанный к сокету на другом конце соединения.10721073Новый созданный сокет [ненаследуемый](https://python-all.ru/3.15/library/os.html#fd-inheritance).10741075Изменено в версии 3.4: Сокет теперь ненаследуемый.10761077Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.15/library/socket.html) с обоснованием).10781079#### `bind(address)`10801081Привязывает сокет к адресу *address*. Сокет не должен быть уже привязан. Формат *address* зависит от семейства адресов – см. [Семейства сокетов](https://python-all.ru/3.15/library/socket.html#socket-addresses).10821083Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.bind` с аргументами `self`, `address`.10841085[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.10861087#### `close()`10881089Помечает сокет как закрытый. Базовый системный ресурс (например, файловый дескриптор) также закрывается, когда все файловые объекты из [`makefile()`](https://python-all.ru/3.15/library/socket.html#socket.socket.makefile) будут закрыты. Как только это происходит, все последующие операции с объектом сокета будут завершаться ошибкой. Удалённая сторона больше не получит данных (после сброса поставленных в очередь данных).10901091Сокеты автоматически закрываются при сборке мусора, но рекомендуется явно `close()` их закрывать или использовать оператор [`with`](https://python-all.ru/3.15/reference/compound_stmts.html#with) вокруг них.10921093Изменено в версии 3.6: Теперь [`OSError`](https://python-all.ru/3.15/library/exceptions.html#OSError) возбуждается, если при выполнении `close()` возникает ошибка.10941095> **Примечание**1096>1097> `close()` освобождает ресурс, связанный с соединением, но не обязательно немедленно закрывает соединение. Если требуется своевременно закрыть соединение, вызовите [`shutdown()`](https://python-all.ru/3.15/library/socket.html#socket.socket.shutdown) перед `close()`.10981099#### `connect(address)`11001101Подключается к удалённому сокету по адресу *address*. Формат *address* зависит от семейства адресов – см. [Семейства сокетов](https://python-all.ru/3.15/library/socket.html#socket-addresses).11021103Если соединение прервано сигналом, метод ждёт завершения соединения или возбуждает [`TimeoutError`](https://python-all.ru/3.15/library/exceptions.html#TimeoutError) по тайм-ауту, если обработчик сигнала не вызывает исключение и сокет является блокирующим или имеет тайм-аут. Для неблокирующих сокетов метод возбуждает исключение [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError), если соединение прервано сигналом (или исключением, возбуждённым обработчиком сигнала).11041105Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.connect` с аргументами `self`, `address`.11061107Изменено в версии 3.5: Теперь метод ждёт завершения соединения вместо возбуждения исключения [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError), если соединение прервано сигналом, обработчик сигнала не вызывает исключение, а сокет является блокирующим или имеет тайм-аут (см. [**PEP 475**](https://python-all.ru/3.15/library/socket.html) с обоснованием).11081109[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.11101111#### `connect_ex(address)`11121113Как и `connect(address)`, но возвращает индикатор ошибки вместо возбуждения исключения для ошибок, возвращаемых вызовом `connect()` на уровне C (другие проблемы, например «хост не найден», по-прежнему могут вызывать исключения). Индикатор ошибки равен `0`, если операция выполнена успешно, в противном случае – значению переменной `errno`. Это удобно, например, для поддержки асинхронных подключений.11141115Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.connect` с аргументами `self`, `address`.11161117[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.11181119#### `detach()`11201121Переводит объект сокета в закрытое состояние без фактического закрытия базового файлового дескриптора. Файловый дескриптор возвращается и может быть повторно использован для других целей.11221123Добавлено в версии 3.2.11241125#### `dup()`11261127Дублирует сокет.11281129Новый созданный сокет [ненаследуемый](https://python-all.ru/3.15/library/os.html#fd-inheritance).11301131Изменено в версии 3.4: Сокет теперь ненаследуемый.11321133[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.11341135#### `fileno()`11361137Возвращает файловый дескриптор сокета (небольшое целое число) или -1 в случае ошибки. Это полезно с [`select.select()`](https://python-all.ru/3.15/library/select.html#select.select).11381139В Windows небольшое целое число, возвращаемое этим методом, нельзя использовать там, где может быть использован файловый дескриптор (например, [`os.fdopen()`](https://python-all.ru/3.15/library/os.html#os.fdopen)). В Unix такого ограничения нет.11401141#### `get_inheritable()`11421143Получить [наследуемый флаг](https://python-all.ru/3.15/library/os.html#fd-inheritance) файлового дескриптора сокета или handle сокета: `True`, если сокет может наследоваться в дочерних процессах, `False`, если не может.11441145Добавлено в версии 3.4.11461147#### `getpeername()`11481149Возвращает удалённый адрес, к которому подключён сокет. Это полезно, например, для определения номера порта удалённого IPv4/v6 сокета. Формат возвращаемого адреса зависит от семейства адресов – см. [Семейства сокетов](https://python-all.ru/3.15/library/socket.html#socket-addresses). На некоторых системах эта функция не поддерживается.11501151#### `getsockname()`11521153Возвращает собственный адрес сокета. Это полезно, например, для определения номера порта IPv4/v6 сокета. Формат возвращаемого адреса зависит от семейства адресов – см. [Семейства сокетов](https://python-all.ru/3.15/library/socket.html#socket-addresses).11541155#### `getsockopt(level, optname[, buflen])`11561157Возвращает значение заданной опции сокета (см. man-страницу Unix *[getsockopt(2)](https://python-all.ru/3.15/library/socket.html)*). Нужные символические константы ([SO\_\* и т.д.](https://python-all.ru/3.15/library/socket.html#socket-unix-constants)) определены в этом модуле. Если параметр *buflen* отсутствует, предполагается целочисленная опция, и функция возвращает её целое значение. Если *buflen* присутствует, он задаёт максимальную длину буфера для получения опции, и этот буфер возвращается в виде объекта bytes. Задача вызывающего кода – декодировать содержимое буфера (см. встроенный необязательный модуль [`struct`](https://python-all.ru/3.15/library/struct.html#module-struct) для способа декодирования C-структур, закодированных как байтовые строки).11581159[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.11601161#### `getblocking()`11621163Возвращает `True`, если сокет в блокирующем режиме, и `False`, если в неблокирующем.11641165Это эквивалентно проверке `socket.gettimeout() != 0`.11661167Добавлено в версии 3.7.11681169#### `gettimeout()`11701171Возвращает тайм-аут в секундах (число с плавающей точкой), связанный с операциями сокета, или `None`, если тайм-аут не установлен. Это отражает последний вызов [`setblocking()`](https://python-all.ru/3.15/library/socket.html#socket.socket.setblocking) или [`settimeout()`](https://python-all.ru/3.15/library/socket.html#socket.socket.settimeout).11721173#### `ioctl(control, option)`11741175Метод `ioctl()` является ограниченным интерфейсом к системному интерфейсу WSAIoctl. За дополнительной информацией обратитесь к [документации Win32](https://python-all.ru/3.15/library/socket.html).11761177На других платформах можно использовать общие функции [`fcntl.fcntl()`](https://python-all.ru/3.15/library/fcntl.html#fcntl.fcntl) и [`fcntl.ioctl()`](https://python-all.ru/3.15/library/fcntl.html#fcntl.ioctl); они принимают объект сокета в качестве первого аргумента.11781179В настоящее время поддерживаются только следующие управляющие коды: `SIO_RCVALL`, `SIO_KEEPALIVE_VALS` и `SIO_LOOPBACK_FAST_PATH`.11801181[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Windows11821183Изменено в версии 3.6: добавлен `SIO_LOOPBACK_FAST_PATH`.11841185#### `listen([backlog])`11861187Включает возможность сервера принимать соединения. Если указан *backlog*, он должен быть не менее 0 (если меньше, устанавливается в 0); он задаёт количество непринятых соединений, которые система разрешит до отказа в новых соединениях. Если не указан, выбирается разумное значение по умолчанию.11881189[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.11901191Изменено в версии 3.5: Параметр *backlog* теперь необязателен.11921193#### `makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)`11941195Возвращает [файловый объект](https://python-all.ru/3.15/glossary.html#term-file-object), связанный с сокетом. Точный возвращаемый тип зависит от аргументов, переданных `makefile()`. Эти аргументы интерпретируются так же, как и встроенной функцией [`open()`](https://python-all.ru/3.15/library/functions.html#open), за исключением того, что поддерживаются только значения *mode* `'r'` (по умолчанию), `'w'`, `'b'` или их комбинация.11961197Сокет должен быть в блокирующем режиме; можно установить тайм-аут, но при его срабатывании внутренний буфер файлового объекта может оказаться в несогласованном состоянии.11981199Закрытие файлового объекта, возвращённого `makefile()`, не закроет исходный сокет, если только все остальные файловые объекты не будут закрыты и для объекта сокета не будет вызван [`socket.close()`](https://python-all.ru/3.15/library/socket.html#socket.close).12001201> **Примечание**1202>1203> В Windows файлоподобный объект, созданный `makefile()`, нельзя использовать там, где ожидается файловый объект с дескриптором файла, например, в аргументах потока [`subprocess.Popen()`](https://python-all.ru/3.15/library/subprocess.html#subprocess.Popen).12041205#### `recv(bufsize[, flags])`12061207Принимает данные из сокета. Возвращаемое значение – объект bytes, представляющий полученные данные. Максимальный объём данных, который может быть принят за один раз, задаётся параметром *bufsize*. Пустой объект bytes означает, что клиент отключился. Смысл необязательного аргумента *flags* описан в справочной странице Unix *[recv(2)](https://python-all.ru/3.15/library/socket.html)*; по умолчанию он равен нулю.12081209Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.15/library/socket.html) с обоснованием).12101211#### `recvfrom(bufsize[, flags])`12121213Принимает данные из сокета. Возвращаемое значение – пара `(bytes, address)`, где *bytes* – объект bytes с полученными данными, а *address* – адрес сокета, отправившего данные. Смысл необязательного аргумента *flags* описан в справочной странице Unix *[recv(2)](https://python-all.ru/3.15/library/socket.html)*; по умолчанию он равен нулю. Формат *address* зависит от семейства адресов – см. [Семейства сокетов](https://python-all.ru/3.15/library/socket.html#socket-addresses).12141215Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.15/library/socket.html) с обоснованием).12161217Изменено в версии 3.7: Для многоадресного IPv6-адреса первый элемент *address* больше не содержит часть `%scope_id`. Чтобы получить полный IPv6-адрес, используйте [`getnameinfo()`](https://python-all.ru/3.15/library/socket.html#socket.getnameinfo).12181219#### `recvmsg(bufsize[, ancbufsize[, flags]])`12201221Принимает обычные данные (до *bufsize* байт) и вспомогательные данные из сокета. Аргумент *ancbufsize* задаёт размер внутреннего буфера для приёма вспомогательных данных в байтах; по умолчанию равен 0, то есть вспомогательные данные приниматься не будут. Подходящие размеры буфера для вспомогательных данных можно вычислить с помощью [`CMSG_SPACE()`](https://python-all.ru/3.15/library/socket.html#socket.CMSG_SPACE) или [`CMSG_LEN()`](https://python-all.ru/3.15/library/socket.html#socket.CMSG_LEN); данные, не помещающиеся в буфер, могут быть усечены или отброшены. Аргумент *flags* по умолчанию равен 0 и имеет тот же смысл, что и для [`recv()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recv).12221223Возвращаемое значение – кортеж из 4 элементов: `(data, ancdata, msg_flags, address)`. Элемент *data* – это объект [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes), содержащий принятые невспомогательные данные. Элемент *ancdata* – это список из нуля или более кортежей `(cmsg_level, cmsg_type, cmsg_data)`, представляющих принятые вспомогательные данные (управляющие сообщения): *cmsg\_level* и *cmsg\_type* – целые числа, задающие уровень протокола и тип протокола соответственно, а *cmsg\_data* – объект `bytes` с соответствующими данными. Элемент *msg\_flags* – побитовое ИЛИ различных флагов, указывающих на состояние принятого сообщения; подробнее см. в системной документации. Если принимающий сокет не подключён, *address* – это адрес отправляющего сокета (если доступен); в противном случае его значение не определено.12241225В некоторых системах [`sendmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.sendmsg) и `recvmsg()` можно использовать для передачи файловых дескрипторов между процессами через сокет [`AF_UNIX`](https://python-all.ru/3.15/library/socket.html#socket.AF_UNIX). Если эта возможность используется (часто она ограничена сокетами [`SOCK_STREAM`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_STREAM)), то `recvmsg()` вернёт во вспомогательных данных элементы вида `(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)`, где *fds* – объект [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes), представляющий новые файловые дескрипторы в виде двоичного массива нативного C-типа int. Если `recvmsg()` вызывает исключение после возврата из системного вызова, он сначала попытается закрыть все файловые дескрипторы, полученные через этот механизм.12261227Некоторые системы не указывают усечённую длину частично принятых вспомогательных данных. Если элемент, по-видимому, выходит за конец буфера, `recvmsg()` выдаст [`RuntimeWarning`](https://python-all.ru/3.15/library/exceptions.html#RuntimeWarning) и вернёт ту его часть, которая находится в буфере, при условии, что она не была усечена до начала соответствующих данных.12281229В системах, поддерживающих механизм `SCM_RIGHTS`, следующая функция будет принимать до *maxfds* файловых дескрипторов, возвращая данные сообщения и список, содержащий дескрипторы (игнорируя неожиданные ситуации, такие как приём посторонних управляющих сообщений). См. также [`sendmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.sendmsg).12301231```python1232import socket, array12331234def recv_fds(sock, msglen, maxfds):1235    fds = array.array("i")   # Массив целых чисел1236    msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))1237    for cmsg_level, cmsg_type, cmsg_data in ancdata:1238        if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:1239            # Добавить данные, игнорируя любые усечённые целые числа в конце.1240            fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])1241    return msg, list(fds)1242```12431244[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix.12451246Большинство Unix-платформ.12471248Добавлено в версии 3.3.12491250Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.15/library/socket.html) с обоснованием).12511252#### `recvmsg_into(buffers[, ancbufsize[, flags]])`12531254Принимает обычные и вспомогательные данные из сокета, действуя как [`recvmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recvmsg), но разбрасывает невспомогательные данные по нескольким буферам вместо возврата нового объекта bytes. Аргумент *buffers* должен быть итерируемым объектом, содержащим объекты, предоставляющие буферы для записи (например, объекты [`bytearray`](https://python-all.ru/3.15/library/stdtypes.html#bytearray)); они будут заполняться последовательными фрагментами невспомогательных данных, пока все данные не будут записаны или буферы не закончатся. Операционная система может установить ограничение (значение [`sysconf()`](https://python-all.ru/3.15/library/os.html#os.sysconf) `SC_IOV_MAX`) на количество используемых буферов. Аргументы *ancbufsize* и *flags* имеют тот же смысл, что и для `recvmsg()`.12551256Возвращаемое значение – кортеж из 4 элементов: `(nbytes, ancdata, msg_flags, address)`, где *nbytes* – общее количество байт невспомогательных данных, записанных в буферы, а *ancdata*, *msg\_flags* и *address* такие же, как для [`recvmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recvmsg).12571258Пример:12591260```python1261>>> import socket1262>>> s1, s2 = socket.socketpair()1263>>> b1 = bytearray(b'----')1264>>> b2 = bytearray(b'0123456789')1265>>> b3 = bytearray(b'--------------')1266>>> s1.send(b'Mary had a little lamb')1267221268>>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])1269(22, [], 0, None)1270>>> [b1, b2, b3]1271[bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]1272```12731274[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix.12751276Большинство Unix-платформ.12771278Добавлено в версии 3.3.12791280#### `recvfrom_into(buffer[, nbytes[, flags]])`12811282Принимает данные из сокета, записывая их в *buffer* вместо создания новой строки байтов. Возвращаемое значение – пара `(nbytes, address)`, где *nbytes* – количество принятых байт, а *address* – адрес сокета, отправившего данные. Смысл необязательного аргумента *flags* описан в справочной странице Unix *[recv(2)](https://python-all.ru/3.15/library/socket.html)*; по умолчанию равен нулю. Формат *address* зависит от семейства адресов – см. [Семейства сокетов](https://python-all.ru/3.15/library/socket.html#socket-addresses).12831284#### `recv_into(buffer[, nbytes[, flags]])`12851286Принимает до *nbytes* байт из сокета, сохраняя данные в буфер вместо создания новой строки байтов. Если *nbytes* не указан (или равен 0), принимает до размера доступного места в указанном буфере. Возвращает количество принятых байт. Смысл необязательного аргумента *flags* описан в справочной странице Unix *[recv(2)](https://python-all.ru/3.15/library/socket.html)*; по умолчанию равен нулю.12871288#### `send(bytes[, flags])`12891290Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент *flags* имеет тот же смысл, что и для [`recv()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recv). Возвращает количество отправленных байт. Приложения должны следить за тем, чтобы все данные были отправлены; если передана только часть данных, приложение должно попытаться доставить оставшиеся. Дополнительную информацию по этой теме см. в [Руководстве по программированию сокетов (Socket Programming HOWTO)](https://python-all.ru/3.15/howto/sockets.html#socket-howto).12911292Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.15/library/socket.html) с обоснованием).12931294#### `sendall(bytes[, flags])`12951296Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент *flags* имеет тот же смысл, что и для [`recv()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recv). В отличие от [`send()`](https://python-all.ru/3.15/library/socket.html#socket.socket.send), этот метод продолжает отправлять данные из *bytes*, пока не будут отправлены все данные или не возникнет ошибка. При успешном завершении возвращается `None`. При ошибке вызывается исключение, и нет способа определить, сколько данных (если вообще было отправлено) было успешно отправлено.12971298Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается при каждой успешной отправке данных. Теперь тайм-аут сокета – это максимальная общая продолжительность отправки всех данных.12991300Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.15/library/socket.html) с обоснованием).13011302#### `sendto(bytes, address)`13031304#### `sendto(bytes, flags, address)`13051306Отправляет данные в сокет. Сокет не должен быть подключён к удалённому сокету, так как целевой сокет задаётся *address*. Необязательный аргумент *flags* имеет то же значение, что и для [`recv()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recv). Возвращает количество отправленных байтов. Формат *address* зависит от семейства адресов – см. [Семейства сокетов](https://python-all.ru/3.15/library/socket.html#socket-addresses).13071308Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.sendto` с аргументами `self`, `address`.13091310Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.15/library/socket.html) с обоснованием).13111312#### `sendmsg(buffers[, ancdata[, flags[, address]]])`13131314Отправляет обычные и вспомогательные данные в сокет, собирая невспомогательные данные из серии буферов и объединяя их в одно сообщение. Аргумент *buffers* задаёт невспомогательные данные как итерируемый объект из [bytes-подобных объектов](https://python-all.ru/3.15/glossary.html#term-bytes-like-object) (например, объекты [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes)); операционная система может установить ограничение (значение [`sysconf()`](https://python-all.ru/3.15/library/os.html#os.sysconf) `SC_IOV_MAX`) на количество буферов, которые можно использовать. Аргумент *ancdata* задаёт вспомогательные данные (управляющие сообщения) как итерируемый объект из нуля или более кортежей `(cmsg_level, cmsg_type, cmsg_data)`, где *cmsg\_level* и *cmsg\_type* – целые числа, определяющие уровень протокола и тип протокола соответственно, а *cmsg\_data* – bytes-подобный объект, содержащий соответствующие данные. Обратите внимание, что некоторые системы (в частности, системы без [`CMSG_SPACE()`](https://python-all.ru/3.15/library/socket.html#socket.CMSG_SPACE)) могут поддерживать отправку только одного управляющего сообщения за вызов. Аргумент *flags* по умолчанию равен 0 и имеет то же значение, что и для [`send()`](https://python-all.ru/3.15/library/socket.html#socket.socket.send). Если *address* указан и не равен `None`, он устанавливает адрес назначения для сообщения. Возвращаемое значение – количество отправленных байтов невспомогательных данных.13151316Следующая функция отправляет список файловых дескрипторов *fds* через сокет [`AF_UNIX`](https://python-all.ru/3.15/library/socket.html#socket.AF_UNIX) в системах, поддерживающих механизм `SCM_RIGHTS`. См. также [`recvmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recvmsg).13171318```python1319import socket, array13201321def send_fds(sock, msg, fds):1322    return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])1323```13241325[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Unix, не WASI.13261327Большинство Unix-платформ.13281329Возбуждает [событие аудита](https://python-all.ru/3.15/library/sys.html#auditing) `socket.sendmsg` с аргументами `self`, `address`.13301331Добавлено в версии 3.3.13321333Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.15/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.15/library/socket.html) с обоснованием).13341335#### `sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])`13361337Специализированная версия [`sendmsg()`](https://python-all.ru/3.15/library/socket.html#socket.socket.sendmsg) для сокета [`AF_ALG`](https://python-all.ru/3.15/library/socket.html#socket.AF_ALG). Устанавливает режим, IV, длину связанных данных AEAD и флаги для сокета `AF_ALG`.13381339[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Linux \>= 2.6.38.13401341Добавлено в версии 3.6.13421343#### `sendfile(file, offset=0, count=None)`13441345Отправляет файл до достижения EOF, используя высокопроизводительный [`os.sendfile`](https://python-all.ru/3.15/library/os.html#os.sendfile), и возвращает общее количество отправленных байтов. *file* должен быть обычным файловым объектом, открытым в двоичном режиме. Если `os.sendfile` недоступен (например, в Windows) или *file* не является обычным файлом, вместо него будет использован [`send()`](https://python-all.ru/3.15/library/socket.html#socket.socket.send). *offset* указывает, откуда начинать чтение файла. Если указан, *count* – это общее количество байтов для передачи, в отличие от отправки файла до EOF. Позиция файла обновляется при возврате, а также в случае ошибки, и тогда [`file.tell()`](https://python-all.ru/3.15/library/io.html#io.IOBase.tell) можно использовать для определения количества отправленных байтов. Сокет должен быть типа [`SOCK_STREAM`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_STREAM). Неблокирующие сокеты не поддерживаются.13461347Добавлено в версии 3.5.13481349#### `set_inheritable(inheritable)`13501351Устанавливает [флаг наследования](https://python-all.ru/3.15/library/os.html#fd-inheritance) файлового дескриптора сокета или дескриптора сокета.13521353Добавлено в версии 3.4.13541355#### `setblocking(flag)`13561357Устанавливает блокирующий или неблокирующий режим сокета: если *flag* равен false, сокет переводится в неблокирующий режим, иначе в блокирующий.13581359Этот метод является сокращённой записью для определённых вызовов [`settimeout()`](https://python-all.ru/3.15/library/socket.html#socket.socket.settimeout):13601361- `sock.setblocking(True)` эквивалентен `sock.settimeout(None)`1362- `sock.setblocking(False)` эквивалентен `sock.settimeout(0.0)`13631364Изменено в версии 3.7: Метод больше не применяет флаг [`SOCK_NONBLOCK`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_NONBLOCK) на [`socket.type`](https://python-all.ru/3.15/library/socket.html#socket.socket.type).13651366#### `settimeout(value)`13671368Устанавливает тайм-аут для блокирующих операций с сокетом. Аргумент *value* может быть неотрицательным вещественным числом, выражающим секунды, или `None`. Если задано ненулевое значение, последующие операции с сокетом вызовут исключение [`timeout`](https://python-all.ru/3.15/library/socket.html#socket.timeout), если период тайм-аута *value* истёк до завершения операции. Если задан ноль, сокет переводится в неблокирующий режим. Если задан `None`, сокет переводится в блокирующий режим.13691370Для получения дополнительной информации обратитесь к [заметкам о тайм-аутах сокетов](https://python-all.ru/3.15/library/socket.html#socket-timeouts).13711372Изменено в версии 3.7: Метод больше не переключает флаг [`SOCK_NONBLOCK`](https://python-all.ru/3.15/library/socket.html#socket.SOCK_NONBLOCK) на [`socket.type`](https://python-all.ru/3.15/library/socket.html#socket.socket.type).13731374Изменено в версии 3.15: принимает любое вещественное число, не только целое или float.13751376#### `setsockopt(level, optname, value: int | Buffer)`13771378#### `setsockopt(level, optname, None, optlen: int)`13791380Устанавливает значение указанной опции сокета (см. страницу руководства Unix *[setsockopt(2)](https://python-all.ru/3.15/library/socket.html)*). Необходимые символические константы определены в этом модуле (SO\_\* и т.д. \<socket-unix-constants\>). Значение может быть целым числом, `None` или [bytes-подобным объектом](https://python-all.ru/3.15/glossary.html#term-bytes-like-object), представляющим буфер. В последнем случае вызывающий должен обеспечить, чтобы байтовая строка содержала правильные биты (см. опциональный встроенный модуль [`struct`](https://python-all.ru/3.15/library/struct.html#module-struct) для способа кодирования структур C в виде байтовых строк). Когда *value* установлен в `None`, требуется аргумент *optlen*. Это эквивалентно вызову C-функции `setsockopt()` с `optval=NULL` и `optlen=optlen`.13811382Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.15/glossary.html#term-bytes-like-object).13831384Изменено в версии 3.6: Добавлена форма setsockopt(level, optname, None, optlen: int).13851386[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.13871388#### `shutdown(how)`13891390Завершает одну или обе половины соединения. Если *how* равен [`SHUT_RD`](https://python-all.ru/3.15/library/socket.html#socket.SHUT_RD), дальнейшие приёмы запрещены. Если *how* равен [`SHUT_WR`](https://python-all.ru/3.15/library/socket.html#socket.SHUT_WR), дальнейшие отправки запрещены. Если *how* равен [`SHUT_RDWR`](https://python-all.ru/3.15/library/socket.html#socket.SHUT_RDWR), дальнейшие отправки и приёмы запрещены.13911392[Доступность](https://python-all.ru/3.15/library/intro.html#availability): не WASI.13931394#### `share(process_id)`13951396Дублирует сокет и подготавливает его для совместного использования с целевым процессом. Целевому процессу должен быть предоставлен идентификатор *process\_id*. Полученный bytes-объект затем может быть передан целевому процессу с помощью какой-либо формы межпроцессного взаимодействия, и сокет может быть воссоздан там с помощью [`fromshare()`](https://python-all.ru/3.15/library/socket.html#socket.fromshare). После вызова этого метода сокет можно безопасно закрыть, так как операционная система уже продублировала его для целевого процесса.13971398[Доступность](https://python-all.ru/3.15/library/intro.html#availability): Windows.13991400Добавлено в версии 3.3.14011402Обратите внимание, что методы `read()` и `write()` отсутствуют; вместо них используйте [`recv()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recv) и [`send()`](https://python-all.ru/3.15/library/socket.html#socket.socket.send) без аргумента *flags*.14031404Объекты сокетов также имеют следующие (только для чтения) атрибуты, соответствующие значениям, переданным конструктору `socket`.14051406#### `family`14071408Семейство сокета.14091410#### `type`14111412Тип сокета.14131414#### `proto`14151416Протокол сокета.14171418#### `class socket.SocketType`14191420Базовый класс типа [`socket`](https://python-all.ru/3.15/library/socket.html#socket.socket), реэкспортируемый из `_socket`. Проверка экземпляра, например `isinstance(socket(...), SocketType)`, вернет True, но `SocketType` – это не то же самое, что `type(socket(...))`, который является самим `socket`.14211422## Примечания о тайм-аутах сокетов14231424Объект сокета может находиться в одном из трех режимов: блокирующем, неблокирующем или режиме тайм-аута. По умолчанию сокеты всегда создаются в блокирующем режиме, но это можно изменить, вызвав [`setdefaulttimeout()`](https://python-all.ru/3.15/library/socket.html#socket.setdefaulttimeout).14251426- В *блокирующем режиме* операции блокируются до завершения или пока система не вернет ошибку (например, истекло время соединения).1427- В *неблокирующем режиме* операции завершаются ошибкой (к сожалению, зависящей от системы), если их нельзя выполнить немедленно: функции из модуля [`select`](https://python-all.ru/3.15/library/select.html#module-select) можно использовать, чтобы узнать, когда и готов ли сокет для чтения или записи.1428- В *режиме тайм-аута* операции завершаются ошибкой, если их нельзя выполнить в течение заданного для сокета тайм-аута (возникает исключение [`timeout`](https://python-all.ru/3.15/library/socket.html#socket.timeout)) или если система возвращает ошибку.14291430> **Примечание**1431>1432> На уровне операционной системы сокеты в *режиме тайм-аута* внутренне устанавливаются в неблокирующий режим. Кроме того, блокирующий режим и режим тайм-аута разделяются между файловыми дескрипторами и объектами сокетов, относящимися к одной сетевой конечной точке. Эта деталь реализации может иметь заметные последствия, если, например, вы решите использовать [`fileno()`](https://python-all.ru/3.15/library/socket.html#socket.socket.fileno) сокета.14331434### Тайм-ауты и метод `connect`14351436Операция [`connect()`](https://python-all.ru/3.15/library/socket.html#socket.socket.connect) также подчиняется настройке тайм-аута, и в целом рекомендуется вызывать [`settimeout()`](https://python-all.ru/3.15/library/socket.html#socket.socket.settimeout) перед вызовом `connect()` или передавать параметр тайм-аута в [`create_connection()`](https://python-all.ru/3.15/library/socket.html#socket.create_connection). Однако сетевая подсистема системы также может вернуть собственную ошибку тайм-аута соединения независимо от любых настроек тайм-аута сокета Python.14371438### Тайм-ауты и метод `accept`14391440Если [`getdefaulttimeout()`](https://python-all.ru/3.15/library/socket.html#socket.getdefaulttimeout) не равно [`None`](https://python-all.ru/3.15/library/constants.html#None), сокеты, возвращаемые методом [`accept()`](https://python-all.ru/3.15/library/socket.html#socket.socket.accept), наследуют этот тайм-аут. В противном случае поведение зависит от настроек слушающего сокета:14411442- если слушающий сокет находится в *блокирующем режиме* или в *режиме тайм-аута*, то сокет, возвращаемый [`accept()`](https://python-all.ru/3.15/library/socket.html#socket.socket.accept), находится в *блокирующем режиме*;1443- если слушающий сокет находится в *неблокирующем режиме*, то будет ли сокет, возвращаемый [`accept()`](https://python-all.ru/3.15/library/socket.html#socket.socket.accept), в блокирующем или неблокирующем режиме, зависит от операционной системы. Если вы хотите обеспечить кроссплатформенное поведение, рекомендуется вручную переопределить этот параметр.14441445## Пример14461447Вот четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который отправляет обратно все полученные данные (обслуживая только одного клиента), и использующий его клиент. Обратите внимание, что сервер должен выполнить последовательность [`socket()`](https://python-all.ru/3.15/library/socket.html#socket.socket), [`bind()`](https://python-all.ru/3.15/library/socket.html#socket.socket.bind), [`listen()`](https://python-all.ru/3.15/library/socket.html#socket.socket.listen), [`accept()`](https://python-all.ru/3.15/library/socket.html#socket.socket.accept) (возможно, повторяя `accept()` для обслуживания более одного клиента), в то время как клиенту нужна только последовательность `socket()`, [`connect()`](https://python-all.ru/3.15/library/socket.html#socket.socket.connect). Также обратите внимание, что сервер не вызывает [`sendall()`](https://python-all.ru/3.15/library/socket.html#socket.socket.sendall)/[`recv()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recv) на сокете, который слушает, а на новом сокете, возвращённом `accept()`.14481449Первые два примера поддерживают только IPv4.14501451```python1452# Программа эхо-сервера1453import socket14541455HOST = ''                 # Символическое имя, обозначающее все доступные интерфейсы1456PORT = 50007              # Произвольный непривилегированный порт1457with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:1458    s.bind((HOST, PORT))1459    s.listen(1)1460    conn, addr = s.accept()1461    with conn:1462        print('Connected by', addr)1463        while True:1464            data = conn.recv(1024)1465            if not data: break1466            conn.sendall(data)1467```14681469```python1470# Программа эхо-клиента1471import socket14721473HOST = 'daring.cwi.nl'    # Удалённый хост1474PORT = 50007              # Тот же порт, что и у сервера1475with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:1476    s.connect((HOST, PORT))1477    s.sendall(b'Hello, world')1478    data = s.recv(1024)1479print('Received', repr(data))1480```14811482Следующие два примера идентичны двум предыдущим, но поддерживают как IPv4, так и IPv6. Серверная сторона будет слушать первое доступное семейство адресов (вместо этого следует слушать оба). В большинстве систем, поддерживающих IPv6, IPv6 будет иметь приоритет, и сервер может не принимать IPv4-трафик. Клиентская сторона попытается подключиться ко всем адресам, возвращённым в результате разрешения имён, и отправляет трафик на первый успешно подключённый.14831484```python1485# Программа эхо-сервера1486import socket1487import sys14881489HOST = None               # Символическое имя, обозначающее все доступные интерфейсы1490PORT = 50007              # Произвольный непривилегированный порт1491s = None1492for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,1493                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):1494    af, socktype, proto, canonname, sa = res1495    try:1496        s = socket.socket(af, socktype, proto)1497    except OSError as msg:1498        s = None1499        continue1500    try:1501        s.bind(sa)1502        s.listen(1)1503    except OSError as msg:1504        s.close()1505        s = None1506        continue1507    break1508if s is None:1509    print('could not open socket')1510    sys.exit(1)1511conn, addr = s.accept()1512with conn:1513    print('Connected by', addr)1514    while True:1515        data = conn.recv(1024)1516        if not data: break1517        conn.send(data)1518```15191520```python1521# Программа эхо-клиента1522import socket1523import sys15241525HOST = 'daring.cwi.nl'    # Удалённый хост1526PORT = 50007              # Тот же порт, что и у сервера1527s = None1528for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):1529    af, socktype, proto, canonname, sa = res1530    try:1531        s = socket.socket(af, socktype, proto)1532    except OSError as msg:1533        s = None1534        continue1535    try:1536        s.connect(sa)1537    except OSError as msg:1538        s.close()1539        s = None1540        continue1541    break1542if s is None:1543    print('could not open socket')1544    sys.exit(1)1545with s:1546    s.sendall(b'Hello, world')1547    data = s.recv(1024)1548print('Received', repr(data))1549```15501551Следующий пример показывает, как написать очень простой снифер сети с помощью сырых сокетов в Windows. Для изменения интерфейса пример требует прав администратора:15521553```python1554import socket15551556# общедоступный сетевой интерфейс1557HOST = socket.gethostbyname(socket.gethostname())15581559# создать сырой сокет и привязать его к общедоступному интерфейсу1560s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)1561s.bind((HOST, 0))15621563# Включать IP-заголовки1564s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)15651566# принимать все пакеты1567s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)15681569# принять пакет1570print(s.recvfrom(65565))15711572# неразборчивый режим отключён1573s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)1574```15751576Следующий пример показывает, как использовать интерфейс сокетов для связи с сетью CAN по протоколу сырых сокетов. Чтобы вместо этого использовать CAN с протоколом broadcast manager, откройте сокет с помощью:15771578```python1579socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)1580```15811582После привязки (`CAN_RAW`) или подключения ([`CAN_BCM`](https://python-all.ru/3.15/library/socket.html#socket.CAN_BCM)) сокета вы можете использовать операции [`socket.send()`](https://python-all.ru/3.15/library/socket.html#socket.socket.send) и [`socket.recv()`](https://python-all.ru/3.15/library/socket.html#socket.socket.recv) (и их аналоги) с объектом сокета как обычно.15831584Этот последний пример может требовать особых привилегий:15851586```python1587import socket1588import struct15891590# Упаковка/распаковка CAN-фреймов (см. 'struct can_frame' в <linux/can.h>)15911592can_frame_fmt = "=IB3x8s"1593can_frame_size = struct.calcsize(can_frame_fmt)15941595def build_can_frame(can_id, data):1596    can_dlc = len(data)1597    data = data.ljust(8, b'\x00')1598    return struct.pack(can_frame_fmt, can_id, can_dlc, data)15991600def dissect_can_frame(frame):1601    can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)1602    return (can_id, can_dlc, data[:can_dlc])16031604# создать сырой сокет и привязать его к интерфейсу 'vcan0'1605s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)1606s.bind(('vcan0',))16071608while True:1609    cf, addr = s.recvfrom(can_frame_size)16101611    print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))16121613    try:1614        s.send(cf)1615    except OSError:1616        print('Error sending CAN frame')16171618    try:1619        s.send(build_can_frame(0x01, b'\x01\x02\x03'))1620    except OSError:1621        print('Error sending CAN frame')1622```16231624Запуск примера несколько раз со слишком маленькой задержкой между выполнениями может привести к этой ошибке:16251626```python1627OSError: [Errno 98] Address already in use1628```16291630Это связано с тем, что предыдущее выполнение оставило сокет в состоянии `TIME_WAIT`, и его нельзя сразу использовать повторно.16311632Существует флаг `socket`, который можно установить, чтобы предотвратить это, `socket.SO_REUSEADDR`:16331634```python1635s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)1636s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)1637s.bind((HOST, PORT))1638```16391640Флаг `SO_REUSEADDR` указывает ядру переиспользовать локальный сокет в состоянии `TIME_WAIT`, не дожидаясь истечения его естественного тайм-аута.16411642> **См. также**1643>1644> Для ознакомления с программированием сокетов (на C) см. следующие статьи:1645>1646> - *Вводное руководство по межпроцессному взаимодействию в 4.3BSD*, Стюарт Сечрест1647> - *Продвинутое руководство по межпроцессному взаимодействию в 4.3BSD*, Сэмюэл Дж. Леффлер и др.1648>1649> Оба находятся в UNIX Programmer’s Manual, Supplementary Documents 1 (разделы PS1:7 и PS1:8). Справочные материалы по сокетным системным вызовам для конкретных платформ также являются ценным источником информации о деталях семантики сокетов. Для Unix обращайтесь к страницам руководства; для Windows – к спецификации WinSock (или Winsock 2). Для API с поддержкой IPv6 читателю может быть полезно обратиться к [**RFC 3493**](https://python-all.ru/3.15/library/socket.html) под названием Basic Socket Interface Extensions for IPv6.1650