socket.md
1> **Источник:** https://python-all.ru/3.4/library/socket.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.1. [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket) – Low-level networking interface89Этот модуль предоставляет доступ к интерфейсу *сокетов* BSD. Он доступен во всех современных системах Unix, Windows, MacOS и, возможно, на других платформах.1011> **Примечание**12>13> Некоторые аспекты поведения могут зависеть от платформы, поскольку вызовы выполняются через API сокетов операционной системы.1415Интерфейс Python представляет собой прямую трансляцию системных вызовов и библиотечного интерфейса сокетов Unix в объектно-ориентированном стиле Python: функция [`socket()`](https://python-all.ru/3.4/library/socket.html#socket.socket) возвращает *объект сокета*, методы которого реализуют различные системные вызовы сокетов. Типы параметров находятся на более высоком уровне, чем в интерфейсе C: как и при операциях `read()` и `write()` с файлами Python, выделение буфера при приёме происходит автоматически, а длина буфера при отправке подразумевается неявно.1617> **См. также**18>19> **Модуль [`socketserver`](https://python-all.ru/3.4/library/socketserver.html#module-socketserver)**20>21> Классы, упрощающие написание сетевых серверов.22>23> **Модуль [`ssl`](https://python-all.ru/3.4/library/ssl.html#module-ssl)**24>25> Обёртка TLS/SSL для объектов сокетов.2627## 18.1.1. Семейства сокетов2829В зависимости от системы и параметров сборки этим модулем поддерживаются различные семейства сокетов.3031Формат адреса, требуемый для конкретного объекта сокета, автоматически выбирается на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представляются следующим образом:3233- Адрес сокета [`AF_UNIX`](https://python-all.ru/3.4/library/socket.html#socket.AF_UNIX), привязанного к узлу файловой системы, представляется в виде строки с использованием кодировки файловой системы и обработчика ошибок `'surrogateescape'` (см. [**PEP 383**](https://python-all.ru/3.4/library/socket.html)). Адрес в абстрактном пространстве имён Linux возвращается как объект [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) с начальным нулевым байтом; учтите, что сокеты в этом пространстве имён могут взаимодействовать с обычными сокетами файловой системы, поэтому программам, предназначенным для работы в Linux, возможно, придётся работать с обоими типами адресов. Строку или объект [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) можно использовать для адресов любого типа при передаче в качестве аргумента.3435 > Изменено в версии 3.3: Ранее пути сокетов [`AF_UNIX`](https://python-all.ru/3.4/library/socket.html#socket.AF_UNIX) считались использующими кодировку UTF-8.36- Пара `(host, port)` используется для семейства адресов [`AF_INET`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET), где *host* – строка, представляющая либо имя хоста в доменной нотации Интернета, например `'daring.cwi.nl'`, либо IPv4-адрес, например `'100.50.200.5'`, а *port* – целое число.37- Для семейства адресов [`AF_INET6`](https://python-all.ru/3.4/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.4/library/socket.html#module-socket) *flowinfo* и *scopeid* можно опускать для обратной совместимости. Однако учтите, что пропуск *scopeid* может вызвать проблемы при работе с адресами IPv6, имеющими зону действия.38- Сокеты `AF_NETLINK` представляются в виде пар `(pid, groups)`.39- Поддержка TIPC только для Linux доступна с использованием семейства адресов `AF_TIPC`. TIPC – это открытый сетевой протокол, не основанный на IP, предназначенный для использования в кластерных вычислительных средах. Адреса представляются в виде кортежа, и поля зависят от типа адреса. Общая форма кортежа: `(addr_type, v1, v2, v3 [, scope])`, где:4041 - *addr\_type* – одно из `TIPC_ADDR_NAMESEQ`, `TIPC_ADDR_NAME`, или `TIPC_ADDR_ID`.42 - *scope* – одно из `TIPC_ZONE_SCOPE`, `TIPC_CLUSTER_SCOPE` и `TIPC_NODE_SCOPE`.43 - Если *addr\_type* – `TIPC_ADDR_NAME`, то *v1* – тип сервера, *v2* – идентификатор порта, а *v3* должно быть равно 0.4445 Если *addr\_type* – `TIPC_ADDR_NAMESEQ`, то *v1* – тип сервера, *v2* – нижний номер порта, а *v3* – верхний номер порта.4647 Если *addr\_type* – `TIPC_ADDR_ID`, то *v1* – узел, *v2* – ссылка, а *v3* должно быть установлено в 0.48- Кортеж `(interface, )` используется для семейства адресов [`AF_CAN`](https://python-all.ru/3.4/library/socket.html#socket.AF_CAN), где *interface* – строка, представляющая имя сетевого интерфейса, например `'can0'`. Имя сетевого интерфейса `''` можно использовать для получения пакетов со всех сетевых интерфейсов этого семейства.49- Строка или кортеж `(id, unit)` используется для протокола `SYSPROTO_CONTROL` семейства `PF_SYSTEM`. Строка – это имя элемента управления ядра с динамически назначаемым идентификатором. Кортеж можно использовать, если идентификатор и номер модуля элемента управления ядра известны или используется зарегистрированный идентификатор.5051 Новое в версии 3.3.52- `AF_BLUETOOTH` поддерживает следующие протоколы и форматы адресов:5354 - `BTPROTO_L2CAP` принимает `(bdaddr, psm)`, где `bdaddr` – Bluetooth-адрес в виде строки, а `psm` – целое число.55 - `BTPROTO_RFCOMM` принимает `(bdaddr, channel)`, где `bdaddr` – Bluetooth-адрес в виде строки, а `channel` – целое число.56 - `BTPROTO_HCI` принимает `(device_id,)`, где `device_id` – либо целое число, либо строка с Bluetooth-адресом интерфейса. (Зависит от ОС; NetBSD и DragonFlyBSD ожидают Bluetooth-адрес, а все остальные – целое число.)5758 Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.59 - `BTPROTO_SCO` принимает `bdaddr`, где `bdaddr` – объект [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes), содержащий Bluetooth-адрес в строковом формате (например, `b'12:23:34:45:56:67'`). Этот протокол не поддерживается в FreeBSD.60- Некоторые другие семейства адресов (`AF_PACKET`, [`AF_CAN`](https://python-all.ru/3.4/library/socket.html#socket.AF_CAN)) поддерживают особые представления.6162Для IPv4-адресов вместо адреса хоста принимаются две специальные формы: пустая строка обозначает `INADDR_ANY`, а строка `'<broadcast>'` обозначает `INADDR_BROADCAST`. Такое поведение несовместимо с IPv6, поэтому от этих форм лучше отказаться, если планируется поддержка IPv6 в программах на Python.6364Если в части *узел* адреса сокета IPv4/v6 указано имя узла, программа может демонстрировать недетерминированное поведение, так как Python использует первый адрес, возвращённый при разрешении DNS. Адрес сокета будет разрешаться по-разному в фактический IPv4/v6-адрес в зависимости от результатов разрешения DNS и/или конфигурации узла. Для детерминированного поведения используйте числовой адрес в части *узел*.6566Все ошибки порождают исключения. Могут возникать обычные исключения для недопустимых типов аргументов и нехватки памяти; начиная с Python 3.3 ошибки, связанные с семантикой сокетов или адресов, порождают [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) или один из его подклассов (ранее они порождали [`socket.error`](https://python-all.ru/3.4/library/socket.html#socket.error)).6768Неподдерживаемый режим поддерживается через [`setblocking()`](https://python-all.ru/3.4/library/socket.html#socket.socket.setblocking). Более общий подход на основе тайм-аутов поддерживается через [`settimeout()`](https://python-all.ru/3.4/library/socket.html#socket.socket.settimeout).6970## 18.1.2. Содержание модуля7172Модуль [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket) экспортирует следующие элементы.7374### 18.1.2.1. Исключения7576#### `exception socket.error`7778Устаревший псевдоним [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).7980Изменено в версии 3.3: В соответствии с [**PEP 3151**](https://python-all.ru/3.4/library/socket.html), этот класс стал псевдонимом [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).8182#### `exception socket.herror`8384Подкласс [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError), это исключение возникает при ошибках, связанных с адресами, то есть для функций, использующих *h\_errno* в C POSIX API, включая [`gethostbyname_ex()`](https://python-all.ru/3.4/library/socket.html#socket.gethostbyname_ex) и [`gethostbyaddr()`](https://python-all.ru/3.4/library/socket.html#socket.gethostbyaddr). Сопутствующее значение – это пара `(h_errno, string)`, представляющая ошибку, возвращённую вызовом библиотеки. *h\_errno* – числовое значение, а *string* – описание *h\_errno*, возвращаемое функцией `hstrerror()` из C.8586Изменено в версии 3.3: Этот класс стал подклассом [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).8788#### `exception socket.gaierror`8990Подкласс [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError), это исключение вызывается для ошибок, связанных с адресами, функциями [`getaddrinfo()`](https://python-all.ru/3.4/library/socket.html#socket.getaddrinfo) и [`getnameinfo()`](https://python-all.ru/3.4/library/socket.html#socket.getnameinfo).\\nСопутствующее значение – пара `(error, string)`, представляющая ошибку, возвращённую библиотечным вызовом. *string* содержит описание *error*, возвращённое C-функцией `gai_strerror()`. Числовое значение *error* соответствует одной из констант `EAI_*`, определённых в этом модуле.9192Изменено в версии 3.3: Этот класс стал подклассом [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).9394#### `exception socket.timeout`9596Подкласс [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError), это исключение вызывается, когда на сокете, для которого были включены тайм-ауты с помощью предыдущего вызова [`settimeout()`](https://python-all.ru/3.4/library/socket.html#socket.socket.settimeout) (или неявно через [`setdefaulttimeout()`](https://python-all.ru/3.4/library/socket.html#socket.setdefaulttimeout)), происходит тайм-аут. Сопутствующее значение – строка, значением которой в настоящее время всегда является «истекло время ожидания».9798Изменено в версии 3.3: Этот класс стал подклассом [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).99100### 18.1.2.2. Константы101102> Константы AF\_\* и SOCK\_\* теперь являются `AddressFamily` и\\n`SocketKind` коллекциями [`IntEnum`](https://python-all.ru/3.4/library/enum.html#enum.IntEnum).103>104> Новое в версии 3.4.105106#### `socket.AF_UNIX`107108#### `socket.AF_INET`109110#### `socket.AF_INET6`111112Эти константы представляют семейства адресов (и протоколов), используемые для первого аргумента [`socket()`](https://python-all.ru/3.4/library/socket.html#socket.socket). Если константа [`AF_UNIX`](https://python-all.ru/3.4/library/socket.html#socket.AF_UNIX) не определена, то этот протокол не поддерживается. В зависимости от системы могут быть доступны дополнительные константы.113114#### `socket.SOCK_STREAM`115116#### `socket.SOCK_DGRAM`117118#### `socket.SOCK_RAW`119120#### `socket.SOCK_RDM`121122#### `socket.SOCK_SEQPACKET`123124Эти константы представляют типы сокетов, используемые для второго аргумента [`socket()`](https://python-all.ru/3.4/library/socket.html#socket.socket). В зависимости от системы могут быть доступны дополнительные константы. (Обычно полезными считаются только [`SOCK_STREAM`](https://python-all.ru/3.4/library/socket.html#socket.SOCK_STREAM) и [`SOCK_DGRAM`](https://python-all.ru/3.4/library/socket.html#socket.SOCK_DGRAM).)125126#### `socket.SOCK_CLOEXEC`127128#### `socket.SOCK_NONBLOCK`129130Эти две константы, если они определены, можно комбинировать с типами сокетов, что позволяет устанавливать некоторые флаги атомарно (тем самым избегая возможных состояний гонки и необходимости отдельных вызовов).131132> **См. также**133>134> [Безопасная обработка файловых дескрипторов](https://python-all.ru/3.4/library/socket.html) для более подробного объяснения.135136Доступность: Linux \>= 2.6.27.137138Новое в версии 3.2.139140#### `SO_*`141142#### `socket.SOMAXCONN`143144#### `MSG_*`145146#### `SOL_*`147148#### `SCM_*`149150#### `IPPROTO_*`151152#### `IPPORT_*`153154#### `INADDR_*`155156#### `IP_*`157158#### `IPV6_*`159160#### `EAI_*`161162#### `AI_*`163164#### `NI_*`165166#### `TCP_*`167168Многие константы этих форм, описанные в документации Unix по сокетам и/или протоколу IP, также определены в модуле socket. Они обычно используются в аргументах методов `setsockopt()` и `getsockopt()` объектов сокетов. В большинстве случаев определены только те символы, которые есть в заголовочных файлах Unix; для некоторых символов заданы значения по умолчанию.169170#### `socket.AF_CAN`171172#### `socket.PF_CAN`173174#### `SOL_CAN_*`175176#### `CAN_*`177178Множество констант такого вида, описанных в документации Linux, также определены в модуле socket.179180Доступность: Linux \>= 2.6.25.181182Новое в версии 3.3.183184#### `socket.CAN_BCM`185186#### `CAN_BCM_*`187188CAN\_BCM в семействе протоколов CAN – это протокол broadcast manager (BCM). Константы broadcast manager, описанные в документации Linux, также определены в модуле socket.189190Доступность: Linux \>= 2.6.25.191192Новое в версии 3.4.193194#### `socket.AF_RDS`195196#### `socket.PF_RDS`197198#### `socket.SOL_RDS`199200#### `RDS_*`201202Множество констант такого вида, описанных в документации Linux, также определены в модуле socket.203204Доступность: Linux \>= 2.6.30.205206Новое в версии 3.3.207208#### `SIO_*`209210#### `RCVALL_*`211212Константы для функции WSAIoctl() в Windows. Эти константы используются как аргументы метода [`ioctl()`](https://python-all.ru/3.4/library/socket.html#socket.socket.ioctl) объектов сокетов.213214#### `TIPC_*`215216Константы, связанные с TIPC, соответствующие тем, что экспортируются C API сокетов. Дополнительную информацию см. в документации TIPC.217218#### `socket.AF_LINK`219220Доступность: BSD, OSX.221222Новое в версии 3.4.223224#### `socket.has_ipv6`225226Эта константа содержит логическое значение, указывающее, поддерживается ли IPv6 на данной платформе.227228#### `socket.BDADDR_ANY`229230#### `socket.BDADDR_LOCAL`231232Это строковые константы, содержащие Bluetooth-адреса со специальным значением. Например, [`BDADDR_ANY`](https://python-all.ru/3.4/library/socket.html#socket.BDADDR_ANY) можно использовать для указания любого адреса при привязке сокета к `BTPROTO_RFCOMM`.233234#### `socket.HCI_FILTER`235236#### `socket.HCI_TIME_STAMP`237238#### `socket.HCI_DATA_DIR`239240Для использования с `BTPROTO_HCI`. [`HCI_FILTER`](https://python-all.ru/3.4/library/socket.html#socket.HCI_FILTER) недоступен в NetBSD или DragonFlyBSD. [`HCI_TIME_STAMP`](https://python-all.ru/3.4/library/socket.html#socket.HCI_TIME_STAMP) и [`HCI_DATA_DIR`](https://python-all.ru/3.4/library/socket.html#socket.HCI_DATA_DIR) недоступны в FreeBSD, NetBSD или DragonFlyBSD.241242### 18.1.2.3. Функции243244#### 18.1.2.3.1. Создание сокетов245246Все следующие функции создают [*объекты сокетов*](https://python-all.ru/3.4/library/socket.html#socket-objects).247248#### `socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)`249250Создаёт новый сокет с указанным семейством адресов, типом сокета и номером протокола. Семейство адресов должно быть [`AF_INET`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET) (по умолчанию), [`AF_INET6`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET6), [`AF_UNIX`](https://python-all.ru/3.4/library/socket.html#socket.AF_UNIX), [`AF_CAN`](https://python-all.ru/3.4/library/socket.html#socket.AF_CAN) или [`AF_RDS`](https://python-all.ru/3.4/library/socket.html#socket.AF_RDS). Тип сокета должен быть [`SOCK_STREAM`](https://python-all.ru/3.4/library/socket.html#socket.SOCK_STREAM) (по умолчанию), [`SOCK_DGRAM`](https://python-all.ru/3.4/library/socket.html#socket.SOCK_DGRAM), [`SOCK_RAW`](https://python-all.ru/3.4/library/socket.html#socket.SOCK_RAW) или, возможно, одной из других констант `SOCK_`. Номер протокола обычно равен нулю и может быть опущен; в случае, когда семейство адресов – [`AF_CAN`](https://python-all.ru/3.4/library/socket.html#socket.AF_CAN), протокол должен быть одним из `CAN_RAW` или [`CAN_BCM`](https://python-all.ru/3.4/library/socket.html#socket.CAN_BCM). Если указан *fileno*, остальные аргументы игнорируются, и возвращается сокет с указанным файловым дескриптором. В отличие от [`socket.fromfd()`](https://python-all.ru/3.4/library/socket.html#socket.fromfd), *fileno* возвращает тот же сокет, а не его дубликат. Это может помочь закрыть отсоединённый сокет с помощью [`socket.close()`](https://python-all.ru/3.4/library/socket.html#socket.socket.close).251252Новый созданный сокет [*ненаследуемый*](https://python-all.ru/3.4/library/os.html#fd-inheritance).253254Изменено в версии 3.3: Добавлено семейство AF\_CAN. Добавлено семейство AF\_RDS.255256Изменено в версии 3.4: Добавлен протокол CAN\_BCM.257258Изменено в версии 3.4: Возвращаемый сокет теперь ненаследуемый.259260#### `socket.socketpair([family[, type[, proto]]])`261262Создаёт пару соединённых объектов сокетов, используя указанное семейство адресов, тип сокета и номер протокола. Семейство адресов, тип сокета и номер протокола такие же, как для функции [`socket()`](https://python-all.ru/3.4/library/socket.html#socket.socket) выше. Семейство по умолчанию – [`AF_UNIX`](https://python-all.ru/3.4/library/socket.html#socket.AF_UNIX), если оно определено на платформе; в противном случае по умолчанию используется [`AF_INET`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET). Доступность: Unix.263264Новые созданные сокеты [*ненаследуемые*](https://python-all.ru/3.4/library/os.html#fd-inheritance).265266Изменено в версии 3.2: Возвращаемые объекты сокетов теперь поддерживают полный API сокетов, а не подмножество.267268Изменено в версии 3.4: Возвращаемые сокеты теперь являются ненаследуемыми.269270#### `socket.create_connection(address[, timeout[, source_address]])`271272Подключается к TCP-сервису, ожидающему по адресу *address* в Интернете (кортеж из двух элементов `(host, port)`), и возвращает объект сокета. Это функция более высокого уровня, чем [`socket.connect()`](https://python-all.ru/3.4/library/socket.html#socket.socket.connect): если *host* – нечисловое имя хоста, она попытается разрешить его и для [`AF_INET`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET), и для [`AF_INET6`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET6), а затем попробует подключиться ко всем возможным адресам по очереди, пока не произойдёт успешное подключение. Это упрощает написание клиентов, совместимых с IPv4 и IPv6.273274Передача необязательного параметра *timeout* установит тайм-аут для экземпляра сокета перед попыткой подключения. Если *timeout* не указан, используется глобальная настройка тайм-аута по умолчанию, возвращаемая функцией [`getdefaulttimeout()`](https://python-all.ru/3.4/library/socket.html#socket.getdefaulttimeout).275276Если указан, то *source\_address* должен быть кортежем из двух элементов `(host, port)`, чтобы сокет привязывался к нему как к исходному адресу перед подключением. Если host или port равны ‘’ или 0 соответственно, будет использовано поведение ОС по умолчанию.277278Изменено в версии 3.2: Добавлен параметр *source\_address*.279280Изменено в версии 3.2: добавлена поддержка оператора [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with).281282#### `socket.fromfd(fd, family, type, proto=0)`283284Дублирует файловый дескриптор *fd* (целое число, возвращаемое методом `fileno()` объекта файла) и создаёт из результата объект сокета. Семейство адресов, тип сокета и номер протокола такие же, как у функции [`socket()`](https://python-all.ru/3.4/library/socket.html#socket.socket) выше. Файловый дескриптор должен ссылаться на сокет, но это не проверяется – последующие операции с объектом могут завершиться ошибкой, если файловый дескриптор некорректен. Эта функция требуется редко, но может использоваться для получения или установки параметров сокета, переданного программе как стандартный ввод или вывод (например, сервер, запущенный демоном inet в Unix). Предполагается, что сокет находится в блокирующем режиме.285286Новый созданный сокет [*ненаследуемый*](https://python-all.ru/3.4/library/os.html#fd-inheritance).287288Изменено в версии 3.4: Возвращаемый сокет теперь ненаследуемый.289290#### `socket.fromshare(data)`291292Создаёт экземпляр сокета из данных, полученных методом [`socket.share()`](https://python-all.ru/3.4/library/socket.html#socket.socket.share). Предполагается, что сокет находится в блокирующем режиме.293294Доступность: Windows.295296Новое в версии 3.3.297298#### `socket.SocketType`299300Это объект типа Python, представляющий тип объекта сокета. Он эквивалентен `type(socket(...))`.301302#### 18.1.2.3.2. Другие функции303304Модуль [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket) также предоставляет различные сетевые сервисы:305306#### `socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)`307308Преобразует аргументы *host*/*port* в последовательность кортежей из 5 элементов, содержащих все необходимые аргументы для создания сокета, подключённого к этой службе. *host* – это доменное имя, строковое представление IPv4/v6-адреса или `None`. *port* – это строковое имя службы, например `'http'`, числовой номер порта или `None`. Передавая `None` в качестве значения *host* и *port*, можно передать `NULL` в нижележащий C API.309310Аргументы *family*, *type* и *proto* можно указать необязательно, чтобы сузить список возвращаемых адресов. Если передать ноль в качестве значения каждого из этих аргументов, будут выбраны все возможные результаты. Аргумент *flags* может содержать одну или несколько констант `AI_*` и влияет на то, как вычисляются и возвращаются результаты. Например, `AI_NUMERICHOST` отключает разрешение доменных имён и вызовет ошибку, если *host* является доменным именем.311312Функция возвращает список кортежей из 5 элементов со следующей структурой:313314`(family, type, proto, canonname, sockaddr)`315316В этих кортежах *family*, *type*, *proto* – целые числа, и их следует передавать функции [`socket()`](https://python-all.ru/3.4/library/socket.html#socket.socket). *canonname* будет строкой, представляющей каноническое имя *host*, если `AI_CANONNAME` входит в аргумент *flags*; в противном случае *canonname* будет пустым. *sockaddr* – это кортеж, описывающий адрес сокета, формат которого зависит от возвращённого *family* (кортеж из 2 элементов `(address, port)` для [`AF_INET`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET), кортеж из 4 элементов `(address, port, flow info, scope id)` для [`AF_INET6`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET6)), и предназначен для передачи методу [`socket.connect()`](https://python-all.ru/3.4/library/socket.html#socket.socket.connect).317318Следующий пример получает информацию об адресе для гипотетического TCP-подключения к `example.org` на порту 80 (результаты могут отличаться в вашей системе, если IPv6 не включён):319320```python321>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP)322[(<AddressFamily.AF_INET6: 10>, <SocketType.SOCK_STREAM: 1>,323 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),324 (<AddressFamily.AF_INET: 2>, <SocketType.SOCK_STREAM: 1>,325 6, '', ('93.184.216.34', 80))]326```327328Изменено в версии 3.2: теперь параметры можно передавать в виде именованных аргументов.329330#### `socket.getfqdn([name])`331332Возвращает полное доменное имя для *name*. Если *name* опущен или пуст, он интерпретируется как локальный хост. Чтобы найти полное имя, проверяется имя хоста, возвращённое [`gethostbyaddr()`](https://python-all.ru/3.4/library/socket.html#socket.gethostbyaddr), а затем, при наличии, псевдонимы хоста. Выбирается первое имя, содержащее точку. Если полное доменное имя недоступно, возвращается имя хоста, полученное через [`gethostname()`](https://python-all.ru/3.4/library/socket.html#socket.gethostname).333334#### `socket.gethostbyname(hostname)`335336Преобразует имя хоста в формат IPv4-адреса. IPv4-адрес возвращается в виде строки, например `'100.50.200.5'`. Если само имя хоста является IPv4-адресом, оно возвращается без изменений. См. [`gethostbyname_ex()`](https://python-all.ru/3.4/library/socket.html#socket.gethostbyname_ex) для более полного интерфейса. [`gethostbyname()`](https://python-all.ru/3.4/library/socket.html#socket.gethostbyname) не поддерживает разрешение имён IPv6, поэтому для поддержки dual stack IPv4/v6 следует использовать [`getaddrinfo()`](https://python-all.ru/3.4/library/socket.html#socket.getaddrinfo).337338#### `socket.gethostbyname_ex(hostname)`339340Преобразует имя хоста в формат IPv4-адреса, расширенный интерфейс. Возвращает тройку `(hostname, aliaslist, ipaddrlist)`, где *hostname* – основное имя хоста, отвечающего на заданный *ip\_address*, *aliaslist* – (возможно, пустой) список альтернативных имён хоста для того же адреса, а *ipaddrlist* – список IPv4-адресов того же интерфейса на том же хосте (часто, но не всегда, один адрес). [`gethostbyname_ex()`](https://python-all.ru/3.4/library/socket.html#socket.gethostbyname_ex) не поддерживает разрешение имён IPv6, поэтому для поддержки dual stack IPv4/v6 следует использовать [`getaddrinfo()`](https://python-all.ru/3.4/library/socket.html#socket.getaddrinfo).341342#### `socket.gethostname()`343344Возвращает строку, содержащую имя хоста машины, на которой в данный момент выполняется интерпретатор Python.345346Если нужно узнать IP-адрес текущей машины, можно использовать `gethostbyname(gethostname())`. Эта операция предполагает, что существует корректное отображение адреса на хост, и это предположение выполняется не всегда.347348Примечание: [`gethostname()`](https://python-all.ru/3.4/library/socket.html#socket.gethostname) не всегда возвращает полное доменное имя; для этого используйте [``getfqdn()](https://python-all.ru/3.4/library/socket.html#socket.getfqdn).349350#### `socket.gethostbyaddr(ip_address)`351352Возвращает тройку `(hostname, aliaslist, ipaddrlist)`, где *hostname* – основное имя хоста, отвечающего на заданный *ip\_address*, *aliaslist* – (возможно, пустой) список альтернативных имён хоста для того же адреса, а *ipaddrlist* – список IPv4/v6-адресов того же интерфейса на том же хосте (скорее всего, содержащий только один адрес). Чтобы найти полное доменное имя, используйте функцию [`getfqdn()`](https://python-all.ru/3.4/library/socket.html#socket.getfqdn). [`gethostbyaddr()`](https://python-all.ru/3.4/library/socket.html#socket.gethostbyaddr) поддерживает как IPv4, так и IPv6.353354#### `socket.getnameinfo(sockaddr, flags)`355356Преобразует адрес сокета *sockaddr* в кортеж из двух элементов `(host, port)`. В зависимости от настроек *flags* результат может содержать полное доменное имя или числовое представление адреса в *host*. Аналогично, *port* может содержать строковое имя порта или числовой номер порта.357358#### `socket.getprotobyname(protocolname)`359360Преобразует имя интернет-протокола (например, `'icmp'`) в константу, пригодную для передачи в качестве (необязательного) третьего аргумента функции [`socket()`](https://python-all.ru/3.4/library/socket.html#socket.socket). Обычно это требуется только для сокетов, открытых в «сыром» режиме ([`SOCK_RAW`](https://python-all.ru/3.4/library/socket.html#socket.SOCK_RAW)); для обычных режимов сокета правильный протокол выбирается автоматически, если протокол опущен или равен нулю.361362#### `socket.getservbyname(servicename[, protocolname])`363364Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если указано, должно быть `'tcp'` или `'udp'`, в противном случае подойдёт любой протокол.365366#### `socket.getservbyport(port[, protocolname])`367368Преобразует номер порта и имя протокола в имя службы для этой службы. Необязательное имя протокола, если указано, должно быть `'tcp'` или `'udp'`, иначе подойдет любой протокол.369370#### `socket.ntohl(x)`371372Преобразует 32-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта операция ничего не делает; в противном случае выполняется перестановка 4 байтов.373374#### `socket.ntohs(x)`375376Преобразует 16-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.377378#### `socket.htonl(x)`379380Преобразует 32-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен четырёх байтов.381382#### `socket.htons(x)`383384Преобразует 16-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.385386#### `socket.inet_aton(ip_string)`387388Преобразует IPv4-адрес из строкового формата с точками (например, '123.45.67.89') в 32-битный упакованный двоичный формат в виде объекта bytes длиной четыре символа. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `struct in_addr`, который является типом C для 32-битного упакованного двоичного представления, возвращаемого этой функцией.389390[`inet_aton()`](https://python-all.ru/3.4/library/socket.html#socket.inet_aton) также принимает строки с менее чем тремя точками; подробнее см. в руководстве Unix *inet(3)*.391392Если переданная этой функции строка IPv4-адреса недействительна, будет возбуждено [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError). Обратите внимание, что точное определение допустимости зависит от базовой реализации C функции `inet_aton()`.393394[`inet_aton()`](https://python-all.ru/3.4/library/socket.html#socket.inet_aton) не поддерживает IPv6, и для поддержки двойного стека IPv4/IPv6 вместо него следует использовать [`inet_pton()`](https://python-all.ru/3.4/library/socket.html#socket.inet_pton).395396#### `socket.inet_ntoa(packed_ip)`397398Преобразует 32-битный упакованный IPv4-адрес (объект bytes длиной четыре символа) в его стандартное строковое представление с точками (например, '123.45.67.89'). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `struct in_addr`, который является типом C для 32-битных упакованных двоичных данных, принимаемых этой функцией в качестве аргумента.399400Если переданная этой функции последовательность байтов имеет длину не ровно 4 байта, будет возбуждено [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError). [`inet_ntoa()`](https://python-all.ru/3.4/library/socket.html#socket.inet_ntoa) не поддерживает IPv6, и для поддержки двойного стека IPv4/IPv6 вместо него следует использовать [`inet_ntop()`](https://python-all.ru/3.4/library/socket.html#socket.inet_ntop).401402#### `socket.inet_pton(address_family, ip_string)`403404Преобразует IP-адрес из строкового формата, зависящего от семейства, в упакованный двоичный формат. [`inet_pton()`](https://python-all.ru/3.4/library/socket.html#socket.inet_pton) полезен, когда библиотека или сетевой протокол требует объект типа `struct in_addr` (аналогично [`inet_aton()`](https://python-all.ru/3.4/library/socket.html#socket.inet_aton)) или `struct in6_addr`.405406В настоящее время поддерживаемыми значениями для *address\_family* являются [`AF_INET`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET) и [`AF_INET6`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET6). Если строка IP-адреса *ip\_string* недействительна, будет возбуждено [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError). Обратите внимание, что точное определение допустимости зависит как от значения *address\_family*, так и от базовой реализации `inet_pton()`.407408Доступность: Unix (возможно, не все платформы), Windows.409410Изменено в версии 3.4: Добавлена поддержка Windows411412#### `socket.inet_ntop(address_family, packed_ip)`413414Convert a packed IP address (a bytes object of some number of characters) to its standard, family-specific string representation (for example, `'7.10.0.5'` or `'5aef:2b::8'`). [`inet_ntop()`](https://python-all.ru/3.4/library/socket.html#socket.inet_ntop) is useful when a library or network protocol returns an object of type `struct in_addr` (similar to [`inet_ntoa()`](https://python-all.ru/3.4/library/socket.html#socket.inet_ntoa)) or `struct in6_addr`.415416Supported values for *address\_family* are currently [`AF_INET`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET) and [`AF_INET6`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET6). If the string *packed\_ip* is not the correct length for the specified address family, [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError) will be raised. [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError) is raised for errors from the call to [`inet_ntop()`](https://python-all.ru/3.4/library/socket.html#socket.inet_ntop).417418Доступность: Unix (возможно, не все платформы), Windows.419420Изменено в версии 3.4: Добавлена поддержка Windows421422#### `socket.CMSG_LEN(length)`423424Возвращает общую длину (без завершающего выравнивания) элемента вспомогательных данных с соответствующими данными заданной *length*. Это значение часто можно использовать как размер буфера для [`recvmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg) для получения одного элемента вспомогательных данных, но [**RFC 3542**](https://python-all.ru/3.4/library/socket.html) требует от переносимых приложений использования [`CMSG_SPACE()`](https://python-all.ru/3.4/library/socket.html#socket.CMSG_SPACE) и, таким образом, включения пространства для выравнивания, даже если элемент будет последним в буфере. Возбуждает [`OverflowError`](https://python-all.ru/3.4/library/exceptions.html#OverflowError), если *length* выходит за допустимый диапазон значений.425426Доступность: большинство платформ Unix, возможно, и другие.427428Новое в версии 3.3.429430#### `socket.CMSG_SPACE(length)`431432Возвращает размер буфера, необходимый для [`recvmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg) для получения элемента вспомогательных данных с соответствующими данными заданной *length*, включая любое завершающее выравнивание. Пробел буфера, необходимый для получения нескольких элементов, представляет собой сумму значений [`CMSG_SPACE()`](https://python-all.ru/3.4/library/socket.html#socket.CMSG_SPACE) для соответствующих длин данных. Возбуждает [`OverflowError`](https://python-all.ru/3.4/library/exceptions.html#OverflowError), если *length* выходит за допустимый диапазон значений.433434Обратите внимание, что некоторые системы могут поддерживать вспомогательные данные, не предоставляя эту функцию. Также обратите внимание, что установка размера буфера с использованием результатов этой функции может не точно ограничить объём принимаемых вспомогательных данных, поскольку дополнительные данные могут поместиться в область выравнивания.435436Доступность: большинство платформ Unix, возможно, и другие.437438Новое в версии 3.3.439440#### `socket.getdefaulttimeout()`441442Возвращает тайм-аут по умолчанию в секундах (float) для новых сокетов. Значение `None` означает, что новые сокеты не имеют тайм-аута. При первом импорте модуля socket значение по умолчанию равно `None`.443444#### `socket.setdefaulttimeout(timeout)`445446Устанавливает тайм-аут по умолчанию в секундах (float) для новых сокетов. При первом импорте модуля socket значение по умолчанию равно `None`. См. [`settimeout()`](https://python-all.ru/3.4/library/socket.html#socket.socket.settimeout) для возможных значений и их соответствующих значений.447448#### `socket.sethostname(name)`449450Устанавливает имя хоста машины в *name*. Если прав недостаточно, будет возбуждено [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError).451452Доступность: Unix.453454Новое в версии 3.3.455456#### `socket.if_nameindex()`457458Возвращает список кортежей с информацией о сетевых интерфейсах (индекс int, имя string). [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError), если системный вызов завершается неудачей.459460Доступность: Unix.461462Новое в версии 3.3.463464#### `socket.if_nametoindex(if_name)`465466Возвращает номер индекса сетевого интерфейса, соответствующий имени интерфейса. [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError), если интерфейса с указанным именем не существует.467468Доступность: Unix.469470Новое в версии 3.3.471472#### `socket.if_indextoname(if_index)`473474Возвращает имя сетевого интерфейса, соответствующее номеру индекса интерфейса. [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError), если интерфейса с указанным индексом не существует.475476Доступность: Unix.477478Новое в версии 3.3.479480## 18.1.3. Объекты сокетов481482Объекты сокетов имеют следующие методы. За исключением [`makefile()`](https://python-all.ru/3.4/library/socket.html#socket.socket.makefile), они соответствуют системным вызовам Unix, применимым к сокетам.483484#### `socket.accept()`485486Принимает соединение. Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение – пара `(conn, address)`, где *conn* – это *новый* объект сокета, который можно использовать для отправки и получения данных по соединению, а *address* – это адрес, привязанный к сокету на другом конце соединения.487488Новый созданный сокет [*ненаследуемый*](https://python-all.ru/3.4/library/os.html#fd-inheritance).489490Изменено в версии 3.4: Сокет теперь ненаследуемый.491492#### `socket.bind(address)`493494Привязывает сокет к *address*. Сокет не должен быть уже привязан. (Формат *address* зависит от семейства адресов – см. выше.)495496#### `socket.close()`497498Помечает сокет как закрытый. Базовый системный ресурс (например, файловый дескриптор) также закрывается, когда все файловые объекты из [`makefile()`](https://python-all.ru/3.4/library/socket.html#socket.socket.makefile) закрыты. Как только это происходит, все последующие операции с объектом сокета завершаются ошибкой. Удаленная сторона больше не будет получать данные (после сброса поставленных в очередь данных).499500Сокеты автоматически закрываются при сборке мусора, но рекомендуется явно закрывать их с помощью [`close()`](https://python-all.ru/3.4/library/socket.html#socket.socket.close) или использовать оператор [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with) для работы с ними.501502> **Примечание**503>504> [`close()`](https://python-all.ru/3.4/library/socket.html#socket.socket.close) освобождает ресурс, связанный с соединением, но не обязательно закрывает соединение немедленно. Если требуется вовремя закрыть соединение, вызовите [`shutdown()`](https://python-all.ru/3.4/library/socket.html#socket.socket.shutdown) перед [`close()`](https://python-all.ru/3.4/library/socket.html#socket.socket.close).505506#### `socket.connect(address)`507508Подключается к удалённому сокету по адресу *address*. (Формат *address* зависит от семейства адресов – см. выше.)509510#### `socket.connect_ex(address)`511512Как и `connect(address)`, но возвращает индикатор ошибки вместо вызова исключения для ошибок, возвращаемых вызовом `connect()` на уровне C (другие проблемы, такие как «хост не найден», по-прежнему могут вызывать исключения). Индикатор ошибки равен `0`, если операция выполнена успешно, в противном случае – значению переменной `errno`. Это полезно, например, для поддержки асинхронных соединений.513514#### `socket.detach()`515516Переводит объект сокета в закрытое состояние без фактического закрытия базового файлового дескриптора. Файловый дескриптор возвращается и может быть повторно использован для других целей.517518Новое в версии 3.2.519520#### `socket.dup()`521522Дублирует сокет.523524Новый созданный сокет [*ненаследуемый*](https://python-all.ru/3.4/library/os.html#fd-inheritance).525526Изменено в версии 3.4: Сокет теперь ненаследуемый.527528#### `socket.fileno()`529530Возвращает файловый дескриптор сокета (небольшое целое число). Это полезно с [`select.select()`](https://python-all.ru/3.4/library/select.html#select.select).531532В Windows небольшое целое число, возвращаемое этим методом, нельзя использовать там, где может использоваться файловый дескриптор (например, в [`os.fdopen()`](https://python-all.ru/3.4/library/os.html#os.fdopen)). В Unix такого ограничения нет.533534#### `socket.get_inheritable()`535536Возвращает [*флаг наследуемости*](https://python-all.ru/3.4/library/os.html#fd-inheritance) файлового дескриптора сокета или дескриптора сокета: `True`, если сокет может наследоваться в дочерних процессах, и `False` – если нет.537538Новое в версии 3.4.539540#### `socket.getpeername()`541542Возвращает удалённый адрес, к которому подключён сокет. Это полезно, например, для определения номера порта удалённого сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов – см. выше.) На некоторых системах эта функция не поддерживается.543544#### `socket.getsockname()`545546Возвращает собственный адрес сокета. Это полезно, например, для определения номера порта сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов – см. выше.)547548#### `socket.getsockopt(level, optname[, buflen])`549550Возвращает значение указанной опции сокета (см. страницу man Unix *getsockopt(2)*). Необходимые символьные константы (`SO_*` и т.д.) определены в этом модуле. Если *buflen* отсутствует, предполагается целочисленная опция, и функция возвращает её целочисленное значение. Если *buflen* присутствует, он задает максимальную длину буфера для получения опции, и этот буфер возвращается в виде объекта bytes. Вызывающий код должен сам декодировать содержимое буфера (см. опциональный встроенный модуль [`struct`](https://python-all.ru/3.4/library/struct.html#module-struct) для способа декодирования структур C, закодированных как байтовые строки).551552#### `socket.gettimeout()`553554Возвращает тайм-аут в секундах (число с плавающей точкой), связанный с операциями сокета, или `None`, если тайм-аут не установлен. Это значение отражает последний вызов [`setblocking()`](https://python-all.ru/3.4/library/socket.html#socket.socket.setblocking) или [`settimeout()`](https://python-all.ru/3.4/library/socket.html#socket.socket.settimeout).555556#### `socket.ioctl(control, option)`557558| Платформа: | Windows |559| --- | --- |560561Метод [`ioctl()`](https://python-all.ru/3.4/library/socket.html#socket.socket.ioctl) представляет собой ограниченный интерфейс к системному интерфейсу WSAIoctl. Для получения дополнительной информации обратитесь к [документации Win32](https://python-all.ru/3.4/library/socket.html).562563On other platforms, the generic [`fcntl.fcntl()`](https://python-all.ru/3.4/library/fcntl.html#fcntl.fcntl) and [`fcntl.ioctl()`](https://python-all.ru/3.4/library/fcntl.html#fcntl.ioctl) functions may be used; they accept a socket object as their first argument.564565#### `socket.listen(backlog)`566567Ожидает подключения к сокету. Аргумент *backlog* задаёт максимальное количество ожидающих соединений в очереди и должен быть не меньше 0; максимальное значение зависит от системы (обычно 5), минимальное принудительно устанавливается в 0.568569#### `socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)`570571Возвращает [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object), связанный с сокетом. Точный возвращаемый тип зависит от аргументов, переданных в [`makefile()`](https://python-all.ru/3.4/library/socket.html#socket.socket.makefile). Эти аргументы интерпретируются так же, как и встроенной функцией [`open()`](https://python-all.ru/3.4/library/functions.html#open).572573Сокет должен быть в блокирующем режиме; можно установить тайм-аут, но при его срабатывании внутренний буфер файлового объекта может оказаться в несогласованном состоянии.574575Закрытие файлового объекта, возвращённого [`makefile()`](https://python-all.ru/3.4/library/socket.html#socket.socket.makefile), не закроет исходный сокет, пока не будут закрыты все остальные файловые объекты и для объекта сокета не будет вызван [`socket.close()`](https://python-all.ru/3.4/library/socket.html#socket.socket.close).576577> **Примечание**578>579> В Windows файлоподобный объект, созданный [`makefile()`](https://python-all.ru/3.4/library/socket.html#socket.socket.makefile), нельзя использовать там, где требуется файловый объект с файловым дескриптором, например в аргументах потока [`subprocess.Popen()`](https://python-all.ru/3.4/library/subprocess.html#subprocess.Popen).580581#### `socket.recv(bufsize[, flags])`582583Получает данные из сокета. Возвращает объект bytes с полученными данными. Максимальный объём данных за одно получение задаётся параметром *bufsize*. Значение необязательного аргумента *flags* описано на странице руководства Unix *recv(2)*; по умолчанию он равен нулю.584585> **Примечание**586>587> Для наилучшего соответствия реальным характеристикам оборудования и сети значение *bufsize* должно быть относительно небольшой степенью двойки, например, 4096.588589#### `socket.recvfrom(bufsize[, flags])`590591Receive data from the socket. The return value is a pair `(bytes, address)` where *bytes* is a bytes object representing the data received and *address* is the address of the socket sending the data. See the Unix manual page *recv(2)* for the meaning of the optional argument *flags*; it defaults to zero. (The format of *address* depends on the address family – see above.)592593#### `socket.recvmsg(bufsize[, ancbufsize[, flags]])`594595Получает из сокета обычные данные (до *bufsize* байт) и вспомогательные данные. Аргумент *ancbufsize* задаёт размер внутреннего буфера для вспомогательных данных в байтах; по умолчанию равен 0, то есть вспомогательные данные не принимаются. Подходящие размеры буфера для вспомогательных данных можно вычислить с помощью [`CMSG_SPACE()`](https://python-all.ru/3.4/library/socket.html#socket.CMSG_SPACE) или [`CMSG_LEN()`](https://python-all.ru/3.4/library/socket.html#socket.CMSG_LEN); элементы, не помещающиеся в буфер, могут быть обрезаны или отброшены. Аргумент *flags* по умолчанию равен 0 и имеет то же значение, что и для [`recv()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recv).596597Возвращаемое значение – кортеж из 4 элементов: `(data, ancdata, msg_flags, address)`. Элемент *data* – объект [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes), содержащий принятые невспомогательные данные. Элемент *ancdata* – список из нуля или более кортежей `(cmsg_level, cmsg_type, cmsg_data)`, представляющих полученные вспомогательные данные (управляющие сообщения): *cmsg\_level* и *cmsg\_type* – целые числа, задающие уровень протокола и тип в рамках протокола соответственно, а *cmsg\_data* – объект [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes) с соответствующими данными. Элемент *msg\_flags* – побитовое ИЛИ различных флагов, указывающих на условия полученного сообщения; подробности смотрите в системной документации. Если принимающий сокет не подключён, *address* – адрес отправляющего сокета, если он доступен; в противном случае его значение не определено.598599В некоторых системах [`sendmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.sendmsg) и [`recvmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg) можно использовать для передачи файловых дескрипторов между процессами через сокет [`AF_UNIX`](https://python-all.ru/3.4/library/socket.html#socket.AF_UNIX). При использовании этой возможности (она часто ограничена сокетами [`SOCK_STREAM`](https://python-all.ru/3.4/library/socket.html#socket.SOCK_STREAM)) [`recvmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg) вернёт во вспомогательных данных элементы вида `(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)`, где *fds* – объект [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes), представляющий новые файловые дескрипторы в виде двоичного массива нативного типа C `int`. Если [`recvmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg) вызывает исключение после возврата системного вызова, она сначала попытается закрыть все файловые дескрипторы, полученные через этот механизм.600601Некоторые системы не указывают усечённую длину элементов вспомогательных данных, которые были получены лишь частично. Если элемент выходит за пределы буфера, [`recvmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg) выдаст [`RuntimeWarning`](https://python-all.ru/3.4/library/exceptions.html#RuntimeWarning) и вернёт ту часть, которая находится в буфере, при условии, что он не был усечён до начала своих данных.602603В системах, поддерживающих механизм `SCM_RIGHTS`, следующая функция будет получать до *maxfds* файловых дескрипторов, возвращая данные сообщения и список с дескрипторами (игнорируя неожиданные ситуации, такие как получение посторонних управляющих сообщений). См. также [`sendmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.sendmsg).604605```python606import socket, array607608def recv_fds(sock, msglen, maxfds):609 fds = array.array("i") # Массив целых чисел610 msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))611 for cmsg_level, cmsg_type, cmsg_data in ancdata:612 if (cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS):613 # Добавить данные, игнорируя любые усечённые целые числа в конце.614 fds.fromstring(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])615 return msg, list(fds)616```617618Доступность: большинство платформ Unix, возможно, и другие.619620Новое в версии 3.3.621622#### `socket.recvmsg_into(buffers[, ancbufsize[, flags]])`623624Получает из сокета обычные и вспомогательные данные, ведя себя как [`recvmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg), но разбрасывает невспомогательные данные по нескольким буферам, а не возвращает новый объект bytes. Аргумент *buffers* должен быть итерируемым объектом, элементы которого предоставляют буферы для записи (например, объекты [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray)); они будут заполняться последовательными частями невспомогательных данных, пока те не будут полностью записаны или не кончатся буферы. Операционная система может устанавливать ограничение (значение [`sysconf()`](https://python-all.ru/3.4/library/os.html#os.sysconf) `SC_IOV_MAX`) на количество используемых буферов. Аргументы *ancbufsize* и *flags* имеют то же значение, что и для [`recvmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg).625626Возвращаемое значение – кортеж из 4 элементов: `(nbytes, ancdata, msg_flags, address)`, где *nbytes* – общее количество байт невспомогательных данных, записанных в буферы, а *ancdata*, *msg\_flags* и *address* такие же, как для [`recvmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg).627628Пример:629630```python631>>> import socket632>>> s1, s2 = socket.socketpair()633>>> b1 = bytearray(b'----')634>>> b2 = bytearray(b'0123456789')635>>> b3 = bytearray(b'--------------')636>>> s1.send(b'Mary had a little lamb')63722638>>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])639(22, [], 0, None)640>>> [b1, b2, b3]641[bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]642```643644Доступность: большинство платформ Unix, возможно, и другие.645646Новое в версии 3.3.647648#### `socket.recvfrom_into(buffer[, nbytes[, flags]])`649650Receive data from the socket, writing it into *buffer* instead of creating a new bytestring. The return value is a pair `(nbytes, address)` where *nbytes* is the number of bytes received and *address* is the address of the socket sending the data. See the Unix manual page *recv(2)* for the meaning of the optional argument *flags*; it defaults to zero. (The format of *address* depends on the address family – see above.)651652#### `socket.recv_into(buffer[, nbytes[, flags]])`653654Получает из сокета до *nbytes* байтов, сохраняя данные в буфер, а не создавая новую строку байтов. Если *nbytes* не указан (или равен 0), принимает столько байтов, сколько помещается в переданный буфер. Возвращает количество полученных байтов. Значение необязательного аргумента *flags* описано на странице руководства Unix *recv(2)*; по умолчанию он равен нулю.655656#### `socket.send(bytes[, flags])`657658Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент *flags* имеет то же значение, что и для [`recv()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recv) выше. Возвращает количество отправленных байт. Приложения должны проверять, что все данные были отправлены; если передана только часть данных, приложению необходимо попытаться доставить остаток. Дополнительную информацию по этой теме можно найти в [*Socket Programming HOWTO*](https://python-all.ru/3.4/howto/sockets.html#socket-howto).659660#### `socket.sendall(bytes[, flags])`661662Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент *flags* имеет то же значение, что и для [`recv()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recv) выше. В отличие от [`send()`](https://python-all.ru/3.4/library/socket.html#socket.socket.send), этот метод продолжает отправлять данные из *bytes*, пока не будут отправлены все данные или не возникнет ошибка. В случае успеха возвращается `None`. При ошибке вызывается исключение, и невозможно определить, сколько данных (если вообще было) было успешно отправлено.663664#### `socket.sendto(bytes, address)`665666#### `socket.sendto(bytes, flags, address)`667668Отправляет данные в сокет. Сокет не должен быть подключён к удалённому сокету, так как целевой сокет задаётся аргументом *address*. Необязательный аргумент *flags* имеет то же значение, что и для [`recv()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recv) выше. Возвращает количество отправленных байт. (Формат *address* зависит от семейства адресов – см. выше.)669670#### `socket.sendmsg(buffers[, ancdata[, flags[, address]]])`671672Отправляет в сокет обычные и вспомогательные данные, собирая невспомогательные данные из нескольких буферов и объединяя их в одно сообщение. Аргумент *buffers* задаёт невспомогательные данные как итерируемый объект из [*bytes-like объектов*](https://python-all.ru/3.4/glossary.html#term-bytes-like-object) (например, объекты [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes)); операционная система может устанавливать ограничение (значение [`sysconf()`](https://python-all.ru/3.4/library/os.html#os.sysconf) `SC_IOV_MAX`) на количество используемых буферов. Аргумент *ancdata* задаёт вспомогательные данные (управляющие сообщения) как итерируемый объект из нуля или более кортежей `(cmsg_level, cmsg_type, cmsg_data)`, где *cmsg\_level* и *cmsg\_type* – целые числа, задающие уровень протокола и тип в рамках протокола соответственно, а *cmsg\_data* – bytes-like объект с соответствующими данными. Обратите внимание, что некоторые системы (в частности, системы без [`CMSG_SPACE()`](https://python-all.ru/3.4/library/socket.html#socket.CMSG_SPACE)) могут поддерживать отправку только одного управляющего сообщения за вызов. Аргумент *flags* по умолчанию равен 0 и имеет то же значение, что и для [`send()`](https://python-all.ru/3.4/library/socket.html#socket.socket.send). Если *address* указан и не равен `None`, он задаёт адрес назначения сообщения. Возвращаемое значение – количество отправленных байт невспомогательных данных.673674Следующая функция отправляет список файловых дескрипторов *fds* через сокет [`AF_UNIX`](https://python-all.ru/3.4/library/socket.html#socket.AF_UNIX) в системах, поддерживающих механизм `SCM_RIGHTS`. См. также [`recvmsg()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recvmsg).675676```python677import socket, array678679def send_fds(sock, msg, fds):680 return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])681```682683Доступность: большинство платформ Unix, возможно, и другие.684685Новое в версии 3.3.686687#### `socket.set_inheritable(inheritable)`688689Устанавливает [*флаг наследования*](https://python-all.ru/3.4/library/os.html#fd-inheritance) файлового дескриптора сокета или дескриптора сокета.690691Новое в версии 3.4.692693#### `socket.setblocking(flag)`694695Устанавливает блокирующий или неблокирующий режим сокета: если *flag* равен false, сокет переводится в неблокирующий режим, иначе в блокирующий.696697Этот метод является сокращением для некоторых вызовов [`settimeout()`](https://python-all.ru/3.4/library/socket.html#socket.socket.settimeout):698699- `sock.setblocking(True)` эквивалентно `sock.settimeout(None)`700- `sock.setblocking(False)` эквивалентно `sock.settimeout(0.0)`701702#### `socket.settimeout(value)`703704Устанавливает тайм-аут для блокирующих операций с сокетом. Аргумент *value* может быть неотрицательным числом с плавающей запятой, выражающим секунды, или `None`. Если задано ненулевое значение, последующие операции с сокетом будут вызывать исключение [`timeout`](https://python-all.ru/3.4/library/socket.html#socket.timeout), если период тайм-аута *value* истек до завершения операции. Если задан ноль, сокет переводится в неблокирующий режим. Если задано `None`, сокет переводится в блокирующий режим.705706Для получения дополнительной информации обратитесь к [*заметкам о тайм-аутах сокетов*](https://python-all.ru/3.4/library/socket.html#socket-timeouts).707708#### `socket.setsockopt(level, optname, value)`709710Устанавливает значение указанной опции сокета (см. страницу руководства Unix *setsockopt(2)*). Необходимые символические константы определены в модуле [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket) (`SO_*` и т.д.). Значение может быть целым числом или объектом bytes, представляющим буфер. В последнем случае вызывающий должен убедиться, что последовательность байтов содержит правильные биты (см. опциональный встроенный модуль [`struct`](https://python-all.ru/3.4/library/struct.html#module-struct) для способа кодирования C-структур в виде байтовых строк).711712#### `socket.shutdown(how)`713714Завершает одну или обе половины соединения. Если *how* равно `SHUT_RD`, дальнейший приём запрещён. Если *how* равно `SHUT_WR`, дальнейшая отправка запрещена. Если *how* равно `SHUT_RDWR`, дальнейшие отправка и приём запрещены.715716#### `socket.share(process_id)`717718Дублирует сокет и подготавливает его для передачи целевому процессу. Целевой процесс должен быть указан с помощью *process\_id*. Полученный объект bytes затем может быть передан целевому процессу с использованием какой-либо формы межпроцессного взаимодействия, и сокет может быть воссоздан там с помощью [`fromshare()`](https://python-all.ru/3.4/library/socket.html#socket.fromshare). После вызова этого метода сокет можно безопасно закрыть, так как операционная система уже продублировала его для целевого процесса.719720Доступность: Windows.721722Новое в версии 3.3.723724Обратите внимание, что методов `read()` или `write()` не существует; вместо них используйте [`recv()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recv) и [`send()`](https://python-all.ru/3.4/library/socket.html#socket.socket.send) без аргумента *flags*.725726Объекты сокетов также имеют следующие (только для чтения) атрибуты, которые соответствуют значениям, переданным конструктору [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket).727728#### `socket.family`729730Семейство сокета.731732#### `socket.type`733734Тип сокета.735736#### `socket.proto`737738Протокол сокета.739740## 18.1.4. Замечания по тайм-аутам сокетов741742Объект сокета может находиться в одном из трёх режимов: блокирующем, неблокирующем или с тайм-аутом. По умолчанию сокеты всегда создаются в блокирующем режиме, но это можно изменить, вызвав [`setdefaulttimeout()`](https://python-all.ru/3.4/library/socket.html#socket.setdefaulttimeout).743744- В *блокирующем режиме* операции блокируются до завершения или пока система не вернет ошибку (например, истекло время соединения).745- В *неблокирующем режиме* операции завершаются ошибкой (с ошибкой, которая, к сожалению, зависит от системы), если их нельзя выполнить немедленно: функции из модуля [`select`](https://python-all.ru/3.4/library/select.html#module-select) можно использовать, чтобы узнать, когда и доступен ли сокет для чтения или записи.746- В *режиме с тайм-аутом* операции завершаются ошибкой, если их нельзя выполнить в течение тайм-аута, указанного для сокета (они вызывают исключение [`timeout`](https://python-all.ru/3.4/library/socket.html#socket.timeout)), или если система возвращает ошибку.747748> **Примечание**749>750> На уровне операционной системы сокеты в *режиме с тайм-аутом* внутренне устанавливаются в неблокирующий режим. Кроме того, блокирующий режим и режим тайм-аута разделяются между файловыми дескрипторами и объектами сокетов, которые относятся к одной и той же сетевой конечной точке. Эта деталь реализации может иметь заметные последствия, если, например, вы решите использовать [`fileno()`](https://python-all.ru/3.4/library/socket.html#socket.socket.fileno) сокета.751752### 18.1.4.1. Тайм-ауты и метод `connect`753754Операция [`connect()`](https://python-all.ru/3.4/library/socket.html#socket.socket.connect) также подчиняется настройке тайм-аута, и в целом рекомендуется вызывать [`settimeout()`](https://python-all.ru/3.4/library/socket.html#socket.socket.settimeout) перед вызовом [`connect()`](https://python-all.ru/3.4/library/socket.html#socket.socket.connect) или передавать параметр тайм-аута в [`create_connection()`](https://python-all.ru/3.4/library/socket.html#socket.create_connection). Однако сетевой стек системы также может вернуть собственную ошибку тайм-аута соединения независимо от любой настройки тайм-аута сокета Python.755756### 18.1.4.2. Тайм-ауты и метод `accept`757758Если [`getdefaulttimeout()`](https://python-all.ru/3.4/library/socket.html#socket.getdefaulttimeout) не равно [`None`](https://python-all.ru/3.4/library/constants.html#None), сокеты, возвращаемые методом [`accept()`](https://python-all.ru/3.4/library/socket.html#socket.socket.accept), наследуют этот тайм-аут. В противном случае поведение зависит от настроек прослушивающего сокета:759760- если прослушивающий сокет находится в *блокирующем режиме* или в *режиме с тайм-аутом*, сокет, возвращённый [`accept()`](https://python-all.ru/3.4/library/socket.html#socket.socket.accept), находится в *блокирующем режиме*;761- если прослушивающий сокет находится в *неблокирующем режиме*, то, будет ли сокет, возвращённый [`accept()`](https://python-all.ru/3.4/library/socket.html#socket.socket.accept), в блокирующем или неблокирующем режиме, зависит от операционной системы. Если вы хотите обеспечить кроссплатформенное поведение, рекомендуется вручную переопределить эту настройку.762763## 18.1.5. Пример764765Вот четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который отправляет обратно все полученные данные (обслуживая только одного клиента), и клиент, использующий его. Обратите внимание, что сервер должен выполнить последовательность [`socket()`](https://python-all.ru/3.4/library/socket.html#socket.socket), [`bind()`](https://python-all.ru/3.4/library/socket.html#socket.socket.bind), [`listen()`](https://python-all.ru/3.4/library/socket.html#socket.socket.listen), [`accept()`](https://python-all.ru/3.4/library/socket.html#socket.socket.accept) (возможно, повторяя [`accept()`](https://python-all.ru/3.4/library/socket.html#socket.socket.accept) для обслуживания более одного клиента), в то время как клиенту нужна только последовательность [`socket()`](https://python-all.ru/3.4/library/socket.html#socket.socket), [`connect()`](https://python-all.ru/3.4/library/socket.html#socket.socket.connect). Также обратите внимание, что сервер не вызывает [`sendall()`](https://python-all.ru/3.4/library/socket.html#socket.socket.sendall)/[`recv()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recv) на сокете, который он прослушивает, а на новом сокете, возвращённом [`accept()`](https://python-all.ru/3.4/library/socket.html#socket.socket.accept).766767Первые два примера поддерживают только IPv4.768769```python770# Программа эхо-сервера771import socket772773HOST = '' # Символическое имя, обозначающее все доступные интерфейсы774PORT = 50007 # Произвольный непривилегированный порт775s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)776s.bind((HOST, PORT))777s.listen(1)778conn, addr = s.accept()779print('Connected by', addr)780while True:781 data = conn.recv(1024)782 if not data: break783 conn.sendall(data)784conn.close()785```786787```python788# Программа эхо-клиента789import socket790791HOST = 'daring.cwi.nl' # Удалённый хост792PORT = 50007 # Тот же порт, что и у сервера793s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)794s.connect((HOST, PORT))795s.sendall(b'Hello, world')796data = s.recv(1024)797s.close()798print('Received', repr(data))799```800801Следующие два примера идентичны двум предыдущим, но поддерживают как IPv4, так и IPv6. Серверная сторона будет прослушивать первое доступное семейство адресов (ей следовало бы прослушивать оба). На большинстве систем, готовых к IPv6, IPv6 будет иметь приоритет, и сервер может не принимать IPv4-трафик. Клиентская сторона попытается подключиться ко всем адресам, полученным в результате разрешения имен, и отправляет трафик на первый успешно подключенный.802803```python804# Программа эхо-сервера805import socket806import sys807808HOST = None # Символическое имя, обозначающее все доступные интерфейсы809PORT = 50007 # Произвольный непривилегированный порт810s = None811for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,812 socket.SOCK_STREAM, 0, socket.AI_PASSIVE):813 af, socktype, proto, canonname, sa = res814 try:815 s = socket.socket(af, socktype, proto)816 except OSError as msg:817 s = None818 continue819 try:820 s.bind(sa)821 s.listen(1)822 except OSError as msg:823 s.close()824 s = None825 continue826 break827if s is None:828 print('could not open socket')829 sys.exit(1)830conn, addr = s.accept()831print('Connected by', addr)832while True:833 data = conn.recv(1024)834 if not data: break835 conn.send(data)836conn.close()837```838839```python840# Программа эхо-клиента841import socket842import sys843844HOST = 'daring.cwi.nl' # Удалённый хост845PORT = 50007 # Тот же порт, что и у сервера846s = None847for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):848 af, socktype, proto, canonname, sa = res849 try:850 s = socket.socket(af, socktype, proto)851 except OSError as msg:852 s = None853 continue854 try:855 s.connect(sa)856 except OSError as msg:857 s.close()858 s = None859 continue860 break861if s is None:862 print('could not open socket')863 sys.exit(1)864s.sendall(b'Hello, world')865data = s.recv(1024)866s.close()867print('Received', repr(data))868```869870Следующий пример показывает, как написать очень простой снифер сети с помощью сырых сокетов в Windows. Для изменения интерфейса пример требует прав администратора:871872```python873import socket874875# общедоступный сетевой интерфейс876HOST = socket.gethostbyname(socket.gethostname())877878# создать сырой сокет и привязать его к общедоступному интерфейсу879s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)880s.bind((HOST, 0))881882# Включать IP-заголовки883s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)884885# принять все пакеты886s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)887888# принять пакет889print(s.recvfrom(65565))890891# неразборчивый режим отключён892s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)893```894895Последний пример показывает, как использовать интерфейс сокетов для обмена данными с сетью CAN с помощью протокола сырых сокетов. Чтобы вместо этого использовать CAN с протоколом широковещательного менеджера, откройте сокет:896897```python898socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)899```900901После привязки (`CAN_RAW`) или подключения ([`CAN_BCM`](https://python-all.ru/3.4/library/socket.html#socket.CAN_BCM)) сокета вы можете использовать операции [`socket.send()`](https://python-all.ru/3.4/library/socket.html#socket.socket.send) и [`socket.recv()`](https://python-all.ru/3.4/library/socket.html#socket.socket.recv) (а также их аналоги) на объекте сокета как обычно.902903Для этого примера могут потребоваться особые привилегии:904905```python906import socket907import struct908909# Упаковка/распаковка CAN-фреймов (см. 'struct can_frame' в <linux/can.h>)910911can_frame_fmt = "=IB3x8s"912can_frame_size = struct.calcsize(can_frame_fmt)913914def build_can_frame(can_id, data):915 can_dlc = len(data)916 data = data.ljust(8, b'\x00')917 return struct.pack(can_frame_fmt, can_id, can_dlc, data)918919def dissect_can_frame(frame):920 can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)921 return (can_id, can_dlc, data[:can_dlc])922923# создать сырой сокет и привязать его к интерфейсу 'vcan0'924s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)925s.bind(('vcan0',))926927while True:928 cf, addr = s.recvfrom(can_frame_size)929930 print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))931932 try:933 s.send(cf)934 except OSError:935 print('Error sending CAN frame')936937 try:938 s.send(build_can_frame(0x01, b'\x01\x02\x03'))939 except OSError:940 print('Error sending CAN frame')941```942943Запуск примера несколько раз со слишком маленькой задержкой между выполнениями может привести к этой ошибке:944945```python946OSError: [Errno 98] Address already in use947```948949Это связано с тем, что предыдущее выполнение оставило сокет в состоянии `TIME_WAIT`, и его нельзя сразу использовать повторно.950951Существует флаг [`socket`](https://python-all.ru/3.4/library/socket.html#module-socket), который можно установить, чтобы предотвратить это: `socket.SO_REUSEADDR`952953```python954s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)955s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)956s.bind((HOST, PORT))957```958959флаг `SO_REUSEADDR` указывает ядру повторно использовать локальный сокет в состоянии `TIME_WAIT`, не дожидаясь истечения его естественного тайм-аута.960961> **См. также**962>963> Для ознакомления с программированием сокетов (на C) см. следующие статьи:964>965> - *Вводное руководство по межпроцессному взаимодействию в 4.3BSD*, Стюарт Сечрест966> - *Продвинутое руководство по межпроцессному взаимодействию в 4.3BSD*, Сэмюэл Дж. Леффлер и др.967>968> Оба находятся в 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.4/library/socket.html) под названием Basic Socket Interface Extensions for IPv6.969