Документация Python неофициальный перевод

socket.md

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

1> **Источник:** https://python-all.ru/3.8/library/socket.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`socket`](https://python-all.ru/3.8/library/socket.html#module-socket) – низкоуровневый сетевой интерфейс89**Исходный код:** [Lib/socket.py](https://python-all.ru/src/3.8/Lib/socket.py)1011---1213Этот модуль предоставляет доступ к интерфейсу *сокетов* BSD. Он доступен во всех современных системах Unix, Windows, MacOS и, возможно, на других платформах.1415> **Примечание**16>17> Некоторые аспекты поведения могут зависеть от платформы, поскольку вызовы выполняются через API сокетов операционной системы.1819Интерфейс Python представляет собой прямую трансляцию системных вызовов Unix и библиотечного интерфейса сокетов в объектно-ориентированный стиль Python: функция [`socket()`](https://python-all.ru/3.8/library/socket.html#socket.socket) возвращает *объект сокета*, методы которого реализуют различные системные вызовы сокетов. Типы параметров несколько более высокоуровневые, чем в интерфейсе C: как и при операциях `read()` и `write()` с файлами Python, выделение буфера при операциях приёма происходит автоматически, а длина буфера неявно задаётся при отправке.2021> **См. также**22>23> **Модуль [`socketserver`](https://python-all.ru/3.8/library/socketserver.html#module-socketserver)**24>25> Классы, упрощающие написание сетевых серверов.26>27> **Модуль [`ssl`](https://python-all.ru/3.8/library/ssl.html#module-ssl)**28>29> Обёртка TLS/SSL для объектов сокетов.3031## Семейства сокетов3233В зависимости от системы и параметров сборки этим модулем поддерживаются различные семейства сокетов.3435Формат адреса, требуемый для конкретного объекта сокета, автоматически выбирается на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представляются следующим образом:3637- Адрес сокета [`AF_UNIX`](https://python-all.ru/3.8/library/socket.html#socket.AF_UNIX), привязанного к узлу файловой системы, представляется в виде строки с использованием кодировки файловой системы и обработчика ошибок `'surrogateescape'` (см. [**PEP 383**](https://python-all.ru/3.8/library/socket.html)). Адрес в абстрактном пространстве имён Linux возвращается как [байтоподобный объект](https://python-all.ru/3.8/glossary.html#term-bytes-like-object) с начальным нулевым байтом; обратите внимание, что сокеты в этом пространстве имён могут взаимодействовать с обычными файловыми сокетами, поэтому программы, предназначенные для работы в Linux, возможно, должны работать с обоими типами адресов. Строка или байтоподобный объект могут использоваться для любого из этих типов адресов при передаче в качестве аргумента.3839  Изменено в версии 3.3: Ранее предполагалось, что пути сокетов [`AF_UNIX`](https://python-all.ru/3.8/library/socket.html#socket.AF_UNIX) используют кодировку UTF-8.4041  Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.8/glossary.html#term-bytes-like-object).4243- Пара `(host, port)` используется для семейства адресов [`AF_INET`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET), где *host* – строка, представляющая либо имя узла в нотации интернет-домена например `'daring.cwi.nl'`, либо IPv4-адрес, например `'100.50.200.5'`, а *port* – целое число.4445  - Для IPv4-адресов вместо адреса хоста принимаются две специальные формы: `''` представляет `INADDR_ANY`, что используется для привязки ко всем интерфейсам, а строка `'<broadcast>'` представляет `INADDR_BROADCAST`. Такое поведение несовместимо с IPv6, поэтому, возможно, следует избегать их, если предполагается поддержка IPv6 в программах на Python.46- Для семейства адресов [`AF_INET6`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET6) используется четырёхэлементный кортеж `(host, port, flowinfo, scopeid)`, где *flowinfo* и *scopeid* представляют члены `sin6_flowinfo` и `sin6_scope_id` в `struct sockaddr_in6` в C. Для методов модуля [`socket`](https://python-all.ru/3.8/library/socket.html#module-socket) *flowinfo* и *scopeid* можно опускать только для обратной совместимости. Однако учтите, что опускание *scopeid* может вызвать проблемы при работе с scoped IPv6-адресами.4748  Изменено в версии 3.7: Для многоадресных адресов (когда *scopeid* содержит значимое значение) *address* может не содержать часть `%scope` (или `zone id`). Эта информация излишня и может быть безопасно опущена (рекомендуется).49- Сокеты `AF_NETLINK` представляются в виде пар `(pid, groups)`.50- Поддержка TIPC только в Linux доступна через семейство адресов `AF_TIPC`. TIPC – это открытый сетевой протокол, не основанный на IP, предназначенный для использования в кластерных средах. Адреса представляются кортежем, и поля зависят от типа адреса. Общий вид кортежа: `(addr_type, v1, v2, v3 [, scope])`, где:5152  - *addr\_type* – одно из значений `TIPC_ADDR_NAMESEQ`, `TIPC_ADDR_NAME` или `TIPC_ADDR_ID`.53  - *scope* – одно из значений `TIPC_ZONE_SCOPE`, `TIPC_CLUSTER_SCOPE` и `TIPC_NODE_SCOPE`.54  - Если *addr\_type* равно `TIPC_ADDR_NAME`, то *v1* – тип сервера, *v2* – идентификатор порта, а *v3* должно быть 0.5556    Если *addr\_type* равно `TIPC_ADDR_NAMESEQ`, то *v1* – тип сервера, *v2* – нижний номер порта, а *v3* – верхний номер порта.5758    Если *addr\_type* равно `TIPC_ADDR_ID`, то *v1* – узел, *v2* – ссылка, а *v3* должно быть установлено в 0.59- Кортеж `(interface, )` используется для семейства адресов [`AF_CAN`](https://python-all.ru/3.8/library/socket.html#socket.AF_CAN), где *interface* – строка, представляющая имя сетевого интерфейса, например `'can0'`. Имя сетевого интерфейса `''` может использоваться для приёма пакетов от всех сетевых интерфейсов данного семейства.6061  - [`CAN_ISOTP`](https://python-all.ru/3.8/library/socket.html#socket.CAN_ISOTP) протокол требует кортеж `(interface, rx_addr, tx_addr)` где оба дополнительных параметра представляют собой беззнаковое длинное целое, задающее идентификатор CAN (стандартный или расширенный).62- Строка или кортеж `(id, unit)` используется для протокола `SYSPROTO_CONTROL` семейства `PF_SYSTEM`. Строка – это имя управления ядра с динамически назначаемым ID. Кортеж можно использовать, если ID и номер модуля управления ядра известны или используется зарегистрированный ID.6364  Новое в версии 3.3.65- `AF_BLUETOOTH` поддерживает следующие протоколы и форматы адресов:6667  - `BTPROTO_L2CAP` принимает `(bdaddr, psm)`, где `bdaddr` – адрес Bluetooth в виде строки, а `psm` – целое число.68  - `BTPROTO_RFCOMM` принимает `(bdaddr, channel)`, где `bdaddr` – это Bluetooth-адрес в виде строки, а `channel` – целое число.69  - `BTPROTO_HCI` принимает `(device_id,)`, где `device_id` – это либо целое число, либо строка с Bluetooth-адресом интерфейса. (Зависит от ОС: NetBSD и DragonFlyBSD ожидают Bluetooth-адрес, все остальные – целое число.)7071    Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.72  - `BTPROTO_SCO` принимает `bdaddr`, где `bdaddr` – это объект [`bytes`](https://python-all.ru/3.8/library/stdtypes.html#bytes), содержащий Bluetooth-адрес в строковом формате (например, `b'12:23:34:45:56:67'`). Этот протокол не поддерживается в FreeBSD.73- [`AF_ALG`](https://python-all.ru/3.8/library/socket.html#socket.AF_ALG) – это интерфейс на основе сокетов, доступный только в Linux, для работы с криптографией ядра. Сокет алгоритма настраивается кортежем из двух-четырёх элементов `(type, name [, feat [, mask]])`, где:7475  - *type* – тип алгоритма в виде строки, напр. `aead`, `hash`, `skcipher` или `rng`.76  - *name* – имя алгоритма и режим работы в виде строки, напр. `sha256`, `hmac(sha256)`, `cbc(aes)` или `drbg_nopr_ctr_aes256`.77  - *feat* и *mask* – это 32-битные целые числа без знака.7879  [Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux 2.6.38, для некоторых типов алгоритмов требуются более новые ядра.8081  Новое в версии 3.6.82- [`AF_VSOCK`](https://python-all.ru/3.8/library/socket.html#socket.AF_VSOCK) обеспечивает взаимодействие между виртуальными машинами и их хостами. Сокеты представлены кортежем `(CID, port)`, где идентификатор контекста (CID) и порт – целые числа.8384  [Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 4.8, QEMU \>= 2.8, ESX \>= 4.0, ESX Workstation \>= 6.5.8586  Добавлено в версии 3.7.87- [`AF_PACKET`](https://python-all.ru/3.8/library/socket.html#socket.AF_PACKET) представляет собой низкоуровневый интерфейс для прямого доступа к сетевым устройствам. Пакеты представлены кортежем `(ifname, proto[, pkttype[, hatype[, addr]]])`, где:8889  - *ifname* – строка, задающая имя устройства.90  - *proto* – целое число в порядке байт сети, указывающее номер протокола Ethernet.91  - *pkttype* – необязательное целое число, задающее тип пакета:9293    - `PACKET_HOST` (по умолчанию) – пакет, адресованный локальному хосту.94    - `PACKET_BROADCAST` – широковещательный пакет физического уровня.95    - `PACKET_MULTIHOST` – пакет, отправленный на многоадресный адрес физического уровня.96    - `PACKET_OTHERHOST` – пакет, предназначенный другому хосту, но перехваченный драйвером устройства в неразборчивом режиме (promiscuous).97    - `PACKET_OUTGOING` – пакет, отправленный с локального хоста и возвращённый обратно на пакетный сокет.98  - *hatype* – необязательное целое число, задающее тип аппаратного адреса ARP.99  - *addr* – необязательный байтоподобный объект, задающий аппаратный физический адрес; его интерпретация зависит от устройства.100- [`AF_QIPCRTR`](https://python-all.ru/3.8/library/socket.html#socket.AF_QIPCRTR) – это интерфейс на основе сокетов, доступный только в Linux, для связи с сервисами, работающими на сопроцессорах в платформах Qualcomm. Семейство адресов представляется в виде кортежа `(node, port)`, где *узел* и *порт* являются неотрицательными целыми числами.101102  Новое в версии 3.8.103104Если в части *узел* адреса сокета IPv4/v6 указано имя узла, программа может демонстрировать недетерминированное поведение, так как Python использует первый адрес, возвращённый при разрешении DNS. Адрес сокета будет разрешаться по-разному в фактический IPv4/v6-адрес в зависимости от результатов разрешения DNS и/или конфигурации узла. Для детерминированного поведения используйте числовой адрес в части *узел*.105106Все ошибки порождают исключения. Могут возникать обычные исключения для неверных типов аргументов и нехватки памяти; начиная с Python 3.3, ошибки, связанные с семантикой сокетов или адресов, порождают [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError) или один из его подклассов (раньше они порождали [`socket.error`](https://python-all.ru/3.8/library/socket.html#socket.error)).107108Неблокирующий режим поддерживается через [`setblocking()`](https://python-all.ru/3.8/library/socket.html#socket.socket.setblocking). Его обобщение на основе тайм-аутов поддерживается через [`settimeout()`](https://python-all.ru/3.8/library/socket.html#socket.socket.settimeout).109110## Содержимое модуля111112Модуль [`socket`](https://python-all.ru/3.8/library/socket.html#module-socket) экспортирует следующие элементы.113114### Исключения115116#### `exception socket.error`117118Устаревший псевдоним [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError).119120Изменено в версии 3.3: В соответствии с [**PEP 3151**](https://python-all.ru/3.8/library/socket.html) этот класс стал псевдонимом [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError).121122#### `exception socket.herror`123124Подкласс [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError), это исключение возникает при ошибках, связанных с адресами, т.е. для функций, использующих *h\_errno* в POSIX C API, включая [`gethostbyname_ex()`](https://python-all.ru/3.8/library/socket.html#socket.gethostbyname_ex) и [`gethostbyaddr()`](https://python-all.ru/3.8/library/socket.html#socket.gethostbyaddr). Сопутствующее значение – пара `(h_errno, string)`, представляющая ошибку, возвращённую библиотечным вызовом. *h\_errno* – числовое значение, а *строка* представляет описание *h\_errno*, возвращаемое функцией языка C `hstrerror()`.125126Изменено в версии 3.3: Этот класс стал подклассом [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError).127128#### `exception socket.gaierror`129130Подкласс [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError), это исключение возникает при ошибках, связанных с адресами, функциями [`getaddrinfo()`](https://python-all.ru/3.8/library/socket.html#socket.getaddrinfo) и [`getnameinfo()`](https://python-all.ru/3.8/library/socket.html#socket.getnameinfo). Сопутствующее значение – пара `(error, string)`, представляющая ошибку, возвращённую библиотечным вызовом. *строка* представляет описание *error*, возвращаемое функцией языка C `gai_strerror()`. Числовое значение *error* будет соответствовать одной из констант `EAI_*`, определённых в этом модуле.131132Изменено в версии 3.3: Этот класс стал подклассом [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError).133134#### `exception socket.timeout`135136Подкласс [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError), это исключение возникает при возникновении тайм-аута на сокете, для которого тайм-ауты были включены с помощью предыдущего вызова [`settimeout()`](https://python-all.ru/3.8/library/socket.html#socket.socket.settimeout) (или неявно через [`setdefaulttimeout()`](https://python-all.ru/3.8/library/socket.html#socket.setdefaulttimeout)). Сопутствующее значение – строка, которая в настоящее время всегда равна «timed out».137138Изменено в версии 3.3: Этот класс стал подклассом [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError).139140### Константы141142> Константы AF\_\* и SOCK\_\* теперь являются `AddressFamily` и `SocketKind` [`IntEnum`](https://python-all.ru/3.8/library/enum.html#enum.IntEnum) коллекциями.143>144> Новое в версии 3.4.145146#### `socket.AF_UNIX`147148#### `socket.AF_INET`149150#### `socket.AF_INET6`151152Эти константы представляют семейства адресов (и протоколов), используемые для первого аргумента [`socket()`](https://python-all.ru/3.8/library/socket.html#socket.socket). Если константа [`AF_UNIX`](https://python-all.ru/3.8/library/socket.html#socket.AF_UNIX) не определена, то данный протокол не поддерживается. В зависимости от системы могут быть доступны дополнительные константы.153154#### `socket.SOCK_STREAM`155156#### `socket.SOCK_DGRAM`157158#### `socket.SOCK_RAW`159160#### `socket.SOCK_RDM`161162#### `socket.SOCK_SEQPACKET`163164Эти константы представляют типы сокетов, которые используются для второго аргумента [`socket()`](https://python-all.ru/3.8/library/socket.html#socket.socket). В зависимости от системы могут быть доступны и другие константы. (Обычно полезны только [`SOCK_STREAM`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_STREAM) и [`SOCK_DGRAM`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_DGRAM).)165166#### `socket.SOCK_CLOEXEC`167168#### `socket.SOCK_NONBLOCK`169170Эти две константы, если они определены, можно комбинировать с типами сокетов, что позволяет устанавливать некоторые флаги атомарно (тем самым избегая возможных состояний гонки и необходимости отдельных вызовов).171172> **См. также**173>174> [Безопасная обработка файловых дескрипторов](https://python-all.ru/3.8/library/socket.html) для более подробного объяснения.175176[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 2.6.27.177178Новое в версии 3.2.179180#### `SO_*`181182#### `socket.SOMAXCONN`183184#### `MSG_*`185186#### `SOL_*`187188#### `SCM_*`189190#### `IPPROTO_*`191192#### `IPPORT_*`193194#### `INADDR_*`195196#### `IP_*`197198#### `IPV6_*`199200#### `EAI_*`201202#### `AI_*`203204#### `NI_*`205206#### `TCP_*`207208Многие константы этих форм, описанные в документации Unix по сокетам и/или протоколу IP, также определены в модуле socket. Они обычно используются в аргументах методов `setsockopt()` и `getsockopt()` объектов сокетов. В большинстве случаев определены только те символы, которые есть в заголовочных файлах Unix; для некоторых символов предоставлены значения по умолчанию.209210Изменено в версии 3.6: добавлены `SO_DOMAIN`, `SO_PROTOCOL`, `SO_PEERSEC`, `SO_PASSSEC`, `TCP_USER_TIMEOUT`, `TCP_CONGESTION`.211212Изменено в версии 3.6.5: В Windows `TCP_FASTOPEN`, `TCP_KEEPCNT` появляются, если среда выполнения Windows поддерживает.213214Изменено в версии 3.7: добавлен `TCP_NOTSENT_LOWAT`.215216В Windows `TCP_KEEPIDLE`, `TCP_KEEPINTVL` появляются, если среда выполнения Windows поддерживает.217218#### `socket.AF_CAN`219220#### `socket.PF_CAN`221222#### `SOL_CAN_*`223224#### `CAN_*`225226Множество констант такого вида, описанных в документации Linux, также определены в модуле socket.227228[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 2.6.25.229230Новое в версии 3.3.231232#### `socket.CAN_BCM`233234#### `CAN_BCM_*`235236CAN\_BCM в семействе протоколов CAN – это протокол broadcast manager (BCM). Константы broadcast manager, описанные в документации Linux, также определены в модуле socket.237238[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 2.6.25.239240> **Примечание**241>242> Флаг `CAN_BCM_CAN_FD_FRAME` доступен только на Linux \>= 4.8.243244Новое в версии 3.4.245246#### `socket.CAN_RAW_FD_FRAMES`247248Включает поддержку CAN FD в сокете CAN\_RAW. По умолчанию отключено. Позволяет приложению отправлять как обычные CAN-кадры, так и CAN FD-кадры; однако при чтении из сокета необходимо принимать оба типа кадров.249250Эта константа описана в документации Linux.251252[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 3.6.253254Новое в версии 3.5.255256#### `socket.CAN_ISOTP`257258CAN\_ISOTP в семействе протоколов CAN – это протокол ISO-TP (ISO 15765-2). Константы ISO-TP описаны в документации Linux.259260[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 2.6.25.261262Добавлено в версии 3.7.263264#### `socket.AF_PACKET`265266#### `socket.PF_PACKET`267268#### `PACKET_*`269270Множество констант такого вида, описанных в документации Linux, также определены в модуле socket.271272[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 2.2.273274#### `socket.AF_RDS`275276#### `socket.PF_RDS`277278#### `socket.SOL_RDS`279280#### `RDS_*`281282Множество констант такого вида, описанных в документации Linux, также определены в модуле socket.283284[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 2.6.30.285286Новое в версии 3.3.287288#### `socket.SIO_RCVALL`289290#### `socket.SIO_KEEPALIVE_VALS`291292#### `socket.SIO_LOOPBACK_FAST_PATH`293294#### `RCVALL_*`295296Константы для Windows’ WSAIoctl(). Эти константы используются в качестве аргументов метода [`ioctl()`](https://python-all.ru/3.8/library/socket.html#socket.socket.ioctl) объектов сокетов.297298Изменено в версии 3.6: добавлен `SIO_LOOPBACK_FAST_PATH`.299300#### `TIPC_*`301302Константы, связанные с TIPC, соответствующие тем, что экспортируются C API сокетов. Дополнительную информацию см. в документации TIPC.303304#### `socket.AF_ALG`305306#### `socket.SOL_ALG`307308#### `ALG_*`309310Константы для криптографии ядра Linux.311312[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 2.6.38.313314Новое в версии 3.6.315316#### `socket.AF_VSOCK`317318#### `socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID`319320#### `VMADDR*`321322#### `SO_VM*`323324Константы для взаимодействия между хостом и гостем в Linux.325326[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 4.8.327328Добавлено в версии 3.7.329330#### `socket.AF_LINK`331332[Доступность](https://python-all.ru/3.8/library/intro.html#availability): BSD, OSX.333334Новое в версии 3.4.335336#### `socket.has_ipv6`337338Эта константа содержит логическое значение, указывающее, поддерживается ли IPv6 на данной платформе.339340#### `socket.BDADDR_ANY`341342#### `socket.BDADDR_LOCAL`343344Это строковые константы, содержащие Bluetooth-адреса со специальным значением. Например, [`BDADDR_ANY`](https://python-all.ru/3.8/library/socket.html#socket.BDADDR_ANY) можно использовать для указания любого адреса при задании сокета привязки с помощью `BTPROTO_RFCOMM`.345346#### `socket.HCI_FILTER`347348#### `socket.HCI_TIME_STAMP`349350#### `socket.HCI_DATA_DIR`351352Для использования с `BTPROTO_HCI`. [`HCI_FILTER`](https://python-all.ru/3.8/library/socket.html#socket.HCI_FILTER) недоступен в NetBSD или DragonFlyBSD. [`HCI_TIME_STAMP`](https://python-all.ru/3.8/library/socket.html#socket.HCI_TIME_STAMP) и [`HCI_DATA_DIR`](https://python-all.ru/3.8/library/socket.html#socket.HCI_DATA_DIR) недоступны в FreeBSD, NetBSD или DragonFlyBSD.353354#### `socket.AF_QIPCRTR`355356Константа для протокола IPC-маршрутизатора Qualcomm, используемая для общения с удалёнными процессорами, предоставляющими сервисы.357358[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 4.7.359360### Функции361362#### Создание сокетов363364Все следующие функции создают [объекты сокетов](https://python-all.ru/3.8/library/socket.html#socket-objects).365366#### `socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)`367368Создаёт новый сокет, используя указанное семейство адресов, тип сокета и номер протокола. Семейство адресов должно быть [`AF_INET`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET) (по умолчанию), [`AF_INET6`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET6), [`AF_UNIX`](https://python-all.ru/3.8/library/socket.html#socket.AF_UNIX), [`AF_CAN`](https://python-all.ru/3.8/library/socket.html#socket.AF_CAN), [`AF_PACKET`](https://python-all.ru/3.8/library/socket.html#socket.AF_PACKET) или [`AF_RDS`](https://python-all.ru/3.8/library/socket.html#socket.AF_RDS). Тип сокета должен быть [`SOCK_STREAM`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_STREAM) (по умолчанию), [`SOCK_DGRAM`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_DGRAM), [`SOCK_RAW`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_RAW) или, возможно, одной из других констант `SOCK_`. Номер протокола обычно равен нулю и может быть опущен; в случае, если семейство адресов – [`AF_CAN`](https://python-all.ru/3.8/library/socket.html#socket.AF_CAN), протокол должен быть одним из `CAN_RAW`, [`CAN_BCM`](https://python-all.ru/3.8/library/socket.html#socket.CAN_BCM) или [`CAN_ISOTP`](https://python-all.ru/3.8/library/socket.html#socket.CAN_ISOTP).369370Если указан *fileno*, значения *family*, *type* и *proto* автоматически определяются по указанному файловому дескриптору. Автоматическое определение можно переопределить, передав функции явные аргументы *family*, *type* или *proto*. Это влияет только на то, как Python представляет, например, возвращаемое значение [`socket.getpeername()`](https://python-all.ru/3.8/library/socket.html#socket.socket.getpeername), но не на реальный ресурс ОС. В отличие от [`socket.fromfd()`](https://python-all.ru/3.8/library/socket.html#socket.fromfd), *fileno* возвращает тот же сокет, а не его копию. Это может помочь закрыть отсоединённый сокет с помощью [`socket.close()`](https://python-all.ru/3.8/library/socket.html#socket.close).371372Новый созданный сокет [ненаследуемый](https://python-all.ru/3.8/library/os.html#fd-inheritance).373374Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.__new__` с аргументами `self`, `family`, `type`, `protocol`.375376Изменено в версии 3.3: Добавлено семейство AF\_CAN. Добавлено семейство AF\_RDS.377378Изменено в версии 3.4: Добавлен протокол CAN\_BCM.379380Изменено в версии 3.4: Возвращаемый сокет теперь ненаследуемый.381382Изменено в версии 3.7: Добавлен протокол CAN\_ISOTP.383384Изменено в версии 3.7: Когда битовые флаги [`SOCK_NONBLOCK`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_NONBLOCK) или [`SOCK_CLOEXEC`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_CLOEXEC) применяются к *type*, они сбрасываются, и [`socket.type`](https://python-all.ru/3.8/library/socket.html#socket.socket.type) не будет их отражать. Они всё ещё передаются системному вызову *socket()*. Поэтому,385386```python387sock = socket.socket(388    socket.AF_INET,389    socket.SOCK_STREAM | socket.SOCK_NONBLOCK)390```391392будет по-прежнему создавать неблокирующий сокет в ОС, поддерживающих `SOCK_NONBLOCK`, но `sock.type` будет установлен в `socket.SOCK_STREAM`.393394#### `socket.socketpair([family[, type[, proto]]])`395396Создаёт пару связанных объектов сокетов, используя заданное семейство адресов, тип сокета и номер протокола. Семейство адресов, тип сокета и номер протокола те же, что и для функции [`socket()`](https://python-all.ru/3.8/library/socket.html#socket.socket) выше. Семейство по умолчанию – [`AF_UNIX`](https://python-all.ru/3.8/library/socket.html#socket.AF_UNIX), если оно определено на платформе; в противном случае по умолчанию используется [`AF_INET`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET).397398Новые созданные сокеты [ненаследуемые](https://python-all.ru/3.8/library/os.html#fd-inheritance).399400Изменено в версии 3.2: Возвращаемые объекты сокетов теперь поддерживают полный API сокетов, а не подмножество.401402Изменено в версии 3.4: Возвращаемые сокеты теперь являются ненаследуемыми.403404Изменено в версии 3.5: Добавлена поддержка Windows.405406#### `socket.create_connection(address[, timeout[, source_address]])`407408Подключается к TCP-службе, прослушивающей *адрес* в интернете (кортеж из двух элементов `(host, port)`), и возвращает объект сокета. Это функция более высокого уровня, чем [`socket.connect()`](https://python-all.ru/3.8/library/socket.html#socket.socket.connect): если *host* – нечисловое имя узла, он будет пытаться разрешить его как для [`AF_INET`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET), так и для [`AF_INET6`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET6), а затем пытаться подключаться ко всем возможным адресам по очереди, пока подключение не установится. Это упрощает написание клиентов, совместимых как с IPv4, так и с IPv6.409410Передача необязательного параметра *timeout* установит тайм-аут для экземпляра сокета перед попыткой подключения. Если *timeout* не указан, используется глобальная настройка тайм-аута по умолчанию, возвращаемая [`getdefaulttimeout()`](https://python-all.ru/3.8/library/socket.html#socket.getdefaulttimeout).411412Если указан, *source\_address* должен быть кортежем из двух элементов `(host, port)`, к которому сокет должен привязаться как к своему исходному адресу перед подключением. Если хост или порт равны '' или 0 соответственно, будет использовано поведение ОС по умолчанию.413414Изменено в версии 3.2: Добавлен параметр *source\_address*.415416#### `socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False)`417418Удобная функция, которая создаёт TCP-сокет, привязанный к *address* (кортеж из двух элементов `(host, port)`) и возвращает объект сокета.419420*family* должен быть либо [`AF_INET`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET), либо [`AF_INET6`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET6). *backlog* – размер очереди, передаваемый в [`socket.listen()`](https://python-all.ru/3.8/library/socket.html#socket.socket.listen); если `0` выбирается разумное значение по умолчанию. *reuse\_port* определяет, нужно ли устанавливать опцию сокета `SO_REUSEPORT`.421422Если *dualstack\_ipv6* имеет значение true и платформа это поддерживает, сокет сможет принимать как IPv4-, так и IPv6-соединения. В противном случае будет вызвано исключение [`ValueError`](https://python-all.ru/3.8/library/exceptions.html#ValueError). Большинство платформ POSIX и Windows должны поддерживать эту функциональность. Когда эта функциональность включена, адрес, возвращаемый [`socket.getpeername()`](https://python-all.ru/3.8/library/socket.html#socket.socket.getpeername) при IPv4-соединении, будет IPv6-адресом, представленным как IPv4-отображённый IPv6-адрес. Если *dualstack\_ipv6* имеет значение false, эта функциональность будет явно отключена на платформах, где она включена по умолчанию (например, Linux). Этот параметр можно использовать вместе с [`has_dualstack_ipv6()`](https://python-all.ru/3.8/library/socket.html#socket.has_dualstack_ipv6):423424```python425import socket426427addr = ("", 8080)  # все интерфейсы, порт 8080428if socket.has_dualstack_ipv6():429    s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)430else:431    s = socket.create_server(addr)432```433434> **Примечание**435>436> На POSIX-платформах устанавливается опция сокета `SO_REUSEADDR`, чтобы немедленно повторно использовать предыдущие сокеты, которые были привязаны к тому же адресу *address* и оставались в состоянии TIME\_WAIT.437438Новое в версии 3.8.439440#### `socket.has_dualstack_ipv6()`441442Возвращает `True`, если платформа поддерживает создание TCP-сокета, который может обрабатывать как IPv4-, так и IPv6-соединения.443444Новое в версии 3.8.445446#### `socket.fromfd(fd, family, type, proto=0)`447448Дублирует файловый дескриптор *fd* (целое число, возвращаемое методом `fileno()` объекта файла) и создаёт объект сокета из результата. Семейство адресов, тип сокета и номер протокола такие же, как для функции [`socket()`](https://python-all.ru/3.8/library/socket.html#socket.socket) выше. Файловый дескриптор должен указывать на сокет, но это не проверяется – последующие операции с объектом могут завершиться ошибкой, если файловый дескриптор некорректен. Эта функция требуется редко, но может использоваться для получения или установки параметров сокета, переданного программе как стандартный ввод или вывод (например, сервер, запущенный демоном inet в Unix). Предполагается, что сокет находится в блокирующем режиме.449450Новый созданный сокет [ненаследуемый](https://python-all.ru/3.8/library/os.html#fd-inheritance).451452Изменено в версии 3.4: Возвращаемый сокет теперь ненаследуемый.453454#### `socket.fromshare(data)`455456Создаёт экземпляр сокета из данных, полученных из метода [`socket.share()`](https://python-all.ru/3.8/library/socket.html#socket.socket.share). Предполагается, что сокет находится в блокирующем режиме.457458[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Windows.459460Новое в версии 3.3.461462#### `socket.SocketType`463464Это объект типа Python, представляющий тип объекта сокета. Он аналогичен `type(socket(...))`.465466#### Другие функции467468Модуль [`socket`](https://python-all.ru/3.8/library/socket.html#module-socket) также предоставляет различные сетевые службы:469470#### `socket.close(fd)`471472Закрывает файловый дескриптор сокета. Эта функция аналогична [`os.close()`](https://python-all.ru/3.8/library/os.html#os.close), но для сокетов. На некоторых платформах (особенно в Windows) [`os.close()`](https://python-all.ru/3.8/library/os.html#os.close) не работает с файловыми дескрипторами сокетов.473474Добавлено в версии 3.7.475476#### `socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)`477478Преобразует аргументы *host*/*port* в последовательность кортежей из 5 элементов, содержащих все необходимые аргументы для создания сокета, подключенного к этому сервису. *host* – это доменное имя, строковое представление IPv4/v6-адреса или `None`. *port* – это строковое имя службы, такое как `'http'`, числовой номер порта или `None`. Передавая `None` в качестве значения *host* и *port*, можно передать `NULL` в базовый C API.479480Аргументы *family*, *type* и *proto* можно указать необязательно, чтобы сузить список возвращаемых адресов. Передача нуля в качестве значения каждого из этих аргументов выбирает полный диапазон результатов. Аргумент *flags* может быть одной или несколькими константами из `AI_*` и будет влиять на то, как вычисляются и возвращаются результаты. Например, `AI_NUMERICHOST` отключит разрешение доменных имён и вызовет исключение, если *host* является доменным именем.481482Функция возвращает список кортежей из 5 элементов со следующей структурой:483484`(family, type, proto, canonname, sockaddr)`485486В этих кортежах *family*, *type*, *proto* – целые числа, предназначенные для передачи в функцию [`socket()`](https://python-all.ru/3.8/library/socket.html#socket.socket). *canonname* будет строкой, представляющей каноническое имя *хоста*, если `AI_CANONNAME` является частью аргумента *flags*; в противном случае *canonname* будет пустым. *sockaddr* – это кортеж, описывающий адрес сокета, формат которого зависит от возвращённого *family* (`(address, port)` 2-кортеж для [`AF_INET`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET), `(address, port, flow info, scope id)` 4-кортеж для [`AF_INET6`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET6)) и предназначен для передачи в метод [`socket.connect()`](https://python-all.ru/3.8/library/socket.html#socket.socket.connect).487488Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.getaddrinfo` с аргументами `host`, `port`, `family`, `type`, `protocol`.489490В следующем примере получается информация об адресе для гипотетического TCP-подключения к `example.org` на порту 80 (результаты могут отличаться на вашей системе, если IPv6 не включён):491492```python493>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP)494[(<AddressFamily.AF_INET6: 10>, <SocketType.SOCK_STREAM: 1>,495 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),496 (<AddressFamily.AF_INET: 2>, <SocketType.SOCK_STREAM: 1>,497 6, '', ('93.184.216.34', 80))]498```499500Изменено в версии 3.2: теперь параметры можно передавать в виде именованных аргументов.501502Изменено в версии 3.7: для IPv6-адресов многоадресной рассылки строка, представляющая адрес, не будет содержать часть `%scope`.503504#### `socket.getfqdn([name])`505506Возвращает полностью определённое доменное имя для *name*. Если *name* опущен или пуст, он интерпретируется как локальный хост. Для поиска полного имени сначала проверяется имя хоста, возвращаемое [`gethostbyaddr()`](https://python-all.ru/3.8/library/socket.html#socket.gethostbyaddr), затем, если доступны, псевдонимы хоста. Выбирается первое имя, содержащее точку. Если полностью определённое доменное имя недоступно, возвращается имя хоста, полученное от [`gethostname()`](https://python-all.ru/3.8/library/socket.html#socket.gethostname).507508#### `socket.gethostbyname(hostname)`509510Преобразует имя хоста в формат IPv4-адреса. IPv4-адрес возвращается в виде строки, например `'100.50.200.5'`. Если имя хоста само является IPv4-адресом, оно возвращается без изменений. См. [`gethostbyname_ex()`](https://python-all.ru/3.8/library/socket.html#socket.gethostbyname_ex) для более полного интерфейса. [`gethostbyname()`](https://python-all.ru/3.8/library/socket.html#socket.gethostbyname) не поддерживает разрешение имён IPv6, вместо него для поддержки двойного стека IPv4/v6 следует использовать [`getaddrinfo()`](https://python-all.ru/3.8/library/socket.html#socket.getaddrinfo).511512Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.gethostbyname` с аргументом `hostname`.513514#### `socket.gethostbyname_ex(hostname)`515516Преобразует имя хоста в формат IPv4-адреса (расширенный интерфейс). Возвращает тройку `(hostname, aliaslist, ipaddrlist)`, где *hostname* – основное имя хоста, отвечающее на заданный *ip\_address*; *aliaslist* – (возможно пустой) список альтернативных имён хоста для того же адреса; и *ipaddrlist* – список IPv4-адресов для того же интерфейса на том же хосте (часто, но не всегда, один адрес). [`gethostbyname_ex()`](https://python-all.ru/3.8/library/socket.html#socket.gethostbyname_ex) не поддерживает разрешение имён IPv6, а для поддержки IPv4/IPv6 двойного стека следует использовать [`getaddrinfo()`](https://python-all.ru/3.8/library/socket.html#socket.getaddrinfo).517518Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.gethostbyname` с аргументом `hostname`.519520#### `socket.gethostname()`521522Возвращает строку, содержащую имя хоста машины, на которой в данный момент выполняется интерпретатор Python.523524Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.gethostname` без аргументов.525526Примечание: [`gethostname()`](https://python-all.ru/3.8/library/socket.html#socket.gethostname) не всегда возвращает полное доменное имя; для этого используйте [`getfqdn()`](https://python-all.ru/3.8/library/socket.html#socket.getfqdn).527528#### `socket.gethostbyaddr(ip_address)`529530Возвращает кортеж `(hostname, aliaslist, ipaddrlist)`, где *hostname* – это основное имя хоста, соответствующее заданному *ip\_address*, *aliaslist* – (возможно пустой) список альтернативных имён хоста для того же адреса, а *ipaddrlist* – список IPv4/v6-адресов для того же интерфейса на том же хосте (скорее всего, содержащий только один адрес). Чтобы найти полностью определённое доменное имя, используйте функцию [`getfqdn()`](https://python-all.ru/3.8/library/socket.html#socket.getfqdn). [`gethostbyaddr()`](https://python-all.ru/3.8/library/socket.html#socket.gethostbyaddr) поддерживает как IPv4, так и IPv6.531532Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.gethostbyaddr` с аргументом `ip_address`.533534#### `socket.getnameinfo(sockaddr, flags)`535536Преобразует адрес сокета *sockaddr* в кортеж из двух элементов `(host, port)`. В зависимости от настроек *flags* результат может содержать полное доменное имя или числовое представление адреса в *host*. Аналогично, *port* может содержать строковое имя порта или числовой номер порта.537538Для IPv6-адресов `%scope` добавляется к части хоста, если *sockaddr* содержит значимое *scopeid*. Обычно это происходит для многоадресных адресов.539540Для получения дополнительной информации о *flags* можно обратиться к *[getnameinfo(3)](https://python-all.ru/3.8/library/socket.html)*.541542Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.getnameinfo` с аргументом `sockaddr`.543544#### `socket.getprotobyname(protocolname)`545546Преобразует имя интернет-протокола (например, `'icmp'`) в константу, пригодную для передачи в качестве (необязательного) третьего аргумента функции [`socket()`](https://python-all.ru/3.8/library/socket.html#socket.socket). Обычно это требуется только для сокетов, открытых в «сыром» режиме ([`SOCK_RAW`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_RAW)); для обычных режимов сокетов правильный протокол выбирается автоматически, если протокол опущен или равен нулю.547548#### `socket.getservbyname(servicename[, protocolname])`549550Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если указано, должно быть `'tcp'` или `'udp'`, в противном случае подойдет любой протокол.551552Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.getservbyname` с аргументами `servicename`, `protocolname`.553554#### `socket.getservbyport(port[, protocolname])`555556Преобразует номер порта интернет-службы и имя протокола в имя службы для этой службы. Необязательное имя протокола, если указано, должно быть `'tcp'` или `'udp'`, в противном случае подойдет любой протокол.557558Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.getservbyport` с аргументами `port`, `protocolname`.559560#### `socket.ntohl(x)`561562Преобразует 32-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта операция ничего не делает; в противном случае выполняется перестановка 4 байтов.563564#### `socket.ntohs(x)`565566Преобразует 16-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.567568Устарело с версии 3.7: Если *x* не помещается в 16-битное беззнаковое целое, но помещается в положительное целое C int, оно молча усекается до 16-битного беззнакового целого. Это молчаливое усечение устарело и будет порождать исключение в будущих версиях Python.569570#### `socket.htonl(x)`571572Преобразует 32-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен четырёх байтов.573574#### `socket.htons(x)`575576Преобразует 16-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.577578Устарело с версии 3.7: Если *x* не помещается в 16-битное беззнаковое целое, но помещается в положительное целое C int, оно молча усекается до 16-битного беззнакового целого. Это молчаливое усечение устарело и будет порождать исключение в будущих версиях Python.579580#### `socket.inet_aton(ip_string)`581582Преобразует IPv4-адрес из строкового формата с точками (например, ‘123.45.67.89’) в 32-битный упакованный двоичный формат в виде объекта bytes длиной четыре символа. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `struct in_addr`, который является C-типом для 32-битного упакованного двоичного представления, возвращаемого этой функцией.583584[`inet_aton()`](https://python-all.ru/3.8/library/socket.html#socket.inet_aton) также принимает строки с менее чем тремя точками; подробности см. в руководстве Unix *[inet(3)](https://python-all.ru/3.8/library/socket.html)*.585586Если переданная функции строка IPv4-адреса недопустима, будет возбуждено [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError). Обратите внимание: что именно считается допустимым, зависит от нижележащей C-реализации `inet_aton()`.587588[`inet_aton()`](https://python-all.ru/3.8/library/socket.html#socket.inet_aton) не поддерживает IPv6; для поддержки двойного стека IPv4/IPv6 следует использовать [`inet_pton()`](https://python-all.ru/3.8/library/socket.html#socket.inet_pton).589590#### `socket.inet_ntoa(packed_ip)`591592Преобразует 32-битный упакованный IPv4-адрес ([объект, подобный bytes](https://python-all.ru/3.8/glossary.html#term-bytes-like-object) длиной четыре байта) в стандартное строковое представление с точками (например, ‘123.45.67.89’). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `struct in_addr`, который является C-типом для 32-битных упакованных двоичных данных, принимаемых этой функцией в качестве аргумента.593594Если переданная функции последовательность байтов имеет длину не ровно 4 байта, будет возбуждено [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError). [`inet_ntoa()`](https://python-all.ru/3.8/library/socket.html#socket.inet_ntoa) не поддерживает IPv6; для поддержки двойного стека IPv4/IPv6 следует использовать [`inet_ntop()`](https://python-all.ru/3.8/library/socket.html#socket.inet_ntop).595596Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.8/glossary.html#term-bytes-like-object).597598#### `socket.inet_pton(address_family, ip_string)`599600Преобразует IP-адрес из строкового формата, специфичного для семейства адресов, в упакованный двоичный формат. [`inet_pton()`](https://python-all.ru/3.8/library/socket.html#socket.inet_pton) полезен, когда библиотека или сетевой протокол требует объект типа `struct in_addr` (аналогично [`inet_aton()`](https://python-all.ru/3.8/library/socket.html#socket.inet_aton)) или `struct in6_addr`.601602В настоящее время поддерживаемые значения для *address\_family*: [`AF_INET`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET) и [`AF_INET6`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET6). Если строка IP-адреса *ip\_string* недопустима, будет возбуждено [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError). Обратите внимание: что именно считается допустимым, зависит как от значения *address\_family*, так и от нижележащей реализации `inet_pton()`.603604[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Unix (возможно, не все платформы), Windows.605606Изменено в версии 3.4: Добавлена поддержка Windows607608#### `socket.inet_ntop(address_family, packed_ip)`609610Преобразует упакованный IP-адрес ([объект, подобный bytes](https://python-all.ru/3.8/glossary.html#term-bytes-like-object) некоторой длины) в стандартное строковое представление, специфичное для семейства адресов (например, `'7.10.0.5'` или `'5aef:2b::8'`). [`inet_ntop()`](https://python-all.ru/3.8/library/socket.html#socket.inet_ntop) полезен, когда библиотека или сетевой протокол возвращает объект типа `struct in_addr` (аналогично [`inet_ntoa()`](https://python-all.ru/3.8/library/socket.html#socket.inet_ntoa)) или `struct in6_addr`.611612В настоящее время поддерживаемые значения для *address\_family*: [`AF_INET`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET) и [`AF_INET6`](https://python-all.ru/3.8/library/socket.html#socket.AF_INET6). Если объект bytes *packed\_ip* имеет неправильную длину для указанного семейства адресов, будет возбуждено [`ValueError`](https://python-all.ru/3.8/library/exceptions.html#ValueError). [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError) возбуждается при ошибках вызова [`inet_ntop()`](https://python-all.ru/3.8/library/socket.html#socket.inet_ntop).613614[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Unix (возможно, не все платформы), Windows.615616Изменено в версии 3.4: Добавлена поддержка Windows617618Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.8/glossary.html#term-bytes-like-object).619620#### `socket.CMSG_LEN(length)`621622Return 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.8/library/socket.html#socket.socket.recvmsg) to receive a single item of ancillary data, but [**RFC 3542**](https://python-all.ru/3.8/library/socket.html) requires portable applications to use [`CMSG_SPACE()`](https://python-all.ru/3.8/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.8/library/exceptions.html#OverflowError) if *length* is outside the permissible range of values.623624[Доступность](https://python-all.ru/3.8/library/intro.html#availability): большинство Unix-платформ, возможно, другие.625626Новое в версии 3.3.627628#### `socket.CMSG_SPACE(length)`629630Возвращает размер буфера, необходимый для [`recvmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recvmsg) для приёма одного вспомогательного элемента данных с соответствующими данными заданной *length*, включая любое завершающее выравнивание. Пространство буфера, необходимое для приёма нескольких элементов, представляет собой сумму значений [`CMSG_SPACE()`](https://python-all.ru/3.8/library/socket.html#socket.CMSG_SPACE) для длин их соответствующих данных. Возбуждает [`OverflowError`](https://python-all.ru/3.8/library/exceptions.html#OverflowError), если *length* выходит за допустимый диапазон значений.631632Обратите внимание, что некоторые системы могут поддерживать вспомогательные данные, не предоставляя эту функцию. Также обратите внимание, что установка размера буфера с использованием результатов этой функции может не точно ограничить объём принимаемых вспомогательных данных, поскольку дополнительные данные могут поместиться в область выравнивания.633634[Доступность](https://python-all.ru/3.8/library/intro.html#availability): большинство Unix-платформ, возможно, другие.635636Новое в версии 3.3.637638#### `socket.getdefaulttimeout()`639640Возвращает тайм-аут по умолчанию в секундах (число с плавающей запятой) для новых объектов сокетов. Значение `None` означает, что новые объекты сокетов не имеют тайм-аута. При первом импорте модуля socket значение по умолчанию равно `None`.641642#### `socket.setdefaulttimeout(timeout)`643644Устанавливает тайм-аут по умолчанию в секундах (число с плавающей точкой) для новых объектов сокета. При первом импорте модуля socket значением по умолчанию является `None`. Возможные значения и их смысл описаны в [`settimeout()`](https://python-all.ru/3.8/library/socket.html#socket.socket.settimeout).645646#### `socket.sethostname(name)`647648Устанавливает имя узла (hostname) машины равным *name*. Если прав недостаточно, будет возбуждено исключение [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError).649650Вызывает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.sethostname` с аргументом `name`.651652[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Unix.653654Новое в версии 3.3.655656#### `socket.if_nameindex()`657658Возвращает список кортежей с информацией о сетевых интерфейсах (индекс в виде целого числа, имя в виде строки). [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError) в случае неудачного системного вызова.659660[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Unix, Windows.661662Новое в версии 3.3.663664Изменено в версии 3.8: добавлена поддержка Windows.665666> **Примечание**667>668> В Windows сетевые интерфейсы имеют разные имена в разных контекстах (все имена приведены в качестве примера):669>670> - UUID: `{FB605B73-AAC2-49A6-9A2F-25416AEA0573}`671> - имя: `ethernet_32770`672> - понятное имя: `vEthernet (nat)`673> - описание: `Hyper-V Virtual Ethernet Adapter`674>675> Эта функция возвращает имена второй формы из списка; в данном примере это `ethernet_32770`.676677#### `socket.if_nametoindex(if_name)`678679Возвращает номер индекса сетевого интерфейса, соответствующий имени интерфейса. [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError), если интерфейс с таким именем не существует.680681[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Unix, Windows.682683Новое в версии 3.3.684685Изменено в версии 3.8: добавлена поддержка Windows.686687> **См. также**688>689> «Имя интерфейса» – это имя, описанное в [`if_nameindex()`](https://python-all.ru/3.8/library/socket.html#socket.if_nameindex).690691#### `socket.if_indextoname(if_index)`692693Возвращает имя сетевого интерфейса, соответствующее номеру индекса интерфейса. [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError), если интерфейс с таким индексом не существует.694695[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Unix, Windows.696697Новое в версии 3.3.698699Изменено в версии 3.8: добавлена поддержка Windows.700701> **См. также**702>703> «Имя интерфейса» – это имя, описанное в [`if_nameindex()`](https://python-all.ru/3.8/library/socket.html#socket.if_nameindex).704705## Объекты сокетов706707Объекты сокетов имеют следующие методы. За исключением [`makefile()`](https://python-all.ru/3.8/library/socket.html#socket.socket.makefile), они соответствуют системным вызовам Unix, применимым к сокетам.708709Изменено в версии 3.2: Добавлена поддержка протокола [менеджера контекста](https://python-all.ru/3.8/glossary.html#term-context-manager). Выход из менеджера контекста эквивалентен вызову [`close()`](https://python-all.ru/3.8/library/socket.html#socket.close).710711#### `socket.accept()`712713Принимает соединение. Сокет должен быть привязан к адресу и находиться в режиме прослушивания. Возвращаемое значение – пара `(conn, address)`, где *conn* – это *новый* объект сокета, пригодный для отправки и получения данных по соединению, а *address* – адрес, привязанный к сокету на другом конце соединения.714715Новый созданный сокет [ненаследуемый](https://python-all.ru/3.8/library/os.html#fd-inheritance).716717Изменено в версии 3.4: Сокет теперь ненаследуемый.718719Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.8/library/socket.html) с обоснованием).720721#### `socket.bind(address)`722723Привязывает сокет к *address*. Сокет не должен быть уже привязан. (Формат *address* зависит от семейства адресов – см. выше.)724725Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.bind` с аргументами `self`, `address`.726727#### `socket.close()`728729Помечает сокет как закрытый. Базовый системный ресурс (например, файловый дескриптор) также закрывается, когда все файловые объекты из [`makefile()`](https://python-all.ru/3.8/library/socket.html#socket.socket.makefile) будут закрыты. Как только это происходит, все последующие операции с объектом сокета будут завершаться ошибкой. Удалённая сторона больше не получит данных (после сброса поставленных в очередь данных).730731Сокеты автоматически закрываются при сборке мусора, но рекомендуется явно [`close()`](https://python-all.ru/3.8/library/socket.html#socket.close) их закрывать или использовать оператор [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with) вокруг них.732733Изменено в версии 3.6: Теперь [`OSError`](https://python-all.ru/3.8/library/exceptions.html#OSError) возбуждается, если при выполнении `close()` возникает ошибка.734735> **Примечание**736>737> [`close()`](https://python-all.ru/3.8/library/socket.html#socket.close) освобождает ресурс, связанный с соединением, но не обязательно немедленно закрывает соединение. Если требуется своевременно закрыть соединение, вызовите [`shutdown()`](https://python-all.ru/3.8/library/socket.html#socket.socket.shutdown) перед [`close()`](https://python-all.ru/3.8/library/socket.html#socket.close).738739#### `socket.connect(address)`740741Подключается к удалённому сокету по адресу *address*. (Формат *address* зависит от семейства адресов – см. выше.)742743Если соединение прерывается сигналом, метод ожидает его завершения или вызывает исключение [`socket.timeout`](https://python-all.ru/3.8/library/socket.html#socket.timeout) по таймауту, если обработчик сигнала не возбуждает исключение, а сокет является блокирующим или имеет таймаут. Для неблокирующих сокетов метод вызывает исключение [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError), если соединение прерывается сигналом (или исключение, возбуждённое обработчиком сигнала).744745Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.connect` с аргументами `self`, `address`.746747Изменено в версии 3.5: Теперь метод ждёт завершения соединения вместо возбуждения исключения [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError), если соединение прервано сигналом, обработчик сигнала не вызывает исключение, а сокет является блокирующим или имеет тайм-аут (см. [**PEP 475**](https://python-all.ru/3.8/library/socket.html) с обоснованием).748749#### `socket.connect_ex(address)`750751Как и `connect(address)`, но возвращает индикатор ошибки вместо возбуждения исключения для ошибок, возвращаемых вызовом `connect()` на уровне C (другие проблемы, например «хост не найден», по-прежнему могут вызывать исключения). Индикатор ошибки равен `0`, если операция выполнена успешно, в противном случае – значению переменной `errno`. Это удобно, например, для поддержки асинхронных подключений.752753Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.connect` с аргументами `self`, `address`.754755#### `socket.detach()`756757Переводит объект сокета в закрытое состояние без фактического закрытия базового файлового дескриптора. Файловый дескриптор возвращается и может быть повторно использован для других целей.758759Новое в версии 3.2.760761#### `socket.dup()`762763Дублирует сокет.764765Новый созданный сокет [ненаследуемый](https://python-all.ru/3.8/library/os.html#fd-inheritance).766767Изменено в версии 3.4: Сокет теперь ненаследуемый.768769#### `socket.fileno()`770771Возвращает файловый дескриптор сокета (небольшое целое число) или -1 в случае ошибки. Это полезно с [`select.select()`](https://python-all.ru/3.8/library/select.html#select.select).772773В Windows небольшое целое число, возвращаемое этим методом, нельзя использовать там, где может быть использован файловый дескриптор (например, [`os.fdopen()`](https://python-all.ru/3.8/library/os.html#os.fdopen)). В Unix такого ограничения нет.774775#### `socket.get_inheritable()`776777Получить [наследуемый флаг](https://python-all.ru/3.8/library/os.html#fd-inheritance) файлового дескриптора сокета или handle сокета: `True`, если сокет может наследоваться в дочерних процессах, `False`, если не может.778779Новое в версии 3.4.780781#### `socket.getpeername()`782783Возвращает удалённый адрес, к которому подключён сокет. Это полезно, например, для определения номера порта удалённого сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов – см. выше.) На некоторых системах эта функция не поддерживается.784785#### `socket.getsockname()`786787Возвращает собственный адрес сокета. Это полезно, например, для определения номера порта сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов – см. выше.)788789#### `socket.getsockopt(level, optname[, buflen])`790791Возвращает значение заданного параметра сокета (см. страницу руководства Unix *[getsockopt(2)](https://python-all.ru/3.8/library/socket.html)*). Необходимые символические константы (`SO_*` и др.) определены в этом модуле. Если *buflen* отсутствует, предполагается целочисленный параметр, и функция возвращает его целочисленное значение. Если *buflen* указан, он задает максимальную длину буфера для получения параметра, и этот буфер возвращается в виде объекта bytes. Вызывающий код должен сам декодировать содержимое буфера (см. опциональный встроенный модуль [`struct`](https://python-all.ru/3.8/library/struct.html#module-struct) для способа декодирования структур C, закодированных как байтовые строки).792793#### `socket.getblocking()`794795Возвращает `True`, если сокет в блокирующем режиме, и `False`, если в неблокирующем.796797Это эквивалентно проверке `socket.gettimeout() == 0`.798799Добавлено в версии 3.7.800801#### `socket.gettimeout()`802803Возвращает тайм-аут в секундах (число с плавающей точкой), связанный с операциями сокета, или `None`, если тайм-аут не установлен. Это отражает последний вызов [`setblocking()`](https://python-all.ru/3.8/library/socket.html#socket.socket.setblocking) или [`settimeout()`](https://python-all.ru/3.8/library/socket.html#socket.socket.settimeout).804805#### `socket.ioctl(control, option)`806807**Платформа**808809Windows810811Метод [`ioctl()`](https://python-all.ru/3.8/library/socket.html#socket.socket.ioctl) является ограниченным интерфейсом к системному интерфейсу WSAIoctl. За дополнительной информацией обратитесь к [документации Win32](https://python-all.ru/3.8/library/socket.html).812813На других платформах можно использовать общие функции [`fcntl.fcntl()`](https://python-all.ru/3.8/library/fcntl.html#fcntl.fcntl) и [`fcntl.ioctl()`](https://python-all.ru/3.8/library/fcntl.html#fcntl.ioctl); они принимают объект сокета в качестве первого аргумента.814815В настоящее время поддерживаются только следующие управляющие коды: `SIO_RCVALL`, `SIO_KEEPALIVE_VALS` и `SIO_LOOPBACK_FAST_PATH`.816817Изменено в версии 3.6: добавлен `SIO_LOOPBACK_FAST_PATH`.818819#### `socket.listen([backlog])`820821Включает возможность сервера принимать соединения. Если указан *backlog*, он должен быть не менее 0 (если меньше, устанавливается в 0); он задаёт количество непринятых соединений, которые система разрешит до отказа в новых соединениях. Если не указан, выбирается разумное значение по умолчанию.822823Изменено в версии 3.5: Параметр *backlog* теперь необязателен.824825#### `socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)`826827Возвращает [файловый объект](https://python-all.ru/3.8/glossary.html#term-file-object), связанный с сокетом. Точный возвращаемый тип зависит от аргументов, переданных в [`makefile()`](https://python-all.ru/3.8/library/socket.html#socket.socket.makefile). Эти аргументы интерпретируются так же, как и встроенной функцией [`open()`](https://python-all.ru/3.8/library/functions.html#open), за исключением того, что единственные поддерживаемые значения *режима*`'r'` (по умолчанию), `'w'` и `'b'`.828829Сокет должен быть в блокирующем режиме; можно установить тайм-аут, но при его срабатывании внутренний буфер файлового объекта может оказаться в несогласованном состоянии.830831Закрытие файлового объекта, возвращённого [`makefile()`](https://python-all.ru/3.8/library/socket.html#socket.socket.makefile), не закроет исходный сокет, если только все остальные файловые объекты не будут закрыты и для объекта сокета не будет вызван [`socket.close()`](https://python-all.ru/3.8/library/socket.html#socket.close).832833> **Примечание**834>835> В Windows файлоподобный объект, созданный [`makefile()`](https://python-all.ru/3.8/library/socket.html#socket.socket.makefile), нельзя использовать там, где ожидается файловый объект с дескриптором файла, например, в аргументах потока [`subprocess.Popen()`](https://python-all.ru/3.8/library/subprocess.html#subprocess.Popen).836837#### `socket.recv(bufsize[, flags])`838839Получает данные из сокета. Возвращаемое значение – объект bytes, представляющий полученные данные. Максимальный объем данных, получаемых за один раз, задается параметром *bufsize*. См. страницу руководства Unix *[recv(2)](https://python-all.ru/3.8/library/socket.html)* для описания необязательного аргумента *flags*; по умолчанию он равен нулю.840841> **Примечание**842>843> Для наилучшего соответствия реальным характеристикам оборудования и сети значение *bufsize* должно быть относительно небольшой степенью двойки, например, 4096.844845Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.8/library/socket.html) с обоснованием).846847#### `socket.recvfrom(bufsize[, flags])`848849Принимает данные из сокета. Возвращаемое значение – пара `(bytes, address)`, где *bytes* – объект bytes, представляющий принятые данные, а *address* – адрес сокета, отправившего данные. См. страницу руководства Unix *[recv(2)](https://python-all.ru/3.8/library/socket.html)* для описания необязательного аргумента *flags*; по умолчанию он равен нулю. (Формат *address* зависит от семейства адресов – см. выше.)850851Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.8/library/socket.html) с обоснованием).852853Изменено в версии 3.7: Для многоадресного IPv6-адреса первый элемент *address* больше не содержит часть `%scope`. Чтобы получить полный IPv6-адрес, используйте [`getnameinfo()`](https://python-all.ru/3.8/library/socket.html#socket.getnameinfo).854855#### `socket.recvmsg(bufsize[, ancbufsize[, flags]])`856857Принимает обычные данные (до *bufsize* байт) и вспомогательные данные из сокета. Аргумент *ancbufsize* задаёт размер внутреннего буфера для приёма вспомогательных данных в байтах; по умолчанию равен 0, то есть вспомогательные данные приниматься не будут. Подходящие размеры буфера для вспомогательных данных можно вычислить с помощью [`CMSG_SPACE()`](https://python-all.ru/3.8/library/socket.html#socket.CMSG_SPACE) или [`CMSG_LEN()`](https://python-all.ru/3.8/library/socket.html#socket.CMSG_LEN); данные, не помещающиеся в буфер, могут быть усечены или отброшены. Аргумент *flags* по умолчанию равен 0 и имеет тот же смысл, что и для [`recv()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recv).858859Возвращаемое значение – кортеж из 4 элементов: `(data, ancdata, msg_flags, address)`. Элемент *data* – это объект [`bytes`](https://python-all.ru/3.8/library/stdtypes.html#bytes), содержащий принятые невспомогательные данные. Элемент *ancdata* – это список из нуля или более кортежей `(cmsg_level, cmsg_type, cmsg_data)`, представляющих принятые вспомогательные данные (управляющие сообщения): *cmsg\_level* и *cmsg\_type* – целые числа, задающие уровень протокола и тип протокола соответственно, а *cmsg\_data* – объект [`bytes`](https://python-all.ru/3.8/library/stdtypes.html#bytes) с соответствующими данными. Элемент *msg\_flags* – побитовое ИЛИ различных флагов, указывающих на состояние принятого сообщения; подробнее см. в системной документации. Если принимающий сокет не подключён, *address* – это адрес отправляющего сокета (если доступен); в противном случае его значение не определено.860861В некоторых системах [`sendmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.sendmsg) и [`recvmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recvmsg) можно использовать для передачи файловых дескрипторов между процессами через [`AF_UNIX`](https://python-all.ru/3.8/library/socket.html#socket.AF_UNIX)-сокет. Когда этот механизм используется (он часто ограничен [`SOCK_STREAM`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_STREAM)-сокетами), [`recvmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recvmsg) вернет во вспомогательных данных элементы вида `(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)`, где *fds* – это объект [`bytes`](https://python-all.ru/3.8/library/stdtypes.html#bytes), представляющий новые файловые дескрипторы в виде двоичного массива нативного типа C `int`. Если [`recvmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recvmsg) возбуждает исключение после возврата системного вызова, он сначала попытается закрыть все файловые дескрипторы, полученные через этот механизм.862863Некоторые системы не указывают усечённую длину частично принятых вспомогательных данных. Если элемент, по-видимому, выходит за конец буфера, [`recvmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recvmsg) выдаст [`RuntimeWarning`](https://python-all.ru/3.8/library/exceptions.html#RuntimeWarning) и вернёт ту его часть, которая находится в буфере, при условии, что она не была усечена до начала соответствующих данных.864865В системах, поддерживающих механизм `SCM_RIGHTS`, следующая функция будет принимать до *maxfds* файловых дескрипторов, возвращая данные сообщения и список, содержащий дескрипторы (игнорируя неожиданные ситуации, такие как приём посторонних управляющих сообщений). См. также [`sendmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.sendmsg).866867```python868import socket, array869870def recv_fds(sock, msglen, maxfds):871    fds = array.array("i")   # Массив целых чисел872    msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))873    for cmsg_level, cmsg_type, cmsg_data in ancdata:874        if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:875            # Добавить данные, игнорируя любые усечённые целые числа в конце.876            fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])877    return msg, list(fds)878```879880[Доступность](https://python-all.ru/3.8/library/intro.html#availability): большинство Unix-платформ, возможно, другие.881882Новое в версии 3.3.883884Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.8/library/socket.html) с обоснованием).885886#### `socket.recvmsg_into(buffers[, ancbufsize[, flags]])`887888Принимает обычные и вспомогательные данные из сокета, действуя как [`recvmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recvmsg), но разбрасывает невспомогательные данные по нескольким буферам вместо возврата нового объекта bytes. Аргумент *buffers* должен быть итерируемым объектом, содержащим объекты, предоставляющие буферы для записи (например, объекты [`bytearray`](https://python-all.ru/3.8/library/stdtypes.html#bytearray)); они будут заполняться последовательными фрагментами невспомогательных данных, пока все данные не будут записаны или буферы не закончатся. Операционная система может установить ограничение (значение [`sysconf()`](https://python-all.ru/3.8/library/os.html#os.sysconf) `SC_IOV_MAX`) на количество используемых буферов. Аргументы *ancbufsize* и *flags* имеют тот же смысл, что и для [`recvmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recvmsg).889890Возвращаемое значение – кортеж из 4 элементов: `(nbytes, ancdata, msg_flags, address)`, где *nbytes* – общее количество байт невспомогательных данных, записанных в буферы, а *ancdata*, *msg\_flags* и *address* такие же, как для [`recvmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recvmsg).891892Пример:893894```python895>>> import socket896>>> s1, s2 = socket.socketpair()897>>> b1 = bytearray(b'----')898>>> b2 = bytearray(b'0123456789')899>>> b3 = bytearray(b'--------------')900>>> s1.send(b'Mary had a little lamb')90122902>>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])903(22, [], 0, None)904>>> [b1, b2, b3]905[bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]906```907908[Доступность](https://python-all.ru/3.8/library/intro.html#availability): большинство Unix-платформ, возможно, другие.909910Новое в версии 3.3.911912#### `socket.recvfrom_into(buffer[, nbytes[, flags]])`913914Принимает данные из сокета, записывая их в *buffer* вместо создания новой последовательности байтов. Возвращаемое значение – пара `(nbytes, address)`, где *nbytes* – количество принятых байтов, а *address* – адрес отправляющего сокета. Смысл необязательного аргумента *flags* описан на странице руководства Unix *[recv(2)](https://python-all.ru/3.8/library/socket.html)*; по умолчанию он равен нулю. (Формат *address* зависит от семейства адресов – см. выше.)915916#### `socket.recv_into(buffer[, nbytes[, flags]])`917918Принимает до *nbytes* байт из сокета, сохраняя данные в буфер вместо создания новой строки байтов. Если *nbytes* не указан (или равен 0), принимает до размера доступного места в указанном буфере. Возвращает количество принятых байт. Смысл необязательного аргумента *flags* описан в справочной странице Unix *[recv(2)](https://python-all.ru/3.8/library/socket.html)*; по умолчанию равен нулю.919920#### `socket.send(bytes[, flags])`921922Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент *flags* имеет тот же смысл, что и для [`recv()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recv) выше. Возвращает количество отправленных байтов. Приложения обязаны проверять, что все данные были отправлены; если передана только часть данных, приложение должно попытаться отправить оставшиеся. Дополнительную информацию по этой теме можно найти в [Socket Programming HOWTO](https://python-all.ru/3.8/howto/sockets.html#socket-howto).923924Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.8/library/socket.html) с обоснованием).925926#### `socket.sendall(bytes[, flags])`927928Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент *flags* имеет тот же смысл, что и для [`recv()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recv) выше. В отличие от [`send()`](https://python-all.ru/3.8/library/socket.html#socket.socket.send), этот метод продолжает отправлять данные из *bytes*, пока не будут отправлены все данные или не произойдёт ошибка. При успехе возвращается `None`. В случае ошибки выбрасывается исключение, и невозможно определить, сколько данных, если вообще, было успешно отправлено.929930Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается при каждой успешной отправке данных. Теперь тайм-аут сокета – это максимальная общая продолжительность для отправки всех данных.931932Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.8/library/socket.html) с обоснованием).933934#### `socket.sendto(bytes, address)`935936#### `socket.sendto(bytes, flags, address)`937938Отправляет данные в сокет. Сокет не должен быть подключён к удалённому сокету, поскольку целевой сокет задаётся параметром *address*. Необязательный аргумент *flags* имеет тот же смысл, что и для [`recv()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recv) выше. Возвращает количество отправленных байтов. (Формат *address* зависит от семейства адресов – см. выше.)939940Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.sendto` с аргументами `self`, `address`.941942Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.8/library/socket.html) с обоснованием).943944#### `socket.sendmsg(buffers[, ancdata[, flags[, address]]])`945946Отправляет обычные и вспомогательные данные в сокет, собирая невспомогательные данные из серии буферов и объединяя их в одно сообщение. Аргумент *buffers* задаёт невспомогательные данные как итерируемый объект из [bytes-подобных объектов](https://python-all.ru/3.8/glossary.html#term-bytes-like-object) (например, объекты [`bytes`](https://python-all.ru/3.8/library/stdtypes.html#bytes)); операционная система может установить ограничение (значение [`sysconf()`](https://python-all.ru/3.8/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.8/library/socket.html#socket.CMSG_SPACE)) могут поддерживать отправку только одного управляющего сообщения за вызов. Аргумент *flags* по умолчанию равен 0 и имеет то же значение, что и для [`send()`](https://python-all.ru/3.8/library/socket.html#socket.socket.send). Если *address* указан и не равен `None`, он устанавливает адрес назначения для сообщения. Возвращаемое значение – количество отправленных байтов невспомогательных данных.947948Следующая функция отправляет список файловых дескрипторов *fds* через сокет [`AF_UNIX`](https://python-all.ru/3.8/library/socket.html#socket.AF_UNIX) в системах, поддерживающих механизм `SCM_RIGHTS`. См. также [`recvmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recvmsg).949950```python951import socket, array952953def send_fds(sock, msg, fds):954    return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])955```956957[Доступность](https://python-all.ru/3.8/library/intro.html#availability): большинство Unix-платформ, возможно, другие.958959Возбуждает [событие аудита](https://python-all.ru/3.8/library/sys.html#auditing) `socket.sendmsg` с аргументами `self`, `address`.960961Новое в версии 3.3.962963Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение [`InterruptedError`](https://python-all.ru/3.8/library/exceptions.html#InterruptedError) (см. [**PEP 475**](https://python-all.ru/3.8/library/socket.html) с обоснованием).964965#### `socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])`966967Специализированная версия [`sendmsg()`](https://python-all.ru/3.8/library/socket.html#socket.socket.sendmsg) для сокета [`AF_ALG`](https://python-all.ru/3.8/library/socket.html#socket.AF_ALG). Устанавливает режим, IV, длину связанных данных AEAD и флаги для сокета [`AF_ALG`](https://python-all.ru/3.8/library/socket.html#socket.AF_ALG).968969[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Linux \>= 2.6.38.970971Новое в версии 3.6.972973#### `socket.sendfile(file, offset=0, count=None)`974975Отправляет файл до достижения EOF, используя высокопроизводительный [`os.sendfile`](https://python-all.ru/3.8/library/os.html#os.sendfile), и возвращает общее количество отправленных байтов. *file* должен быть обычным файловым объектом, открытым в двоичном режиме. Если [`os.sendfile`](https://python-all.ru/3.8/library/os.html#os.sendfile) недоступен (например, в Windows) или *file* не является обычным файлом, вместо него будет использован [`send()`](https://python-all.ru/3.8/library/socket.html#socket.socket.send). *offset* указывает, откуда начинать чтение файла. Если указан, *count* – это общее количество байтов для передачи, в отличие от отправки файла до EOF. Позиция файла обновляется при возврате, а также в случае ошибки, и тогда [`file.tell()`](https://python-all.ru/3.8/library/io.html#io.IOBase.tell) можно использовать для определения количества отправленных байтов. Сокет должен быть типа [`SOCK_STREAM`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_STREAM). Неблокирующие сокеты не поддерживаются.976977Новое в версии 3.5.978979#### `socket.set_inheritable(inheritable)`980981Устанавливает [флаг наследования](https://python-all.ru/3.8/library/os.html#fd-inheritance) файлового дескриптора сокета или дескриптора сокета.982983Новое в версии 3.4.984985#### `socket.setblocking(flag)`986987Устанавливает блокирующий или неблокирующий режим сокета: если *flag* равен false, сокет переводится в неблокирующий режим, иначе в блокирующий.988989Этот метод является сокращённой записью для определённых вызовов [`settimeout()`](https://python-all.ru/3.8/library/socket.html#socket.socket.settimeout):990991- `sock.setblocking(True)` эквивалентен `sock.settimeout(None)`992- `sock.setblocking(False)` эквивалентен `sock.settimeout(0.0)`993994Изменено в версии 3.7: Метод больше не применяет флаг [`SOCK_NONBLOCK`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_NONBLOCK) на [`socket.type`](https://python-all.ru/3.8/library/socket.html#socket.socket.type).995996#### `socket.settimeout(value)`997998Устанавливает тайм-аут для блокирующих операций с сокетом. Аргумент *value* может быть неотрицательным числом с плавающей запятой, задающим секунды, или `None`. Если задано ненулевое значение, последующие операции с сокетом будут вызывать исключение [`timeout`](https://python-all.ru/3.8/library/socket.html#socket.timeout), если время тайм-аута *value* истекло до завершения операции. Если задан ноль, сокет переводится в неблокирующий режим. Если задан `None`, сокет переводится в блокирующий режим.9991000Для получения дополнительной информации обратитесь к [заметкам о тайм-аутах сокетов](https://python-all.ru/3.8/library/socket.html#socket-timeouts).10011002Изменено в версии 3.7: Метод больше не переключает флаг [`SOCK_NONBLOCK`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_NONBLOCK) на [`socket.type`](https://python-all.ru/3.8/library/socket.html#socket.socket.type).10031004#### `socket.setsockopt(level, optname, value: int)`10051006#### `socket.setsockopt(level, optname, value: buffer)`10071008#### `socket.setsockopt(level, optname, None, optlen: int)`10091010Устанавливает значение заданной опции сокета (см. страницу руководства Unix *[setsockopt(2)](https://python-all.ru/3.8/library/socket.html)*). Необходимые символические константы определены в модуле [`socket`](https://python-all.ru/3.8/library/socket.html#module-socket) (`SO_*` и т.д.). Значением может быть целое число, `None` или [объект, подобный bytes](https://python-all.ru/3.8/glossary.html#term-bytes-like-object), представляющий буфер. Во втором случае вызывающий должен гарантировать, что байтовая строка содержит правильные биты (см. опциональный встроенный модуль [`struct`](https://python-all.ru/3.8/library/struct.html#module-struct) для способа кодирования структур C в виде байтовых строк). Когда *value* установлен в `None`, требуется аргумент *optlen*. Это эквивалентно вызову C-функции `setsockopt()` с `optval=NULL` и `optlen=optlen`.10111012Изменено в версии 3.5: Теперь принимается записываемый [байтоподобный объект](https://python-all.ru/3.8/glossary.html#term-bytes-like-object).10131014Изменено в версии 3.6: Добавлена форма setsockopt(level, optname, None, optlen: int).10151016#### `socket.shutdown(how)`10171018Завершает одну или обе половины соединения. Если *how* равен `SHUT_RD`, дальнейшие приёмы запрещены. Если *how* равен `SHUT_WR`, дальнейшие отправки запрещены. Если *how* равен `SHUT_RDWR`, дальнейшие отправки и приёмы запрещены.10191020#### `socket.share(process_id)`10211022Дублирует сокет и подготавливает его для совместного использования с целевым процессом. Целевому процессу должен быть предоставлен идентификатор *process\_id*. Полученный bytes-объект затем может быть передан целевому процессу с помощью какой-либо формы межпроцессного взаимодействия, и сокет может быть воссоздан там с помощью [`fromshare()`](https://python-all.ru/3.8/library/socket.html#socket.fromshare). После вызова этого метода сокет можно безопасно закрыть, так как операционная система уже продублировала его для целевого процесса.10231024[Доступность](https://python-all.ru/3.8/library/intro.html#availability): Windows.10251026Новое в версии 3.3.10271028Обратите внимание, что методы `read()` и `write()` отсутствуют; вместо них используйте [`recv()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recv) и [`send()`](https://python-all.ru/3.8/library/socket.html#socket.socket.send) без аргумента *flags*.10291030Объекты сокетов также имеют следующие (только для чтения) атрибуты, соответствующие значениям, переданным конструктору [`socket`](https://python-all.ru/3.8/library/socket.html#socket.socket).10311032#### `socket.family`10331034Семейство сокета.10351036#### `socket.type`10371038Тип сокета.10391040#### `socket.proto`10411042Протокол сокета.10431044## Примечания о тайм-аутах сокетов10451046Объект сокета может находиться в одном из трех режимов: блокирующем, неблокирующем или режиме тайм-аута. По умолчанию сокеты всегда создаются в блокирующем режиме, но это можно изменить, вызвав [`setdefaulttimeout()`](https://python-all.ru/3.8/library/socket.html#socket.setdefaulttimeout).10471048- В *блокирующем режиме* операции блокируются до завершения или пока система не вернет ошибку (например, истекло время соединения).1049- В *неблокирующем режиме* операции завершаются ошибкой (с ошибкой, которая, к сожалению, зависит от системы), если их невозможно выполнить немедленно: функции из [`select`](https://python-all.ru/3.8/library/select.html#module-select) можно использовать, чтобы узнать, когда и готов ли сокет к чтению или записи.1050- В *режиме тайм-аута* операции завершаются ошибкой, если их нельзя выполнить в течение заданного для сокета тайм-аута (возникает исключение [`timeout`](https://python-all.ru/3.8/library/socket.html#socket.timeout)) или если система возвращает ошибку.10511052> **Примечание**1053>1054> На уровне операционной системы сокеты в *режиме тайм-аута* внутренне устанавливаются в неблокирующий режим. Кроме того, блокирующий режим и режим тайм-аута разделяются между файловыми дескрипторами и объектами сокетов, относящимися к одной сетевой конечной точке. Эта деталь реализации может иметь заметные последствия, если, например, вы решите использовать [`fileno()`](https://python-all.ru/3.8/library/socket.html#socket.socket.fileno) сокета.10551056### Тайм-ауты и метод `connect`10571058Операция [`connect()`](https://python-all.ru/3.8/library/socket.html#socket.socket.connect) также подчиняется настройке тайм-аута, и в целом рекомендуется вызывать [`settimeout()`](https://python-all.ru/3.8/library/socket.html#socket.socket.settimeout) перед вызовом [`connect()`](https://python-all.ru/3.8/library/socket.html#socket.socket.connect) или передавать параметр тайм-аута в [`create_connection()`](https://python-all.ru/3.8/library/socket.html#socket.create_connection). Однако сетевая подсистема системы также может вернуть собственную ошибку тайм-аута соединения независимо от любых настроек тайм-аута сокета Python.10591060### Тайм-ауты и метод `accept`10611062Если [`getdefaulttimeout()`](https://python-all.ru/3.8/library/socket.html#socket.getdefaulttimeout) не равно [`None`](https://python-all.ru/3.8/library/constants.html#None), сокеты, возвращаемые методом [`accept()`](https://python-all.ru/3.8/library/socket.html#socket.socket.accept), наследуют этот тайм-аут. В противном случае поведение зависит от настроек слушающего сокета:10631064- если слушающий сокет находится в *блокирующем режиме* или в *режиме тайм-аута*, то сокет, возвращаемый [`accept()`](https://python-all.ru/3.8/library/socket.html#socket.socket.accept), находится в *блокирующем режиме*;1065- если слушающий сокет находится в *неблокирующем режиме*, то будет ли сокет, возвращаемый [`accept()`](https://python-all.ru/3.8/library/socket.html#socket.socket.accept), в блокирующем или неблокирующем режиме, зависит от операционной системы. Если вы хотите обеспечить кроссплатформенное поведение, рекомендуется вручную переопределить этот параметр.10661067## Пример10681069Вот четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который отправляет обратно все полученные данные (обслуживая только одного клиента), и использующий его клиент. Обратите внимание, что сервер должен выполнить последовательность [`socket()`](https://python-all.ru/3.8/library/socket.html#socket.socket), [`bind()`](https://python-all.ru/3.8/library/socket.html#socket.socket.bind), [`listen()`](https://python-all.ru/3.8/library/socket.html#socket.socket.listen), [`accept()`](https://python-all.ru/3.8/library/socket.html#socket.socket.accept) (возможно, повторяя [`accept()`](https://python-all.ru/3.8/library/socket.html#socket.socket.accept) для обслуживания более одного клиента), в то время как клиенту нужна только последовательность [`socket()`](https://python-all.ru/3.8/library/socket.html#socket.socket), [`connect()`](https://python-all.ru/3.8/library/socket.html#socket.socket.connect). Также обратите внимание, что сервер не вызывает [`sendall()`](https://python-all.ru/3.8/library/socket.html#socket.socket.sendall)/[`recv()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recv) на сокете, который слушает, а на новом сокете, возвращённом [`accept()`](https://python-all.ru/3.8/library/socket.html#socket.socket.accept).10701071Первые два примера поддерживают только IPv4.10721073```python1074# Программа эхо-сервера1075import socket10761077HOST = ''                 # Символическое имя, обозначающее все доступные интерфейсы1078PORT = 50007              # Произвольный непривилегированный порт1079with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:1080    s.bind((HOST, PORT))1081    s.listen(1)1082    conn, addr = s.accept()1083    with conn:1084        print('Connected by', addr)1085        while True:1086            data = conn.recv(1024)1087            if not data: break1088            conn.sendall(data)1089```10901091```python1092# Программа эхо-клиента1093import socket10941095HOST = 'daring.cwi.nl'    # Удалённый хост1096PORT = 50007              # Тот же порт, что и у сервера1097with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:1098    s.connect((HOST, PORT))1099    s.sendall(b'Hello, world')1100    data = s.recv(1024)1101print('Received', repr(data))1102```11031104Следующие два примера идентичны двум предыдущим, но поддерживают как IPv4, так и IPv6. Серверная сторона будет прослушивать первое доступное семейство адресов (ей следовало бы прослушивать оба). На большинстве систем, готовых к IPv6, IPv6 будет иметь приоритет, и сервер может не принимать IPv4-трафик. Клиентская сторона попытается подключиться ко всем адресам, полученным в результате разрешения имен, и отправляет трафик на первый успешно подключенный.11051106```python1107# Программа эхо-сервера1108import socket1109import sys11101111HOST = None               # Символическое имя, обозначающее все доступные интерфейсы1112PORT = 50007              # Произвольный непривилегированный порт1113s = None1114for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,1115                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):1116    af, socktype, proto, canonname, sa = res1117    try:1118        s = socket.socket(af, socktype, proto)1119    except OSError as msg:1120        s = None1121        continue1122    try:1123        s.bind(sa)1124        s.listen(1)1125    except OSError as msg:1126        s.close()1127        s = None1128        continue1129    break1130if s is None:1131    print('could not open socket')1132    sys.exit(1)1133conn, addr = s.accept()1134with conn:1135    print('Connected by', addr)1136    while True:1137        data = conn.recv(1024)1138        if not data: break1139        conn.send(data)1140```11411142```python1143# Программа эхо-клиента1144import socket1145import sys11461147HOST = 'daring.cwi.nl'    # Удалённый хост1148PORT = 50007              # Тот же порт, что и у сервера1149s = None1150for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):1151    af, socktype, proto, canonname, sa = res1152    try:1153        s = socket.socket(af, socktype, proto)1154    except OSError as msg:1155        s = None1156        continue1157    try:1158        s.connect(sa)1159    except OSError as msg:1160        s.close()1161        s = None1162        continue1163    break1164if s is None:1165    print('could not open socket')1166    sys.exit(1)1167with s:1168    s.sendall(b'Hello, world')1169    data = s.recv(1024)1170print('Received', repr(data))1171```11721173Следующий пример показывает, как написать очень простой снифер сети с помощью сырых сокетов в Windows. Для изменения интерфейса пример требует прав администратора:11741175```python1176import socket11771178# общедоступный сетевой интерфейс1179HOST = socket.gethostbyname(socket.gethostname())11801181# создать сырой сокет и привязать его к общедоступному интерфейсу1182s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)1183s.bind((HOST, 0))11841185# Включать IP-заголовки1186s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)11871188# принять все пакеты1189s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)11901191# принять пакет1192print(s.recvfrom(65565))11931194# неразборчивый режим отключён1195s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)1196```11971198Следующий пример показывает, как использовать интерфейс сокетов для связи с сетью CAN по протоколу сырых сокетов. Чтобы вместо этого использовать CAN с протоколом broadcast manager, откройте сокет с помощью:11991200```python1201socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)1202```12031204После привязки (`CAN_RAW`) или подключения ([`CAN_BCM`](https://python-all.ru/3.8/library/socket.html#socket.CAN_BCM)) сокета можно использовать операции [`socket.send()`](https://python-all.ru/3.8/library/socket.html#socket.socket.send) и [`socket.recv()`](https://python-all.ru/3.8/library/socket.html#socket.socket.recv) (и их аналоги) с объектом сокета как обычно.12051206Этот последний пример может требовать особых привилегий:12071208```python1209import socket1210import struct12111212# Упаковка/распаковка CAN-фреймов (см. 'struct can_frame' в <linux/can.h>)12131214can_frame_fmt = "=IB3x8s"1215can_frame_size = struct.calcsize(can_frame_fmt)12161217def build_can_frame(can_id, data):1218    can_dlc = len(data)1219    data = data.ljust(8, b'\x00')1220    return struct.pack(can_frame_fmt, can_id, can_dlc, data)12211222def dissect_can_frame(frame):1223    can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)1224    return (can_id, can_dlc, data[:can_dlc])12251226# создать сырой сокет и привязать его к интерфейсу 'vcan0'1227s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)1228s.bind(('vcan0',))12291230while True:1231    cf, addr = s.recvfrom(can_frame_size)12321233    print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))12341235    try:1236        s.send(cf)1237    except OSError:1238        print('Error sending CAN frame')12391240    try:1241        s.send(build_can_frame(0x01, b'\x01\x02\x03'))1242    except OSError:1243        print('Error sending CAN frame')1244```12451246Запуск примера несколько раз со слишком маленькой задержкой между выполнениями может привести к этой ошибке:12471248```python1249OSError: [Errno 98] Address already in use1250```12511252Это связано с тем, что предыдущее выполнение оставило сокет в состоянии `TIME_WAIT`, и его нельзя сразу использовать повторно.12531254Существует флаг [`socket`](https://python-all.ru/3.8/library/socket.html#module-socket), который можно установить, чтобы предотвратить это, `socket.SO_REUSEADDR`:12551256```python1257s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)1258s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)1259s.bind((HOST, PORT))1260```12611262Флаг `SO_REUSEADDR` указывает ядру переиспользовать локальный сокет в состоянии `TIME_WAIT`, не дожидаясь истечения его естественного тайм-аута.12631264> **См. также**1265>1266> Для ознакомления с программированием сокетов (на C) см. следующие статьи:1267>1268> - *Вводное руководство по межпроцессному взаимодействию в 4.3BSD*, Стюарт Сечрест1269> - *Продвинутое руководство по межпроцессному взаимодействию в 4.3BSD*, Сэмюэл Дж. Леффлер и др.1270>1271> Оба находятся в 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.8/library/socket.html) под названием Basic Socket Interface Extensions for IPv6.1272