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

socket.md

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

1> **Источник:** https://python-all.ru/3.2/library/socket.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 17.2. [`socket`](https://python-all.ru/3.2/library/socket.html#module-socket) – низкоуровневый сетевой интерфейс89Этот модуль предоставляет доступ к интерфейсу BSD *socket*. Он доступен во всех современных Unix-системах, Windows, MacOS, OS/2 и, вероятно, на других платформах.1011> **Примечание**12>13> Некоторые аспекты поведения могут зависеть от платформы, поскольку вызовы выполняются через API сокетов операционной системы.1415Интерфейс Python представляет собой прямую трансляцию системных вызовов и библиотечного интерфейса сокетов Unix в объектно-ориентированном стиле Python: функция [`socket()`](https://python-all.ru/3.2/library/socket.html#module-socket) возвращает *объект сокета*, методы которого реализуют различные системные вызовы сокетов. Типы параметров находятся на более высоком уровне, чем в интерфейсе C: как и при операциях `read()` и `write()` с файлами Python, выделение буфера при приёме происходит автоматически, а длина буфера при отправке подразумевается неявно.1617> **См. также**18>19> **Модуль [`socketserver`](https://python-all.ru/3.2/library/socketserver.html#module-socketserver)**20>21> Классы, упрощающие написание сетевых серверов.22>23> **Модуль [`ssl`](https://python-all.ru/3.2/library/ssl.html#module-ssl)**24>25> Обёртка TLS/SSL для объектов сокетов.2627## 17.2.1. Семейства сокетов2829В зависимости от системы и параметров сборки этим модулем поддерживаются различные семейства сокетов.3031Адреса сокетов представляются следующим образом:3233- Для семейства адресов [`AF_UNIX`](https://python-all.ru/3.2/library/socket.html#socket.AF_UNIX) используется одна строка.34- Пара `(host, port)` используется для семейства адресов [`AF_INET`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET), где *host* – строка, представляющая либо имя хоста в доменной нотации Интернета, например `'daring.cwi.nl'`, либо IPv4-адрес, например `'100.50.200.5'`, а *port* – целое число.35- Для семейства адресов [`AF_INET6`](https://python-all.ru/3.2/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.2/library/socket.html#module-socket) *flowinfo* и *scopeid* можно опускать для обратной совместимости. Однако учтите, что пропуск *scopeid* может вызвать проблемы при работе с адресами IPv6, имеющими зону действия.36- Сокеты `AF_NETLINK` представляются в виде пар `(pid, groups)`.37- Поддержка TIPC только для Linux доступна с использованием семейства адресов `AF_TIPC`. TIPC – это открытый сетевой протокол, не основанный на IP, предназначенный для использования в кластерных вычислительных средах. Адреса представляются в виде кортежа, и поля зависят от типа адреса. Общая форма кортежа: `(addr_type, v1, v2, v3 [, scope])`, где:3839  - *addr\_type* – одно из `TIPC_ADDR_NAMESEQ`, `TIPC_ADDR_NAME`, или `TIPC_ADDR_ID`.40  - *scope* – одно из `TIPC_ZONE_SCOPE`, `TIPC_CLUSTER_SCOPE` и `TIPC_NODE_SCOPE`.41  - Если *addr\_type*`TIPC_ADDR_NAME`, то *v1* – тип сервера, *v2* – идентификатор порта, а *v3* должно быть равно 0.4243    Если *addr\_type*`TIPC_ADDR_NAMESEQ`, то *v1* – тип сервера, *v2* – нижний номер порта, а *v3* – верхний номер порта.4445    Если *addr\_type*`TIPC_ADDR_ID`, то *v1* – узел, *v2* – ссылка, а *v3* должно быть установлено в 0.4647    Если *addr\_type*`TIPC_ADDR_ID`, то *v1* – узел, *v2* – ссылка, а *v3* должно быть установлено в 0.48- Некоторые другие семейства адресов (`AF_BLUETOOTH`, `AF_PACKET`) поддерживают особые представления.4950Для IPv4-адресов вместо адреса хоста принимаются две специальные формы: пустая строка обозначает `INADDR_ANY`, а строка `'<broadcast>'` обозначает `INADDR_BROADCAST`. Такое поведение несовместимо с IPv6, поэтому от этих форм лучше отказаться, если планируется поддержка IPv6 в программах на Python.5152Если в части *узел* адреса сокета IPv4/v6 указано имя узла, программа может демонстрировать недетерминированное поведение, так как Python использует первый адрес, возвращённый при разрешении DNS. Адрес сокета будет разрешаться по-разному в фактический IPv4/v6-адрес в зависимости от результатов разрешения DNS и/или конфигурации узла. Для детерминированного поведения используйте числовой адрес в части *узел*.5354Все ошибки возбуждают исключения. Обычные исключения для недопустимых типов аргументов и нехватки памяти могут быть возбуждены; ошибки, связанные с семантикой сокета или адреса, возбуждают [`socket.error`](https://python-all.ru/3.2/library/socket.html#socket.error) или один из его подклассов.5556Неподдерживаемый режим поддерживается через [`setblocking()`](https://python-all.ru/3.2/library/socket.html#socket.socket.setblocking). Более общий подход на основе тайм-аутов поддерживается через [`settimeout()`](https://python-all.ru/3.2/library/socket.html#socket.socket.settimeout).5758## 17.2.2. Содержимое модуля5960Модуль [`socket`](https://python-all.ru/3.2/library/socket.html#module-socket) экспортирует следующие константы и функции:6162#### `exception socket.error`6364Это исключение, подкласс [`IOError`](https://python-all.ru/3.2/library/exceptions.html#IOError), возбуждается для ошибок, связанных с сокетами. Рекомендуется проверять атрибут `errno`, чтобы различать разные виды ошибок.6566> **См. также**67>68> Модуль [`errno`](https://python-all.ru/3.2/library/errno.html#module-errno) содержит символьные имена для кодов ошибок, определённых базовой операционной системой.6970#### `exception socket.herror`7172Это исключение, подкласс [`socket.error`](https://python-all.ru/3.2/library/socket.html#socket.error), возбуждается для ошибок, связанных с адресом, то есть для функций, использующих *h\_errno* в POSIX C API, включая [`gethostbyname_ex()`](https://python-all.ru/3.2/library/socket.html#socket.gethostbyname_ex) и [`gethostbyaddr()`](https://python-all.ru/3.2/library/socket.html#socket.gethostbyaddr). Сопутствующее значение – пара `(h_errno, string)`, представляющая ошибку, возвращённую библиотечным вызовом. *h\_errno* – числовое значение, а *string* представляет описание *h\_errno*, как возвращено C-функцией `hstrerror()`.7374#### `exception socket.gaierror`7576Это исключение, подкласс [`socket.error`](https://python-all.ru/3.2/library/socket.html#socket.error), возбуждается для ошибок, связанных с адресом, функциями [`getaddrinfo()`](https://python-all.ru/3.2/library/socket.html#socket.getaddrinfo) и [`getnameinfo()`](https://python-all.ru/3.2/library/socket.html#socket.getnameinfo). Сопутствующее значение – пара `(error, string)`, представляющая ошибку, возвращённую библиотечным вызовом. *string* представляет описание *error*, как возвращено C-функцией `gai_strerror()`. Числовое значение *error* совпадает с одной из констант `EAI_*`, определённых в этом модуле.7778#### `exception socket.timeout`7980Это исключение, подкласс [`socket.error`](https://python-all.ru/3.2/library/socket.html#socket.error), возбуждается при тайм-ауте на сокете, для которого тайм-ауты были включены предыдущим вызовом [`settimeout()`](https://python-all.ru/3.2/library/socket.html#socket.socket.settimeout) (или неявно через [`setdefaulttimeout()`](https://python-all.ru/3.2/library/socket.html#socket.setdefaulttimeout)). Сопутствующее значение – строка, которая в настоящее время всегда равна «timed out».8182#### `socket.AF_UNIX`8384#### `socket.AF_INET`8586#### `socket.AF_INET6`8788Эти константы представляют семейства адресов (и протоколов), используемые для первого аргумента [`socket()`](https://python-all.ru/3.2/library/socket.html#module-socket). Если константа [`AF_UNIX`](https://python-all.ru/3.2/library/socket.html#socket.AF_UNIX) не определена, то этот протокол не поддерживается. В зависимости от системы могут быть доступны дополнительные константы.8990#### `socket.SOCK_STREAM`9192#### `socket.SOCK_DGRAM`9394#### `socket.SOCK_RAW`9596#### `socket.SOCK_RDM`9798#### `socket.SOCK_SEQPACKET`99100Эти константы представляют типы сокетов, используемые для второго аргумента [`socket()`](https://python-all.ru/3.2/library/socket.html#module-socket). В зависимости от системы могут быть доступны дополнительные константы. (Обычно полезными считаются только [`SOCK_STREAM`](https://python-all.ru/3.2/library/socket.html#socket.SOCK_STREAM) и [`SOCK_DGRAM`](https://python-all.ru/3.2/library/socket.html#socket.SOCK_DGRAM).)101102#### `socket.SOCK_CLOEXEC`103104#### `socket.SOCK_NONBLOCK`105106Эти две константы, если они определены, можно комбинировать с типами сокетов, что позволяет устанавливать некоторые флаги атомарно (тем самым избегая возможных состояний гонки и необходимости отдельных вызовов).107108> **См. также**109>110> [Безопасная обработка файловых дескрипторов](https://python-all.ru/3.2/library/socket.html) для более подробного объяснения.111112Доступность: Linux \>= 2.6.27.113114Новое в версии 3.2.115116#### `SO_*`117118#### `socket.SOMAXCONN`119120#### `MSG_*`121122#### `SOL_*`123124#### `IPPROTO_*`125126#### `IPPORT_*`127128#### `INADDR_*`129130#### `IP_*`131132#### `IPV6_*`133134#### `EAI_*`135136#### `AI_*`137138#### `NI_*`139140#### `TCP_*`141142Многие константы этих форм, описанные в документации Unix по сокетам и/или протоколу IP, также определены в модуле socket. Они обычно используются в аргументах методов `setsockopt()` и `getsockopt()` объектов сокетов. В большинстве случаев определены только те символы, которые есть в заголовочных файлах Unix; для некоторых символов заданы значения по умолчанию.143144#### `SIO_*`145146#### `RCVALL_*`147148Константы для WSAIoctl() в Windows. Используются как аргументы метода `ioctl()` объектов сокетов.149150#### `TIPC_*`151152Константы, связанные с TIPC, соответствующие тем, что экспортируются C API сокетов. Дополнительную информацию см. в документации TIPC.153154#### `socket.has_ipv6`155156Эта константа содержит логическое значение, указывающее, поддерживается ли IPv6 на данной платформе.157158#### `socket.create_connection(address[, timeout[, source_address]])`159160Подключается к TCP-сервису, ожидающему по адресу *address* в Интернете (кортеж из двух элементов `(host, port)`), и возвращает объект сокета. Это функция более высокого уровня, чем [`socket.connect()`](https://python-all.ru/3.2/library/socket.html#socket.socket.connect): если *host* – нечисловое имя хоста, она попытается разрешить его и для [`AF_INET`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET), и для [`AF_INET6`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET6), а затем попробует подключиться ко всем возможным адресам по очереди, пока не произойдёт успешное подключение. Это упрощает написание клиентов, совместимых с IPv4 и IPv6.161162Передача необязательного параметра *timeout* установит тайм-аут для экземпляра сокета перед попыткой подключения. Если *timeout* не указан, используется глобальная настройка тайм-аута по умолчанию, возвращаемая функцией [`getdefaulttimeout()`](https://python-all.ru/3.2/library/socket.html#socket.getdefaulttimeout).163164Если указан, то *source\_address* должен быть кортежем из двух элементов `(host, port)`, чтобы сокет привязывался к нему как к исходному адресу перед подключением. Если host или port равны ‘’ или 0 соответственно, будет использовано поведение ОС по умолчанию.165166Изменено в версии 3.2: Был добавлен параметр *source\_address*.167168Изменено в версии 3.2: добавлена поддержка выражения [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with).169170#### `socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0)`171172Преобразует аргументы *host*/*port* в последовательность кортежей из 5 элементов, содержащих все необходимые аргументы для создания сокета, подключённого к этой службе. *host* – это доменное имя, строковое представление IPv4/v6-адреса или `None`. *port* – это строковое имя службы, например `'http'`, числовой номер порта или `None`. Передавая `None` в качестве значения *host* и *port*, можно передать `NULL` в нижележащий C API.173174Аргументы *family*, *type* и *proto* можно указать необязательно, чтобы сузить список возвращаемых адресов. Если передать ноль в качестве значения каждого из этих аргументов, будут выбраны все возможные результаты. Аргумент *flags* может содержать одну или несколько констант `AI_*` и влияет на то, как вычисляются и возвращаются результаты. Например, `AI_NUMERICHOST` отключает разрешение доменных имён и вызовет ошибку, если *host* является доменным именем.175176Функция возвращает список кортежей из 5 элементов со следующей структурой:177178`(family, type, proto, canonname, sockaddr)`179180В этих кортежах *family*, *type*, *proto* – целые числа, и их следует передавать функции [`socket()`](https://python-all.ru/3.2/library/socket.html#module-socket). *canonname* будет строкой, представляющей каноническое имя *host*, если `AI_CANONNAME` входит в аргумент *flags*; в противном случае *canonname* будет пустым. *sockaddr* – это кортеж, описывающий адрес сокета, формат которого зависит от возвращённого *family* (кортеж из 2 элементов `(address, port)` для [`AF_INET`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET), кортеж из 4 элементов `(address, port, flow info, scope id)` для [`AF_INET6`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET6)), и предназначен для передачи методу [`socket.connect()`](https://python-all.ru/3.2/library/socket.html#socket.socket.connect).181182Следующий пример получает информацию об адресе для гипотетического TCP-соединения к `www.python.org` на порту 80 (на вашей системе результаты могут отличаться, если IPv6 не включён):183184```python185>>> socket.getaddrinfo("www.python.org", 80, proto=socket.SOL_TCP)186[(2, 1, 6, '', ('82.94.164.162', 80)),187 (10, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0))]188```189190Изменено в версии 3.2: теперь параметры можно передавать как отдельные именованные аргументы.191192#### `socket.getfqdn([name])`193194Возвращает полное доменное имя для *name*. Если *name* опущен или пуст, он интерпретируется как локальный хост. Чтобы найти полное имя, проверяется имя хоста, возвращённое [`gethostbyaddr()`](https://python-all.ru/3.2/library/socket.html#socket.gethostbyaddr), а затем, при наличии, псевдонимы хоста. Выбирается первое имя, содержащее точку. Если полное доменное имя недоступно, возвращается имя хоста, полученное через [`gethostname()`](https://python-all.ru/3.2/library/socket.html#socket.gethostname).195196#### `socket.gethostbyname(hostname)`197198Преобразует имя хоста в формат IPv4-адреса. IPv4-адрес возвращается в виде строки, например `'100.50.200.5'`. Если само имя хоста является IPv4-адресом, оно возвращается без изменений. См. [`gethostbyname_ex()`](https://python-all.ru/3.2/library/socket.html#socket.gethostbyname_ex) для более полного интерфейса. [`gethostbyname()`](https://python-all.ru/3.2/library/socket.html#socket.gethostbyname) не поддерживает разрешение имён IPv6, поэтому для поддержки dual stack IPv4/v6 следует использовать [`getaddrinfo()`](https://python-all.ru/3.2/library/socket.html#socket.getaddrinfo).199200#### `socket.gethostbyname_ex(hostname)`201202Преобразует имя хоста в формат IPv4-адреса, расширенный интерфейс. Возвращает тройку `(hostname, aliaslist, ipaddrlist)`, где *hostname* – основное имя хоста, отвечающего на заданный *ip\_address*, *aliaslist* – (возможно, пустой) список альтернативных имён хоста для того же адреса, а *ipaddrlist* – список IPv4-адресов того же интерфейса на том же хосте (часто, но не всегда, один адрес). [`gethostbyname_ex()`](https://python-all.ru/3.2/library/socket.html#socket.gethostbyname_ex) не поддерживает разрешение имён IPv6, поэтому для поддержки dual stack IPv4/v6 следует использовать [`getaddrinfo()`](https://python-all.ru/3.2/library/socket.html#socket.getaddrinfo).203204#### `socket.gethostname()`205206Возвращает строку, содержащую имя хоста машины, на которой в данный момент выполняется интерпретатор Python.207208Если нужно узнать IP-адрес текущей машины, можно использовать `gethostbyname(gethostname())`. Эта операция предполагает, что существует корректное отображение адреса на хост, и это предположение выполняется не всегда.209210Примечание: [`gethostname()`](https://python-all.ru/3.2/library/socket.html#socket.gethostname) не всегда возвращает полное доменное имя; используйте `getfqdn()` (см. выше).211212#### `socket.gethostbyaddr(ip_address)`213214Возвращает тройку `(hostname, aliaslist, ipaddrlist)`, где *hostname* – основное имя хоста, отвечающего на заданный *ip\_address*, *aliaslist* – (возможно, пустой) список альтернативных имён хоста для того же адреса, а *ipaddrlist* – список IPv4/v6-адресов того же интерфейса на том же хосте (скорее всего, содержащий только один адрес). Чтобы найти полное доменное имя, используйте функцию [`getfqdn()`](https://python-all.ru/3.2/library/socket.html#socket.getfqdn). [`gethostbyaddr()`](https://python-all.ru/3.2/library/socket.html#socket.gethostbyaddr) поддерживает как IPv4, так и IPv6.215216#### `socket.getnameinfo(sockaddr, flags)`217218Преобразует адрес сокета *sockaddr* в кортеж из двух элементов `(host, port)`. В зависимости от настроек *flags* результат может содержать полное доменное имя или числовое представление адреса в *host*. Аналогично, *port* может содержать строковое имя порта или числовой номер порта.219220#### `socket.getprotobyname(protocolname)`221222Преобразует имя интернет-протокола (например, `'icmp'`) в константу, пригодную для передачи в качестве (необязательного) третьего аргумента функции [`socket()`](https://python-all.ru/3.2/library/socket.html#module-socket). Обычно это требуется только для сокетов, открытых в «сыром» режиме ([`SOCK_RAW`](https://python-all.ru/3.2/library/socket.html#socket.SOCK_RAW)); для обычных режимов сокета правильный протокол выбирается автоматически, если протокол опущен или равен нулю.223224#### `socket.getservbyname(servicename[, protocolname])`225226Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если указано, должно быть `'tcp'` или `'udp'`, в противном случае подойдёт любой протокол.227228#### `socket.getservbyport(port[, protocolname])`229230Преобразует номер порта и имя протокола в имя службы для этой службы. Необязательное имя протокола, если указано, должно быть `'tcp'` или `'udp'`, иначе подойдет любой протокол.231232#### `socket.socket([family[, type[, proto]]])`233234Создаёт новый сокет с заданным семейством адресов, типом сокета и номером протокола. Семейство адресов должно быть [`AF_INET`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET) (по умолчанию), [`AF_INET6`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET6) или [`AF_UNIX`](https://python-all.ru/3.2/library/socket.html#socket.AF_UNIX). Тип сокета должен быть [`SOCK_STREAM`](https://python-all.ru/3.2/library/socket.html#socket.SOCK_STREAM) (по умолчанию), [`SOCK_DGRAM`](https://python-all.ru/3.2/library/socket.html#socket.SOCK_DGRAM) или, возможно, одна из констант `SOCK_`. Номер протокола обычно равен нулю и в этом случае может быть опущен.235236#### `socket.socketpair([family[, type[, proto]]])`237238Создаёт пару соединённых объектов сокетов, используя указанное семейство адресов, тип сокета и номер протокола. Семейство адресов, тип сокета и номер протокола такие же, как для функции [`socket()`](https://python-all.ru/3.2/library/socket.html#module-socket) выше. Семейство по умолчанию – [`AF_UNIX`](https://python-all.ru/3.2/library/socket.html#socket.AF_UNIX), если оно определено на платформе; в противном случае по умолчанию используется [`AF_INET`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET). Доступность: Unix.239240Изменено в версии 3.2: возвращаемые объекты сокетов теперь поддерживают полный API сокетов, а не подмножество.241242#### `socket.fromfd(fd, family, type[, proto])`243244Дублирует файловый дескриптор *fd* (целое число, возвращаемое методом `fileno()` объекта файла) и создаёт из результата объект сокета. Семейство адресов, тип сокета и номер протокола такие же, как у функции [`socket()`](https://python-all.ru/3.2/library/socket.html#module-socket) выше. Файловый дескриптор должен ссылаться на сокет, но это не проверяется – последующие операции с объектом могут завершиться ошибкой, если файловый дескриптор некорректен. Эта функция требуется редко, но может использоваться для получения или установки параметров сокета, переданного программе как стандартный ввод или вывод (например, сервер, запущенный демоном inet в Unix). Предполагается, что сокет находится в блокирующем режиме.245246#### `socket.ntohl(x)`247248Преобразует 32-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта операция ничего не делает; в противном случае выполняется перестановка 4 байтов.249250#### `socket.ntohs(x)`251252Преобразует 16-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.253254#### `socket.htonl(x)`255256Преобразует 32-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен четырёх байтов.257258#### `socket.htons(x)`259260Преобразует 16-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.261262#### `socket.inet_aton(ip_string)`263264Преобразует IPv4-адрес из строкового формата с точками (например, '123.45.67.89') в 32-битный упакованный двоичный формат в виде объекта bytes длиной четыре символа. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `struct in_addr`, который является типом C для 32-битного упакованного двоичного представления, возвращаемого этой функцией.265266[`inet_aton()`](https://python-all.ru/3.2/library/socket.html#socket.inet_aton) также принимает строки с менее чем тремя точками; подробнее см. в руководстве Unix *inet(3)*.267268Если строка IPv4-адреса, переданная в эту функцию, недействительна, возбуждается [`socket.error`](https://python-all.ru/3.2/library/socket.html#socket.error). Обратите внимание, что точное определение допустимости зависит от реализации функции `inet_aton()` на C.269270[`inet_aton()`](https://python-all.ru/3.2/library/socket.html#socket.inet_aton) не поддерживает IPv6, и для поддержки двойного стека IPv4/IPv6 вместо него следует использовать [`inet_pton()`](https://python-all.ru/3.2/library/socket.html#socket.inet_pton).271272#### `socket.inet_ntoa(packed_ip)`273274Преобразует 32-битный упакованный IPv4-адрес (объект bytes длиной четыре символа) в его стандартное строковое представление с точками (например, '123.45.67.89'). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `struct in_addr`, который является типом C для 32-битных упакованных двоичных данных, принимаемых этой функцией в качестве аргумента.275276Если длина переданной этой функции последовательности байтов не равна ровно 4 байтам, возбуждается [`socket.error`](https://python-all.ru/3.2/library/socket.html#socket.error). [`inet_ntoa()`](https://python-all.ru/3.2/library/socket.html#socket.inet_ntoa) не поддерживает IPv6, поэтому для поддержки двойного стека IPv4/IPv6 следует использовать [`inet_ntop()`](https://python-all.ru/3.2/library/socket.html#socket.inet_ntop).277278#### `socket.inet_pton(address_family, ip_string)`279280Преобразует IP-адрес из строкового формата, зависящего от семейства, в упакованный двоичный формат. [`inet_pton()`](https://python-all.ru/3.2/library/socket.html#socket.inet_pton) полезен, когда библиотека или сетевой протокол требует объект типа `struct in_addr` (аналогично [`inet_aton()`](https://python-all.ru/3.2/library/socket.html#socket.inet_aton)) или `struct in6_addr`.281282В настоящее время *address\_family* поддерживает значения [`AF_INET`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET) и [`AF_INET6`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET6). Если строка IP-адреса *ip\_string* недействительна, возбуждается [`socket.error`](https://python-all.ru/3.2/library/socket.html#socket.error). Имейте в виду, что точное определение допустимости зависит как от значения *address\_family*, так и от реализации `inet_pton()`.283284Доступность: Unix (возможно, не на всех платформах).285286#### `socket.inet_ntop(address_family, packed_ip)`287288Convert 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.2/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.2/library/socket.html#socket.inet_ntoa)) or `struct in6_addr`.289290В настоящее время *address\_family* поддерживает значения [`AF_INET`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET) и [`AF_INET6`](https://python-all.ru/3.2/library/socket.html#socket.AF_INET6). Если длина строки *packed\_ip* не соответствует указанному семейству адресов, возбуждается [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError). [`socket.error`](https://python-all.ru/3.2/library/socket.html#socket.error) возбуждается при ошибках вызова [`inet_ntop()`](https://python-all.ru/3.2/library/socket.html#socket.inet_ntop).291292Доступность: Unix (возможно, не на всех платформах).293294#### `socket.getdefaulttimeout()`295296Возвращает тайм-аут по умолчанию в секундах (float) для новых сокетов. Значение `None` означает, что новые сокеты не имеют тайм-аута. При первом импорте модуля socket значение по умолчанию равно `None`.297298#### `socket.setdefaulttimeout(timeout)`299300Устанавливает тайм-аут по умолчанию в секундах (float) для новых сокетов. При первом импорте модуля socket значение по умолчанию равно `None`. См. [`settimeout()`](https://python-all.ru/3.2/library/socket.html#socket.socket.settimeout) для возможных значений и их соответствующих значений.301302#### `socket.SocketType`303304Это объект типа Python, представляющий тип объекта сокета. Он эквивалентен `type(socket(...))`.305306## 17.2.3. Объекты сокетов307308Объекты сокетов имеют следующие методы. За исключением `makefile()`, они соответствуют системным вызовам Unix, применимым к сокетам.309310#### `socket.accept()`311312Принимает соединение. Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение – пара `(conn, address)`, где *conn* – это *новый* объект сокета, который можно использовать для отправки и получения данных по соединению, а *address* – это адрес, привязанный к сокету на другом конце соединения.313314#### `socket.bind(address)`315316Привязывает сокет к *address*. Сокет не должен быть уже привязан. (Формат *address* зависит от семейства адресов – см. выше.)317318#### `socket.close()`319320Закрывает сокет. Все последующие операции с объектом сокета будут завершаться ошибкой. Удаленная сторона не получит больше данных (после сброса находящихся в очереди данных). Сокеты автоматически закрываются при сборке мусора.321322> **Примечание**323>324> [`close()`](https://python-all.ru/3.2/library/socket.html#socket.socket.close) освобождает ресурс, связанный с соединением, но не обязательно закрывает соединение немедленно. Если требуется вовремя закрыть соединение, вызовите [`shutdown()`](https://python-all.ru/3.2/library/socket.html#socket.socket.shutdown) перед [`close()`](https://python-all.ru/3.2/library/socket.html#socket.socket.close).325326#### `socket.connect(address)`327328Подключается к удалённому сокету по адресу *address*. (Формат *address* зависит от семейства адресов – см. выше.)329330#### `socket.connect_ex(address)`331332Как и `connect(address)`, но возвращает индикатор ошибки вместо вызова исключения для ошибок, возвращаемых вызовом `connect()` на уровне C (другие проблемы, такие как «хост не найден», по-прежнему могут вызывать исключения). Индикатор ошибки равен `0`, если операция выполнена успешно, в противном случае – значению переменной `errno`. Это полезно, например, для поддержки асинхронных соединений.333334#### `socket.detach()`335336Переводит объект сокета в закрытое состояние без фактического закрытия базового файлового дескриптора. Файловый дескриптор возвращается и может быть повторно использован для других целей.337338Новое в версии 3.2.339340#### `socket.fileno()`341342Возвращает файловый дескриптор сокета (небольшое целое число). Это полезно с [`select.select()`](https://python-all.ru/3.2/library/select.html#select.select).343344В Windows небольшое целое число, возвращаемое этим методом, нельзя использовать там, где может использоваться файловый дескриптор (например, в [`os.fdopen()`](https://python-all.ru/3.2/library/os.html#os.fdopen)). В Unix такого ограничения нет.345346#### `socket.getpeername()`347348Возвращает удалённый адрес, к которому подключён сокет. Это полезно, например, для определения номера порта удалённого сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов – см. выше.) На некоторых системах эта функция не поддерживается.349350#### `socket.getsockname()`351352Возвращает собственный адрес сокета. Это полезно, например, для определения номера порта сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов – см. выше.)353354#### `socket.getsockopt(level, optname[, buflen])`355356Возвращает значение указанной опции сокета (см. страницу man Unix *getsockopt(2)*). Необходимые символьные константы (`SO_*` и т.д.) определены в этом модуле. Если *buflen* отсутствует, предполагается целочисленная опция, и функция возвращает её целочисленное значение. Если *buflen* присутствует, он задает максимальную длину буфера для получения опции, и этот буфер возвращается в виде объекта bytes. Вызывающий код должен сам декодировать содержимое буфера (см. опциональный встроенный модуль [`struct`](https://python-all.ru/3.2/library/struct.html#module-struct) для способа декодирования структур C, закодированных как байтовые строки).357358#### `socket.gettimeout()`359360Возвращает тайм-аут в секундах (число с плавающей точкой), связанный с операциями сокета, или `None`, если тайм-аут не установлен. Это значение отражает последний вызов [`setblocking()`](https://python-all.ru/3.2/library/socket.html#socket.socket.setblocking) или [`settimeout()`](https://python-all.ru/3.2/library/socket.html#socket.socket.settimeout).361362#### `socket.ioctl(control, option)`363364| Платформа: | Windows |365| --- | --- |366367Метод [`ioctl()`](https://python-all.ru/3.2/library/socket.html#socket.socket.ioctl) представляет собой ограниченный интерфейс к системному интерфейсу WSAIoctl. Для получения дополнительной информации обратитесь к [документации Win32](https://python-all.ru/3.2/library/socket.html).368369On other platforms, the generic [`fcntl.fcntl()`](https://python-all.ru/3.2/library/fcntl.html#fcntl.fcntl) and [`fcntl.ioctl()`](https://python-all.ru/3.2/library/fcntl.html#fcntl.ioctl) functions may be used; they accept a socket object as their first argument.370371#### `socket.listen(backlog)`372373Ожидает подключения к сокету. Аргумент *backlog* задаёт максимальное количество ожидающих соединений в очереди и должен быть не меньше 0; максимальное значение зависит от системы (обычно 5), минимальное принудительно устанавливается в 0.374375#### `socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)`376377Возвращает [*файловый объект*](https://python-all.ru/3.2/glossary.html#term-file-object), связанный с сокетом. Точный возвращаемый тип зависит от аргументов, переданных в [`makefile()`](https://python-all.ru/3.2/library/socket.html#socket.socket.makefile). Эти аргументы интерпретируются так же, как и встроенной функцией [`open()`](https://python-all.ru/3.2/library/functions.html#open).378379Закрытие файлового объекта не приведет к закрытию сокета, если не осталось ссылок на сокет. Сокет должен находиться в блокирующем режиме; он может иметь тайм-аут, но в случае его срабатывания внутренний буфер файлового объекта может оказаться в несогласованном состоянии.380381> **Примечание**382>383> В Windows файлоподобный объект, созданный [`makefile()`](https://python-all.ru/3.2/library/socket.html#socket.socket.makefile), нельзя использовать там, где требуется файловый объект с файловым дескриптором, например в аргументах потока [`subprocess.Popen()`](https://python-all.ru/3.2/library/subprocess.html#subprocess.Popen).384385#### `socket.recv(bufsize[, flags])`386387Получает данные из сокета. Возвращает объект bytes с полученными данными. Максимальный объём данных за одно получение задаётся параметром *bufsize*. Значение необязательного аргумента *flags* описано на странице руководства Unix *recv(2)*; по умолчанию он равен нулю.388389> **Примечание**390>391> Для наилучшего соответствия реальным характеристикам оборудования и сети значение *bufsize* должно быть относительно небольшой степенью двойки, например, 4096.392393#### `socket.recvfrom(bufsize[, flags])`394395Receive 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.)396397#### `socket.recvfrom_into(buffer[, nbytes[, flags]])`398399Receive 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.)400401#### `socket.recv_into(buffer[, nbytes[, flags]])`402403Получает из сокета до *nbytes* байтов, сохраняя данные в буфер, а не создавая новую строку байтов. Если *nbytes* не указан (или равен 0), принимает столько байтов, сколько помещается в переданный буфер. Возвращает количество полученных байтов. Значение необязательного аргумента *flags* описано на странице руководства Unix *recv(2)*; по умолчанию он равен нулю.404405#### `socket.send(bytes[, flags])`406407Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент *flags* имеет то же значение, что и для [`recv()`](https://python-all.ru/3.2/library/socket.html#socket.socket.recv) выше. Возвращает количество отправленных байт. Приложения должны проверять, что все данные были отправлены; если передана только часть данных, приложению необходимо попытаться доставить остаток. Дополнительную информацию по этой теме можно найти в [*Socket Programming HOWTO*](https://python-all.ru/3.2/howto/sockets.html#socket-howto).408409#### `socket.sendall(bytes[, flags])`410411Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент *flags* имеет то же значение, что и для [`recv()`](https://python-all.ru/3.2/library/socket.html#socket.socket.recv) выше. В отличие от [`send()`](https://python-all.ru/3.2/library/socket.html#socket.socket.send), этот метод продолжает отправлять данные из *bytes*, пока не будут отправлены все данные или не возникнет ошибка. В случае успеха возвращается `None`. При ошибке вызывается исключение, и невозможно определить, сколько данных (если вообще было) было успешно отправлено.412413#### `socket.sendto(bytes, address)`414415#### `socket.sendto(bytes, flags, address)`416417Отправляет данные в сокет. Сокет не должен быть подключён к удалённому сокету, так как целевой сокет задаётся аргументом *address*. Необязательный аргумент *flags* имеет то же значение, что и для [`recv()`](https://python-all.ru/3.2/library/socket.html#socket.socket.recv) выше. Возвращает количество отправленных байт. (Формат *address* зависит от семейства адресов – см. выше.)418419#### `socket.setblocking(flag)`420421Устанавливает блокирующий или неблокирующий режим сокета: если *flag* равен false, сокет переводится в неблокирующий режим, иначе в блокирующий.422423Этот метод является сокращением для некоторых вызовов [`settimeout()`](https://python-all.ru/3.2/library/socket.html#socket.socket.settimeout):424425- `sock.setblocking(True)` эквивалентно `sock.settimeout(None)`426- `sock.setblocking(False)` эквивалентно `sock.settimeout(0.0)`427428#### `socket.settimeout(value)`429430Устанавливает тайм-аут для блокирующих операций с сокетом. Аргумент *value* может быть неотрицательным числом с плавающей запятой, выражающим секунды, или `None`. Если задано ненулевое значение, последующие операции с сокетом будут вызывать исключение [`timeout`](https://python-all.ru/3.2/library/socket.html#socket.timeout), если период тайм-аута *value* истек до завершения операции. Если задан ноль, сокет переводится в неблокирующий режим. Если задано `None`, сокет переводится в блокирующий режим.431432Для получения дополнительной информации обратитесь к [*заметкам о тайм-аутах сокетов*](https://python-all.ru/3.2/library/socket.html#socket-timeouts).433434#### `socket.setsockopt(level, optname, value)`435436Устанавливает значение указанной опции сокета (см. страницу руководства Unix *setsockopt(2)*). Необходимые символические константы определены в модуле [`socket`](https://python-all.ru/3.2/library/socket.html#module-socket) (`SO_*` и т.д.). Значение может быть целым числом или объектом bytes, представляющим буфер. В последнем случае вызывающий должен убедиться, что последовательность байтов содержит правильные биты (см. опциональный встроенный модуль [`struct`](https://python-all.ru/3.2/library/struct.html#module-struct) для способа кодирования C-структур в виде байтовых строк).437438#### `socket.shutdown(how)`439440Завершает одну или обе половины соединения. Если *how* равно `SHUT_RD`, дальнейший приём данных запрещён. Если *how* равно `SHUT_WR`, дальнейшая отправка данных запрещена. Если *how* равно `SHUT_RDWR`, дальнейшие отправка и приём данных запрещены. В зависимости от платформы завершение одной половины соединения может также закрыть противоположную половину (например, на Mac OS X `shutdown(SHUT_WR)` не позволяет выполнять чтение на другом конце соединения).441442Обратите внимание, что методов `read()` или `write()` не существует; вместо них используйте [`recv()`](https://python-all.ru/3.2/library/socket.html#socket.socket.recv) и [`send()`](https://python-all.ru/3.2/library/socket.html#socket.socket.send) без аргумента *flags*.443444Объекты сокетов также имеют следующие (только для чтения) атрибуты, которые соответствуют значениям, переданным конструктору [`socket`](https://python-all.ru/3.2/library/socket.html#module-socket).445446#### `socket.family`447448Семейство сокета.449450#### `socket.type`451452Тип сокета.453454#### `socket.proto`455456Протокол сокета.457458## 17.2.4. Замечания о тайм-аутах сокетов459460Объект сокета может находиться в одном из трёх режимов: блокирующем, неблокирующем или с тайм-аутом. По умолчанию сокеты всегда создаются в блокирующем режиме, но это можно изменить, вызвав [`setdefaulttimeout()`](https://python-all.ru/3.2/library/socket.html#socket.setdefaulttimeout).461462- В *блокирующем режиме* операции блокируются до завершения или пока система не вернет ошибку (например, истекло время соединения).463- В *неблокирующем режиме* операции завершаются ошибкой (с ошибкой, которая, к сожалению, зависит от системы), если их нельзя выполнить немедленно: функции из модуля [`select`](https://python-all.ru/3.2/library/select.html#module-select) можно использовать, чтобы узнать, когда и доступен ли сокет для чтения или записи.464- В *режиме с тайм-аутом* операции завершаются ошибкой, если их нельзя выполнить в течение тайм-аута, указанного для сокета (они вызывают исключение [`timeout`](https://python-all.ru/3.2/library/socket.html#socket.timeout)), или если система возвращает ошибку.465466> **Примечание**467>468> На уровне операционной системы сокеты в *режиме с тайм-аутом* внутренне устанавливаются в неблокирующий режим. Кроме того, блокирующий режим и режим тайм-аута разделяются между файловыми дескрипторами и объектами сокетов, которые относятся к одной и той же сетевой конечной точке. Эта деталь реализации может иметь заметные последствия, если, например, вы решите использовать [`fileno()`](https://python-all.ru/3.2/library/socket.html#socket.socket.fileno) сокета.469470### 17.2.4.1. Тайм-ауты и метод `connect`471472Операция [`connect()`](https://python-all.ru/3.2/library/socket.html#socket.socket.connect) также подчиняется настройке тайм-аута, и в целом рекомендуется вызывать [`settimeout()`](https://python-all.ru/3.2/library/socket.html#socket.socket.settimeout) перед вызовом [`connect()`](https://python-all.ru/3.2/library/socket.html#socket.socket.connect) или передавать параметр тайм-аута в [`create_connection()`](https://python-all.ru/3.2/library/socket.html#socket.create_connection). Однако сетевой стек системы также может вернуть собственную ошибку тайм-аута соединения независимо от любой настройки тайм-аута сокета Python.473474### 17.2.4.2. Тайм-ауты и метод `accept`475476Если [`getdefaulttimeout()`](https://python-all.ru/3.2/library/socket.html#socket.getdefaulttimeout) не равно [`None`](https://python-all.ru/3.2/library/constants.html#None), сокеты, возвращаемые методом [`accept()`](https://python-all.ru/3.2/library/socket.html#socket.socket.accept), наследуют этот тайм-аут. В противном случае поведение зависит от настроек прослушивающего сокета:477478- если прослушивающий сокет находится в *блокирующем режиме* или в *режиме с тайм-аутом*, сокет, возвращённый [`accept()`](https://python-all.ru/3.2/library/socket.html#socket.socket.accept), находится в *блокирующем режиме*;479- если прослушивающий сокет находится в *неблокирующем режиме*, то, будет ли сокет, возвращённый [`accept()`](https://python-all.ru/3.2/library/socket.html#socket.socket.accept), в блокирующем или неблокирующем режиме, зависит от операционной системы. Если вы хотите обеспечить кроссплатформенное поведение, рекомендуется вручную переопределить эту настройку.480481## 17.2.5. Пример482483Вот четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который отправляет обратно все полученные данные (обслуживая только одного клиента), и клиент, использующий его. Обратите внимание, что сервер должен выполнить последовательность [`socket()`](https://python-all.ru/3.2/library/socket.html#module-socket), [`bind()`](https://python-all.ru/3.2/library/socket.html#socket.socket.bind), [`listen()`](https://python-all.ru/3.2/library/socket.html#socket.socket.listen), [`accept()`](https://python-all.ru/3.2/library/socket.html#socket.socket.accept) (возможно, повторяя [`accept()`](https://python-all.ru/3.2/library/socket.html#socket.socket.accept) для обслуживания более одного клиента), в то время как клиенту нужна только последовательность [`socket()`](https://python-all.ru/3.2/library/socket.html#module-socket), [`connect()`](https://python-all.ru/3.2/library/socket.html#socket.socket.connect). Также обратите внимание, что сервер не вызывает [`sendall()`](https://python-all.ru/3.2/library/socket.html#socket.socket.sendall)/[`recv()`](https://python-all.ru/3.2/library/socket.html#socket.socket.recv) на сокете, который он прослушивает, а на новом сокете, возвращённом [`accept()`](https://python-all.ru/3.2/library/socket.html#socket.socket.accept).484485Первые два примера поддерживают только IPv4.486487```python488# Программа эхо-сервера489import socket490491HOST = ''                 # Символическое имя, обозначающее все доступные интерфейсы492PORT = 50007              # Произвольный непривилегированный порт493s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)494s.bind((HOST, PORT))495s.listen(1)496conn, addr = s.accept()497print('Connected by', addr)498while True:499    data = conn.recv(1024)500    if not data: break501    conn.sendall(data)502conn.close()503```504505```python506# Программа эхо-клиента507import socket508509HOST = 'daring.cwi.nl'    # Удалённый хост510PORT = 50007              # Тот же порт, что и у сервера511s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)512s.connect((HOST, PORT))513s.sendall(b'Hello, world')514data = s.recv(1024)515s.close()516print('Received', repr(data))517```518519Следующие два примера идентичны двум предыдущим, но поддерживают как IPv4, так и IPv6. Серверная сторона будет прослушивать первое доступное семейство адресов (ей следовало бы прослушивать оба). На большинстве систем, готовых к IPv6, IPv6 будет иметь приоритет, и сервер может не принимать IPv4-трафик. Клиентская сторона попытается подключиться ко всем адресам, полученным в результате разрешения имен, и отправляет трафик на первый успешно подключенный.520521```python522# Программа эхо-сервера523import socket524import sys525526HOST = None               # Символическое имя, обозначающее все доступные интерфейсы527PORT = 50007              # Произвольный непривилегированный порт528s = None529for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,530                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):531    af, socktype, proto, canonname, sa = res532    try:533        s = socket.socket(af, socktype, proto)534    except socket.error as msg:535        s = None536        continue537    try:538        s.bind(sa)539        s.listen(1)540    except socket.error as msg:541        s.close()542        s = None543        continue544    break545if s is None:546    print('could not open socket')547    sys.exit(1)548conn, addr = s.accept()549print('Connected by', addr)550while True:551    data = conn.recv(1024)552    if not data: break553    conn.send(data)554conn.close()555```556557```python558# Программа эхо-клиента559import socket560import sys561562HOST = 'daring.cwi.nl'    # Удалённый хост563PORT = 50007              # Тот же порт, что и у сервера564s = None565for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):566    af, socktype, proto, canonname, sa = res567    try:568        s = socket.socket(af, socktype, proto)569    except socket.error as msg:570        s = None571        continue572    try:573        s.connect(sa)574    except socket.error as msg:575        s.close()576        s = None577        continue578    break579if s is None:580    print('could not open socket')581    sys.exit(1)582s.sendall(b'Hello, world')583data = s.recv(1024)584s.close()585print('Received', repr(data))586```587588Последний пример показывает, как написать очень простой сетевой сниффер с помощью сырых сокетов в Windows. Для выполнения примера требуются права администратора для изменения интерфейса:589590```python591import socket592593# общедоступный сетевой интерфейс594HOST = socket.gethostbyname(socket.gethostname())595596# создать сырой сокет и привязать его к общедоступному интерфейсу597s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)598s.bind((HOST, 0))599600# Включать IP-заголовки601s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)602603# принять все пакеты604s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)605606# принять пакет607print(s.recvfrom(65565))608609# неразборчивый режим отключён610s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)611```612613Запуск примера несколько раз со слишком маленькой задержкой между выполнениями может привести к этой ошибке:614615```python616socket.error: [Errno 98] Address already in use617```618619Это связано с тем, что предыдущее выполнение оставило сокет в состоянии `TIME_WAIT`, и его нельзя сразу использовать повторно.620621Существует флаг [`socket`](https://python-all.ru/3.2/library/socket.html#module-socket), который можно установить, чтобы предотвратить это: `socket.SO_REUSEADDR`622623```python624s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)625s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)626s.bind((HOST, PORT))627```628629флаг `SO_REUSEADDR` указывает ядру повторно использовать локальный сокет в состоянии `TIME_WAIT`, не дожидаясь истечения его естественного тайм-аута.630631> **См. также**632>633> Для ознакомления с программированием сокетов (на C) см. следующие статьи:634>635> - *Вводное руководство по межпроцессному взаимодействию в 4.3BSD*, Стюарт Сечрест636> - *Продвинутое руководство по межпроцессному взаимодействию в 4.3BSD*, Сэмюэл Дж. Леффлер и др.637>638> Оба находятся в 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.2/library/socket.html) под названием Basic Socket Interface Extensions for IPv6.639