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

socket.md

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

1> **Источник:** https://python-all.ru/2.7/library/socket.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 17.2. [`socket`](https://python-all.ru/2.7/library/socket.html#module-socket) – Низкоуровневый сетевой интерфейс89Этот модуль предоставляет доступ к интерфейсу BSD *socket*. Он доступен на всех современных системах Unix, Windows, Mac OS X, BeOS, OS/2 и, вероятно, на других платформах.1011> **Примечание**12>13> Некоторые аспекты поведения могут зависеть от платформы, поскольку вызовы выполняются через API сокетов операционной системы.1415Для введения в программирование сокетов (на C) см. следующие статьи: «An Introductory 4.3BSD Interprocess Communication Tutorial» (Стюарт Сечрест) и «An Advanced 4.3BSD Interprocess Communication Tutorial» (Сэмюэл Дж. Леффлер и др.), обе в UNIX Programmer’s Manual, Supplementary Documents 1 (разделы PS1:7 и PS1:8). Справочные материалы, специфичные для платформы, по различным системным вызовам сокетов также являются ценным источником информации о деталях семантики сокетов. Для Unix обратитесь к man-страницам; для Windows – к спецификации WinSock (или Winsock 2). Для API, поддерживающих IPv6, читателям рекомендуется обратиться к [**RFC 3493**](https://python-all.ru/2.7/library/socket.html) под названием «Basic Socket Interface Extensions for IPv6».1617Интерфейс Python представляет собой прямую трансляцию системных вызовов Unix и библиотечного интерфейса сокетов в объектно-ориентированный стиль Python: функция [`socket()`](https://python-all.ru/2.7/library/socket.html#socket.socket) возвращает *объект сокета*, методы которого реализуют различные системные вызовы сокетов. Типы параметров несколько более высокоуровневые, чем в интерфейсе C: как и при операциях `read()` и `write()` с файлами Python, выделение буфера при операциях приёма происходит автоматически, а длина буфера неявно задаётся при отправке.1819Сокетные адреса представляются следующим образом: для семейства адресов [`AF_UNIX`](https://python-all.ru/2.7/library/socket.html#socket.AF_UNIX) используется одна строка. Пара `(host, port)` используется для семейства адресов [`AF_INET`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET), где *host* – это строка, представляющая либо имя хоста в доменной нотации, например `'daring.cwi.nl'`, либо IPv4-адрес, например `'100.50.200.5'`, а *port* – целое число. Для семейства адресов [`AF_INET6`](https://python-all.ru/2.7/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/2.7/library/socket.html#module-socket) *flowinfo* и *scopeid* могут быть опущены для обратной совместимости. Однако обратите внимание, что опущение *scopeid* может вызвать проблемы при работе с адресами IPv6 с областью действия. Другие семейства адресов в настоящее время не поддерживаются. Формат адреса, требуемый конкретным сокетным объектом, автоматически выбирается на основе семейства адресов, указанного при создании сокетного объекта.2021Для IPv4-адресов вместо адреса хоста принимаются две специальные формы: пустая строка представляет `INADDR_ANY`, а строка `'<broadcast>'` представляет `INADDR_BROADCAST`. Это поведение недоступно для IPv6 для обратной совместимости, поэтому, если вы планируете поддерживать IPv6 в своих программах на Python, возможно, стоит избегать этих форм.2223Если в части *узел* адреса сокета IPv4/v6 указано имя узла, программа может демонстрировать недетерминированное поведение, так как Python использует первый адрес, возвращённый при разрешении DNS. Адрес сокета будет разрешаться по-разному в фактический IPv4/v6-адрес в зависимости от результатов разрешения DNS и/или конфигурации узла. Для детерминированного поведения используйте числовой адрес в части *узел*.2425Новое в версии 2.5: Сокеты AF\_NETLINK представляются в виде пар `pid, groups`.2627Новое в версии 2.6: Поддержка только для Linux для TIPC также доступна с использованием семейства адресов `AF_TIPC`. TIPC – это открытый сетевой протокол на основе не-IP, предназначенный для использования в кластерных средах. Адреса представляются кортежем, и поля зависят от типа адреса. Общая форма кортежа: `(addr_type, v1, v2, v3 [, scope])`, где:2829- *addr\_type* – одно из значений `TIPC_ADDR_NAMESEQ`, `TIPC_ADDR_NAME` или `TIPC_ADDR_ID`.30- *scope* – это одно из `TIPC_ZONE_SCOPE`, `TIPC_CLUSTER_SCOPE`, и `TIPC_NODE_SCOPE`.31- Если *addr\_type* равно `TIPC_ADDR_NAME`, то *v1* – тип сервера, *v2* – идентификатор порта, а *v3* должно быть 0.3233  Если *addr\_type* равно `TIPC_ADDR_NAMESEQ`, то *v1* – тип сервера, *v2* – нижний номер порта, а *v3* – верхний номер порта.3435  Если *addr\_type* равно `TIPC_ADDR_ID`, то *v1* – узел, *v2* – ссылка, а *v3* должно быть установлено в 0.3637Все ошибки вызывают исключения. Могут возникать обычные исключения для недопустимых типов аргументов и нехватки памяти; ошибки, связанные с семантикой сокетов или адресов, вызывают ошибку [`socket.error`](https://python-all.ru/2.7/library/socket.html#socket.error).3839Неблокирующий режим поддерживается через [`setblocking()`](https://python-all.ru/2.7/library/socket.html#socket.socket.setblocking). Его обобщение на основе тайм-аутов поддерживается через [`settimeout()`](https://python-all.ru/2.7/library/socket.html#socket.socket.settimeout).4041Модуль [`socket`](https://python-all.ru/2.7/library/socket.html#module-socket) предоставляет следующие константы и функции:4243#### `exception socket.error`4445Это исключение возникает при ошибках, связанных с сокетами. Сопутствующее значение – это либо строка, описывающая ошибку, либо пара `(errno, string)`, представляющая ошибку, возвращённую системным вызовом, аналогично значению, сопровождающему [`os.error`](https://python-all.ru/2.7/library/os.html#os.error). Смотрите модуль [`errno`](https://python-all.ru/2.7/library/errno.html#module-errno), который содержит имена для кодов ошибок, определённых базовой операционной системой.4647Изменено в версии 2.6: [`socket.error`](https://python-all.ru/2.7/library/socket.html#socket.error) теперь является дочерним классом [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError).4849#### `exception socket.herror`5051Это исключение возникает при ошибках, связанных с адресами, т.е. для функций, использующих *h\_errno* в C API, включая [`gethostbyname_ex()`](https://python-all.ru/2.7/library/socket.html#socket.gethostbyname_ex) и [`gethostbyaddr()`](https://python-all.ru/2.7/library/socket.html#socket.gethostbyaddr).5253Сопутствующее значение – это пара `(h_errno, string)`, представляющая ошибку, возвращённую вызовом библиотеки. *string* представляет описание *h\_errno*, как возвращено функцией C `hstrerror()`.5455#### `exception socket.gaierror`5657Это исключение возникает при ошибках, связанных с адресами, для [`getaddrinfo()`](https://python-all.ru/2.7/library/socket.html#socket.getaddrinfo) и [`getnameinfo()`](https://python-all.ru/2.7/library/socket.html#socket.getnameinfo). Сопутствующее значение – это пара `(error, string)`, представляющая ошибку, возвращённую вызовом библиотеки. *string* представляет описание *error*, как возвращено функцией C `gai_strerror()`. Значение *error* будет соответствовать одной из констант `EAI_*`, определённых в этом модуле.5859#### `exception socket.timeout`6061Это исключение возникает при тайм-ауте на сокете, на котором тайм-ауты были включены предыдущим вызовом `settimeout()`. Сопутствующее значение – это строка, значение которой в настоящее время всегда «timed out».6263Новое в версии 2.3.6465#### `socket.AF_UNIX`6667#### `socket.AF_INET`6869#### `socket.AF_INET6`7071Эти константы представляют семейства адресов (и протоколов), используемые для первого аргумента [`socket()`](https://python-all.ru/2.7/library/socket.html#socket.socket). Если константа [`AF_UNIX`](https://python-all.ru/2.7/library/socket.html#socket.AF_UNIX) не определена, то этот протокол не поддерживается.7273#### `socket.SOCK_STREAM`7475#### `socket.SOCK_DGRAM`7677#### `socket.SOCK_RAW`7879#### `socket.SOCK_RDM`8081#### `socket.SOCK_SEQPACKET`8283Эти константы представляют типы сокетов, используемые для второго аргумента [`socket()`](https://python-all.ru/2.7/library/socket.html#module-socket). (Обычно полезными оказываются только [`SOCK_STREAM`](https://python-all.ru/2.7/library/socket.html#socket.SOCK_STREAM) и [`SOCK_DGRAM`](https://python-all.ru/2.7/library/socket.html#socket.SOCK_DGRAM).)8485#### `SO_*`8687#### `socket.SOMAXCONN`8889#### `MSG_*`9091#### `SOL_*`9293#### `IPPROTO_*`9495#### `IPPORT_*`9697#### `INADDR_*`9899#### `IP_*`100101#### `IPV6_*`102103#### `EAI_*`104105#### `AI_*`106107#### `NI_*`108109#### `TCP_*`110111Многие константы этих форм, описанные в документации Unix по сокетам и/или протоколу IP, также определены в модуле socket. Они обычно используются в аргументах методов `setsockopt()` и `getsockopt()` объектов сокетов. В большинстве случаев определены только те символы, которые есть в заголовочных файлах Unix; для некоторых символов предоставлены значения по умолчанию.112113#### `SIO_*`114115#### `RCVALL_*`116117Константы для Windows’ WSAIoctl(). Эти константы используются в качестве аргументов метода [`ioctl()`](https://python-all.ru/2.7/library/socket.html#socket.socket.ioctl) объектов сокетов.118119Новое в версии 2.6.120121#### `TIPC_*`122123Константы, связанные с TIPC, соответствующие тем, что экспортируются C API сокетов. Дополнительную информацию см. в документации TIPC.124125Новое в версии 2.6.126127#### `socket.has_ipv6`128129Эта константа содержит логическое значение, указывающее, поддерживается ли IPv6 на данной платформе.130131Новое в версии 2.3.132133#### `socket.create_connection(address[, timeout[, source_address]])`134135Подключается к TCP-службе, прослушивающей *адрес* в интернете (кортеж из двух элементов `(host, port)`), и возвращает объект сокета. Это функция более высокого уровня, чем [`socket.connect()`](https://python-all.ru/2.7/library/socket.html#socket.socket.connect): если *host* – нечисловое имя узла, он будет пытаться разрешить его как для [`AF_INET`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET), так и для [`AF_INET6`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET6), а затем пытаться подключаться ко всем возможным адресам по очереди, пока подключение не установится. Это упрощает написание клиентов, совместимых как с IPv4, так и с IPv6.136137Передача необязательного параметра *timeout* установит тайм-аут для экземпляра сокета перед попыткой подключения. Если *timeout* не указан, используется глобальная настройка тайм-аута по умолчанию, возвращаемая [`getdefaulttimeout()`](https://python-all.ru/2.7/library/socket.html#socket.getdefaulttimeout).138139Если указан, *source\_address* должен быть кортежем из двух элементов `(host, port)`, к которому сокет должен привязаться как к своему исходному адресу перед подключением. Если хост или порт равны '' или 0 соответственно, будет использовано поведение ОС по умолчанию.140141Новое в версии 2.6.142143Изменено в версии 2.7: *source\_address* был добавлен.144145#### `socket.getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]])`146147Преобразует аргументы *host*/*port* в последовательность кортежей из 5 элементов, содержащих все необходимые аргументы для создания сокета, подключенного к этому сервису. *host* – это доменное имя, строковое представление IPv4/v6-адреса или `None`. *port* – это строковое имя службы, такое как `'http'`, числовой номер порта или `None`. Передавая `None` в качестве значения *host* и *port*, можно передать `NULL` в базовый C API.148149Аргументы *family*, *socktype* и *proto* могут быть указаны по желанию, чтобы сузить список возвращаемых адресов. По умолчанию их значение равно `0`, что означает выбор полного диапазона результатов. Аргумент *flags* может быть одной или несколькими константами `AI_*` и будет влиять на то, как вычисляются и возвращаются результаты. Его значение по умолчанию `0`. Например, `AI_NUMERICHOST` отключит разрешение доменных имён и вызовет ошибку, если *host* является доменным именем.150151Функция возвращает список кортежей из 5 элементов со следующей структурой:152153`(family, socktype, proto, canonname, sockaddr)`154155В этих кортежах *family*, *socktype*, *proto* – целые числа и предназначены для передачи в функцию [`socket()`](https://python-all.ru/2.7/library/socket.html#socket.socket). *canonname* будет строкой, представляющей каноническое имя *хоста*, если `AI_CANONNAME` является частью аргумента *flags*; в противном случае *canonname* будет пустым. *sockaddr* – это кортеж, описывающий сокетный адрес, формат которого зависит от возвращаемого *family* (кортеж из 2 элементов `(address, port)` для [`AF_INET`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET), кортеж из 4 элементов `(address, port, flow info, scope id)` для [`AF_INET6`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET6)), и предназначен для передачи в метод [`socket.connect()`](https://python-all.ru/2.7/library/socket.html#socket.socket.connect).156157В следующем примере получается информация об адресе для гипотетического TCP-подключения к `example.org` на порту 80 (результаты могут отличаться на вашей системе, если IPv6 не включён):158159```python160>>> socket.getaddrinfo("example.org", 80, 0, 0, socket.IPPROTO_TCP)161[(10, 1, 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),162 (2, 1, 6, '', ('93.184.216.34', 80))]163```164165Новое в версии 2.2.166167#### `socket.getfqdn([name])`168169Возвращает полностью определённое доменное имя для *name*. Если *name* опущен или пуст, он интерпретируется как локальный хост. Для поиска полного имени сначала проверяется имя хоста, возвращаемое [`gethostbyaddr()`](https://python-all.ru/2.7/library/socket.html#socket.gethostbyaddr), затем, если доступны, псевдонимы хоста. Выбирается первое имя, содержащее точку. Если полностью определённое доменное имя недоступно, возвращается имя хоста, полученное от [`gethostname()`](https://python-all.ru/2.7/library/socket.html#socket.gethostname).170171Новое в версии 2.0.172173#### `socket.gethostbyname(hostname)`174175Преобразует имя хоста в формат IPv4-адреса. IPv4-адрес возвращается в виде строки, например `'100.50.200.5'`. Если имя хоста само является IPv4-адресом, оно возвращается без изменений. См. [`gethostbyname_ex()`](https://python-all.ru/2.7/library/socket.html#socket.gethostbyname_ex) для более полного интерфейса. [`gethostbyname()`](https://python-all.ru/2.7/library/socket.html#socket.gethostbyname) не поддерживает разрешение имён IPv6, вместо него для поддержки двойного стека IPv4/v6 следует использовать [`getaddrinfo()`](https://python-all.ru/2.7/library/socket.html#socket.getaddrinfo).176177#### `socket.gethostbyname_ex(hostname)`178179Преобразует имя хоста в формат IPv4-адреса (расширенный интерфейс). Возвращает тройку `(hostname, aliaslist, ipaddrlist)`, где *hostname* – основное имя хоста, отвечающее на заданный *ip\_address*; *aliaslist* – (возможно пустой) список альтернативных имён хоста для того же адреса; и *ipaddrlist* – список IPv4-адресов для того же интерфейса на том же хосте (часто, но не всегда, один адрес). [`gethostbyname_ex()`](https://python-all.ru/2.7/library/socket.html#socket.gethostbyname_ex) не поддерживает разрешение имён IPv6, а для поддержки IPv4/IPv6 двойного стека следует использовать [`getaddrinfo()`](https://python-all.ru/2.7/library/socket.html#socket.getaddrinfo).180181#### `socket.gethostname()`182183Возвращает строку, содержащую имя хоста машины, на которой в данный момент выполняется интерпретатор Python.184185Если вы хотите узнать IP-адрес текущей машины, можно использовать `gethostbyname(gethostname())`. Эта операция предполагает, что для хоста существует допустимое отображение адреса на хост, однако это предположение не всегда выполняется.186187Примечание: [`gethostname()`](https://python-all.ru/2.7/library/socket.html#socket.gethostname) не всегда возвращает полностью определённое доменное имя; используйте `getfqdn()` (см. выше).188189#### `socket.gethostbyaddr(ip_address)`190191Возвращает кортеж `(hostname, aliaslist, ipaddrlist)`, где *hostname* – это основное имя хоста, соответствующее заданному *ip\_address*, *aliaslist* – (возможно пустой) список альтернативных имён хоста для того же адреса, а *ipaddrlist* – список IPv4/v6-адресов для того же интерфейса на том же хосте (скорее всего, содержащий только один адрес). Чтобы найти полностью определённое доменное имя, используйте функцию [`getfqdn()`](https://python-all.ru/2.7/library/socket.html#socket.getfqdn). [`gethostbyaddr()`](https://python-all.ru/2.7/library/socket.html#socket.gethostbyaddr) поддерживает как IPv4, так и IPv6.192193#### `socket.getnameinfo(sockaddr, flags)`194195Преобразует адрес сокета *sockaddr* в кортеж из двух элементов `(host, port)`. В зависимости от настроек *flags* результат может содержать полное доменное имя или числовое представление адреса в *host*. Аналогично, *port* может содержать строковое имя порта или числовой номер порта.196197Новое в версии 2.2.198199#### `socket.getprotobyname(protocolname)`200201Преобразует имя интернет-протокола (например, `'icmp'`) в константу, пригодную для передачи в качестве (необязательного) третьего аргумента функции [`socket()`](https://python-all.ru/2.7/library/socket.html#socket.socket). Обычно это требуется только для сокетов, открытых в «сыром» режиме ([`SOCK_RAW`](https://python-all.ru/2.7/library/socket.html#socket.SOCK_RAW)); для обычных режимов сокетов правильный протокол выбирается автоматически, если протокол опущен или равен нулю.202203#### `socket.getservbyname(servicename[, protocolname])`204205Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если указано, должно быть `'tcp'` или `'udp'`, в противном случае подойдет любой протокол.206207#### `socket.getservbyport(port[, protocolname])`208209Преобразует номер порта интернет-службы и имя протокола в имя службы для этой службы. Необязательное имя протокола, если указано, должно быть `'tcp'` или `'udp'`, в противном случае подойдет любой протокол.210211#### `socket.socket([family[, type[, proto]]])`212213Создаёт новый сокет с указанным семейством адресов, типом сокета и номером протокола. Семейство адресов должно быть [`AF_INET`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET) (по умолчанию), [`AF_INET6`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET6) или [`AF_UNIX`](https://python-all.ru/2.7/library/socket.html#socket.AF_UNIX). Тип сокета должен быть [`SOCK_STREAM`](https://python-all.ru/2.7/library/socket.html#socket.SOCK_STREAM) (по умолчанию), [`SOCK_DGRAM`](https://python-all.ru/2.7/library/socket.html#socket.SOCK_DGRAM) или, возможно, одной из других констант `SOCK_`. Номер протокола обычно равен нулю и в этом случае может быть опущен.214215#### `socket.socketpair([family[, type[, proto]]])`216217Создаёт пару связанных объектов сокета, используя заданные семейство адресов, тип сокета и номер протокола. Семейство адресов, тип сокета и номер протокола такие же, как для функции [`socket()`](https://python-all.ru/2.7/library/socket.html#socket.socket) выше. Семейство по умолчанию – [`AF_UNIX`](https://python-all.ru/2.7/library/socket.html#socket.AF_UNIX), если оно определено на платформе; в противном случае по умолчанию используется [`AF_INET`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET). Доступность: Unix.218219Новое в версии 2.4.220221#### `socket.fromfd(fd, family, type[, proto])`222223Дублирует файловый дескриптор *fd* (целое число, возвращаемое методом `fileno()` файлового объекта) и создаёт из результата объект сокета. Семейство адресов, тип сокета и номер протокола такие же, как для функции [`socket()`](https://python-all.ru/2.7/library/socket.html#socket.socket) выше. Файловый дескриптор должен указывать на сокет, но это не проверяется; последующие операции с объектом могут завершиться ошибкой, если файловый дескриптор некорректен. Эта функция редко требуется, но может использоваться для получения или установки параметров сокета, переданного программе в качестве стандартного ввода или вывода (например, сервер, запущенный демоном Unix inet). Предполагается, что сокет работает в блокирующем режиме. Доступность: Unix.224225#### `socket.ntohl(x)`226227Преобразует 32-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта операция ничего не делает; в противном случае выполняется перестановка 4 байтов.228229#### `socket.ntohs(x)`230231Преобразует 16-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.232233#### `socket.htonl(x)`234235Преобразует 32-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен четырёх байтов.236237#### `socket.htons(x)`238239Преобразует 16-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.240241#### `socket.inet_aton(ip_string)`242243Преобразует IPv4-адрес из точечно-десятичного строкового формата (например, '123.45.67.89') в 32-битный упакованный двоичный формат в виде строки длиной четыре символа. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `struct in_addr`, который является типом C для 32-битных упакованных двоичных данных, возвращаемых этой функцией.244245[`inet_aton()`](https://python-all.ru/2.7/library/socket.html#socket.inet_aton) также принимает строки с менее чем тремя точками; подробнее см. на странице руководства Unix *inet(3)*.246247Если переданная функции строка IPv4-адреса недопустима, будет возбуждено [`socket.error`](https://python-all.ru/2.7/library/socket.html#socket.error). Обратите внимание: что именно считается допустимым, зависит от нижележащей C-реализации `inet_aton()`.248249[`inet_aton()`](https://python-all.ru/2.7/library/socket.html#socket.inet_aton) не поддерживает IPv6; для поддержки двойного стека IPv4/IPv6 следует использовать [`inet_pton()`](https://python-all.ru/2.7/library/socket.html#socket.inet_pton).250251#### `socket.inet_ntoa(packed_ip)`252253Преобразует 32-битный упакованный IPv4-адрес (строку длиной четыре символа) в его стандартное точечно-десятичное строковое представление (например, '123.45.67.89'). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `struct in_addr`, который является типом C для 32-битных упакованных двоичных данных, принимаемых этой функцией в качестве аргумента.254255Если переданная этой функции строка имеет длину не ровно 4 байта, будет вызвано исключение [`socket.error`](https://python-all.ru/2.7/library/socket.html#socket.error). Функция [`inet_ntoa()`](https://python-all.ru/2.7/library/socket.html#socket.inet_ntoa) не поддерживает IPv6, для поддержки двух стеков IPv4/v6 вместо неё следует использовать [`inet_ntop()`](https://python-all.ru/2.7/library/socket.html#socket.inet_ntop).256257#### `socket.inet_pton(address_family, ip_string)`258259Преобразует IP-адрес из строкового формата, зависящего от семейства, в упакованный двоичный формат. Функция [`inet_pton()`](https://python-all.ru/2.7/library/socket.html#socket.inet_pton) полезна, когда библиотека или сетевой протокол требует объект типа `struct in_addr` (аналогичного [`inet_aton()`](https://python-all.ru/2.7/library/socket.html#socket.inet_aton)) или `struct in6_addr`.260261В настоящее время поддерживаемые значения для *address\_family*: [`AF_INET`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET) и [`AF_INET6`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET6). Если строка IP-адреса *ip\_string* недопустима, будет возбуждено [`socket.error`](https://python-all.ru/2.7/library/socket.html#socket.error). Обратите внимание: что именно считается допустимым, зависит как от значения *address\_family*, так и от нижележащей реализации `inet_pton()`.262263Доступность: Unix (возможно, не на всех платформах).264265Новое в версии 2.3.266267#### `socket.inet_ntop(address_family, packed_ip)`268269Преобразует упакованный IP-адрес (строку из некоторого количества символов) в его стандартное строковое представление, зависящее от семейства (например, `'7.10.0.5'` или `'5aef:2b::8'`). Функция [`inet_ntop()`](https://python-all.ru/2.7/library/socket.html#socket.inet_ntop) полезна, когда библиотека или сетевой протокол возвращает объект типа `struct in_addr` (аналогичного [`inet_ntoa()`](https://python-all.ru/2.7/library/socket.html#socket.inet_ntoa)) или `struct in6_addr`.270271Поддерживаемые значения для параметра *address\_family* в настоящее время: [`AF_INET`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET) и [`AF_INET6`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET6). Если строка *packed\_ip* имеет неверную длину для указанного семейства адресов, будет вызвано исключение [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError). Исключение [`socket.error`](https://python-all.ru/2.7/library/socket.html#socket.error) вызывается при ошибках вызова [`inet_ntop()`](https://python-all.ru/2.7/library/socket.html#socket.inet_ntop).272273Доступность: Unix (возможно, не на всех платформах).274275Новое в версии 2.3.276277#### `socket.getdefaulttimeout()`278279Возвращает тайм-аут по умолчанию в секундах (число с плавающей запятой) для новых объектов сокетов. Значение `None` означает, что новые объекты сокетов не имеют тайм-аута. При первом импорте модуля socket значение по умолчанию равно `None`.280281Новое в версии 2.3.282283#### `socket.setdefaulttimeout(timeout)`284285Устанавливает таймаут по умолчанию в секундах (число с плавающей точкой) для новых объектов сокета. Значение `None` означает, что новые объекты сокета не имеют таймаута. При первом импорте модуля socket значение по умолчанию равно `None`.286287Новое в версии 2.3.288289#### `socket.SocketType`290291Это объект типа Python, представляющий тип объекта сокета. Он аналогичен `type(socket(...))`.292293> **См. также**294>295> **Модуль [`SocketServer`](https://python-all.ru/2.7/library/socketserver.html#module-SocketServer)**296>297> Классы, упрощающие написание сетевых серверов.298>299> **Модуль [`ssl`](https://python-all.ru/2.7/library/ssl.html#module-ssl)**300>301> Обёртка TLS/SSL для объектов сокетов.302303## 17.2.1. Сокетные объекты304305Объекты сокета имеют следующие методы. За исключением `makefile()`, они соответствуют системным вызовам Unix, применимым к сокетам.306307#### `socket.accept()`308309Принимает соединение. Сокет должен быть привязан к адресу и находиться в режиме прослушивания. Возвращаемое значение – пара `(conn, address)`, где *conn* – это *новый* объект сокета, пригодный для отправки и получения данных по соединению, а *address* – адрес, привязанный к сокету на другом конце соединения.310311#### `socket.bind(address)`312313Привязывает сокет к *address*. Сокет не должен быть уже привязан. (Формат *address* зависит от семейства адресов – см. выше.)314315> **Примечание**316>317> Исторически этот метод принимал пару параметров для адресов [`AF_INET`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET) вместо одного кортежа. Это никогда не было задумано и больше не поддерживается в Python 2.0 и более поздних версиях.318319#### `socket.close()`320321Закрывает сокет. Все последующие операции с объектом сокета будут завершаться ошибкой. Удаленная сторона не получит больше данных (после сброса находящихся в очереди данных). Сокеты автоматически закрываются при сборке мусора.322323> **Примечание**324>325> [`close()`](https://python-all.ru/2.7/library/socket.html#socket.socket.close) освобождает ресурс, связанный с соединением, но не обязательно немедленно закрывает соединение. Если требуется своевременно закрыть соединение, вызовите [`shutdown()`](https://python-all.ru/2.7/library/socket.html#socket.socket.shutdown) перед [`close()`](https://python-all.ru/2.7/library/socket.html#socket.socket.close).326327#### `socket.connect(address)`328329Подключается к удалённому сокету по адресу *address*. (Формат *address* зависит от семейства адресов – см. выше.)330331> **Примечание**332>333> Исторически этот метод принимал пару параметров для адресов [`AF_INET`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET) вместо одного кортежа. Это никогда не было задумано и больше не поддерживается в Python 2.0 и более поздних версиях.334335#### `socket.connect_ex(address)`336337Как и `connect(address)`, но возвращает индикатор ошибки вместо возбуждения исключения для ошибок, возвращаемых вызовом `connect()` на уровне C (другие проблемы, например «хост не найден», по-прежнему могут вызывать исключения). Индикатор ошибки равен `0`, если операция выполнена успешно, в противном случае – значению переменной `errno`. Это удобно, например, для поддержки асинхронных подключений.338339> **Примечание**340>341> Исторически этот метод принимал пару параметров для адресов [`AF_INET`](https://python-all.ru/2.7/library/socket.html#socket.AF_INET) вместо одного кортежа. Это никогда не было задумано и больше не поддерживается в Python 2.0 и более поздних версиях.342343#### `socket.fileno()`344345Возвращает файловый дескриптор сокета (небольшое целое число). Это полезно совместно с [`select.select()`](https://python-all.ru/2.7/library/select.html#select.select).346347В Windows небольшое целое число, возвращаемое этим методом, нельзя использовать там, где может быть использован файловый дескриптор (например, [`os.fdopen()`](https://python-all.ru/2.7/library/os.html#os.fdopen)). В Unix такого ограничения нет.348349#### `socket.getpeername()`350351Возвращает удалённый адрес, к которому подключён сокет. Это полезно, например, для определения номера порта удалённого сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов – см. выше.) На некоторых системах эта функция не поддерживается.352353#### `socket.getsockname()`354355Возвращает собственный адрес сокета. Это полезно, например, для определения номера порта сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов – см. выше.)356357#### `socket.getsockopt(level, optname[, buflen])`358359Возвращает значение заданной опции сокета (см. man-страницу Unix *getsockopt(2)*). Необходимые символические константы (`SO_*` и т.д.) определены в этом модуле. Если параметр *buflen* отсутствует, предполагается целочисленная опция, и функция возвращает её целое значение. Если параметр *buflen* присутствует, он задаёт максимальную длину буфера для получения опции, и этот буфер возвращается в виде строки. Разбор содержимого буфера возлагается на вызывающий код (см. опциональный встроенный модуль [`struct`](https://python-all.ru/2.7/library/struct.html#module-struct) для декодирования структур C, закодированных в виде строк).360361#### `socket.ioctl(control, option)`362363**Платформа**364365Windows366367Метод [`ioctl()`](https://python-all.ru/2.7/library/socket.html#socket.socket.ioctl) является ограниченным интерфейсом к системному интерфейсу WSAIoctl. За дополнительной информацией обратитесь к [документации Win32](https://python-all.ru/2.7/library/socket.html).368369На других платформах можно использовать общие функции [`fcntl.fcntl()`](https://python-all.ru/2.7/library/fcntl.html#fcntl.fcntl) и [`fcntl.ioctl()`](https://python-all.ru/2.7/library/fcntl.html#fcntl.ioctl); они принимают объект сокета в качестве первого аргумента.370371Новое в версии 2.6.372373#### `socket.listen(backlog)`374375Ожидает подключения к сокету. Аргумент *backlog* задаёт максимальное количество ожидающих соединений в очереди и должен быть не меньше 0; максимальное значение зависит от системы (обычно 5), минимальное принудительно устанавливается в 0.376377#### `socket.makefile([mode[, bufsize]])`378379Возвращает *файловый объект*, связанный с сокетом. (Файловые объекты описаны в разделе [Файловые объекты](https://python-all.ru/2.7/library/stdtypes.html#bltin-file-objects).) Файловый объект не закрывает сокет явно при вызове метода [`close()`](https://python-all.ru/2.7/library/socket.html#socket.socket.close), а лишь удаляет свою ссылку на объект сокета, так что сокет будет закрыт, если на него нет других ссылок.380381Сокет должен быть в блокирующем режиме (не может иметь таймаут). Необязательные аргументы *mode* и *bufsize* интерпретируются так же, как и встроенной функцией [`file()`](https://python-all.ru/2.7/library/functions.html#file).382383> **Примечание**384>385> В Windows файлоподобный объект, созданный [`makefile()`](https://python-all.ru/2.7/library/socket.html#socket.socket.makefile), нельзя использовать там, где ожидается файловый объект с дескриптором файла, например, в аргументах потока [`subprocess.Popen()`](https://python-all.ru/2.7/library/subprocess.html#subprocess.Popen).386387#### `socket.recv(bufsize[, flags])`388389Получает данные из сокета. Возвращаемое значение – строка, представляющая полученные данные. Максимальное количество данных, получаемых за один раз, задаётся параметром *bufsize*. См. man-страницу Unix *recv(2)* для описания необязательного аргумента *flags*; по умолчанию он равен нулю.390391> **Примечание**392>393> Для наилучшего соответствия реальным характеристикам оборудования и сети значение *bufsize* должно быть относительно небольшой степенью двойки, например, 4096.394395#### `socket.recvfrom(bufsize[, flags])`396397Получает данные из сокета. Возвращаемое значение – пара `(string, address)`, где *string* – строка с полученными данными, а *address* – адрес сокета, отправившего данные. См. страницу руководства Unix *recv(2)* для пояснения необязательного аргумента *flags*; по умолчанию он равен нулю. (Формат *address* зависит от семейства адресов – см. выше.)398399#### `socket.recvfrom_into(buffer[, nbytes[, flags]])`400401Получает данные из сокета, записывая их в *buffer* вместо создания новой строки. Возвращаемое значение – пара `(nbytes, address)`, где *nbytes* – количество полученных байтов, а *address* – адрес сокета, отправившего данные. См. страницу руководства Unix *recv(2)* для пояснения необязательного аргумента *flags*; по умолчанию он равен нулю. (Формат *address* зависит от семейства адресов – см. выше.)402403Новое в версии 2.5.404405#### `socket.recv_into(buffer[, nbytes[, flags]])`406407Получает из сокета до *nbytes* байтов, сохраняя данные в буфер, а не создавая новую строку. Если *nbytes* не указан (или равен 0), принимается столько байтов, сколько помещается в переданный буфер. Возвращает количество полученных байтов. См. страницу руководства Unix *recv(2)* для пояснения необязательного аргумента *flags*; по умолчанию он равен нулю.408409Новое в версии 2.5.410411#### `socket.send(string[, flags])`412413Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент *flags* имеет то же значение, что и для [`recv()`](https://python-all.ru/2.7/library/socket.html#socket.socket.recv) выше. Возвращает количество отправленных байтов. Приложения должны проверять, что все данные отправлены; если передана только часть данных, приложению необходимо попытаться доставить оставшиеся данные. Дополнительную информацию об этой концепции см. в [Socket Programming HOWTO](https://python-all.ru/2.7/howto/sockets.html#socket-howto).414415#### `socket.sendall(string[, flags])`416417Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент *flags* имеет то же значение, что и для [`recv()`](https://python-all.ru/2.7/library/socket.html#socket.socket.recv) выше. В отличие от [`send()`](https://python-all.ru/2.7/library/socket.html#socket.socket.send), этот метод продолжает отправлять данные из *string* до тех пор, пока не будут отправлены все данные или не возникнет ошибка. В случае успеха возвращается `None`. При ошибке возникает исключение, и нет способа определить, сколько данных (если вообще какие-то) было успешно отправлено.418419#### `socket.sendto(string, address)`420421#### `socket.sendto(string, flags, address)`422423Отправляет данные в сокет. Сокет не должен быть подключён к удалённому сокету, поскольку целевой сокет задаётся параметром *address*. Необязательный аргумент *flags* имеет тот же смысл, что и для [`recv()`](https://python-all.ru/2.7/library/socket.html#socket.socket.recv) выше. Возвращает количество отправленных байтов. (Формат *address* зависит от семейства адресов – см. выше.)424425#### `socket.setblocking(flag)`426427Устанавливает блокирующий или неблокирующий режим сокета: если *flag* равен 0, сокет переводится в неблокирующий режим, иначе – в блокирующий. Изначально все сокеты находятся в блокирующем режиме. В неблокирующем режиме, если вызов [`recv()`](https://python-all.ru/2.7/library/socket.html#socket.socket.recv) не находит данных, или если вызов [`send()`](https://python-all.ru/2.7/library/socket.html#socket.socket.send) не может немедленно отправить данные, возникает исключение [`error`](https://python-all.ru/2.7/library/socket.html#socket.error); в блокирующем режиме вызовы блокируются, пока не смогут продолжить. `s.setblocking(0)` эквивалентно `s.settimeout(0.0)`; `s.setblocking(1)` эквивалентно `s.settimeout(None)`.428429#### `socket.settimeout(value)`430431Устанавливает тайм-аут для блокирующих операций с сокетом. Аргумент *value* может быть неотрицательным числом с плавающей точкой, задающим секунды, или `None`. Если передано число с плавающей точкой, последующие операции с сокетом будут вызывать исключение [`timeout`](https://python-all.ru/2.7/library/socket.html#socket.timeout), если время тайм-аута *value* истекло до завершения операции. Установка тайм-аута в `None` отключает тайм-ауты для операций с сокетом. `s.settimeout(0.0)` эквивалентно `s.setblocking(0)`; `s.settimeout(None)` эквивалентно `s.setblocking(1)`.432433Новое в версии 2.3.434435#### `socket.gettimeout()`436437Возвращает тайм-аут в секундах (число с плавающей точкой), связанный с операциями с сокетом, или `None`, если тайм-аут не установлен. Это значение отражает последний вызов [`setblocking()`](https://python-all.ru/2.7/library/socket.html#socket.socket.setblocking) или [`settimeout()`](https://python-all.ru/2.7/library/socket.html#socket.socket.settimeout).438439Новое в версии 2.3.440441Некоторые замечания о блокировке сокетов и тайм-аутах: объект сокета может находиться в одном из трёх режимов: блокирующий, неблокирующий или с тайм-аутом. Сокеты всегда создаются в блокирующем режиме. В блокирующем режиме операции блокируются до завершения или до возврата системой ошибки (например, истекло время соединения). В неблокирующем режиме операции завершаются ошибкой (к сожалению, зависящей от системы), если их невозможно выполнить немедленно. В режиме тайм-аута операции завершаются ошибкой, если их невозможно выполнить за время тайм-аута, заданное для сокета, или если система возвращает ошибку. Метод [`setblocking()`](https://python-all.ru/2.7/library/socket.html#socket.socket.setblocking) – это просто краткая форма для определённых вызовов [`settimeout()`](https://python-all.ru/2.7/library/socket.html#socket.socket.settimeout).442443Режим тайм-аута внутренне переводит сокет в неблокирующий режим. Режимы блокировки и тайм-аута являются общими для файловых дескрипторов и объектов сокетов, относящихся к одной сетевой конечной точке. Следствием этого является то, что файловые объекты, возвращаемые методом [`makefile()`](https://python-all.ru/2.7/library/socket.html#socket.socket.makefile), должны использоваться только когда сокет находится в блокирующем режиме; в режиме тайм-аута или неблокирующем режиме файловые операции, которые не могут быть выполнены немедленно, завершатся ошибкой.444445Обратите внимание, что операция [`connect()`](https://python-all.ru/2.7/library/socket.html#socket.socket.connect) подчиняется настройке тайм-аута, и в целом рекомендуется вызывать [`settimeout()`](https://python-all.ru/2.7/library/socket.html#socket.socket.settimeout) перед вызовом [`connect()`](https://python-all.ru/2.7/library/socket.html#socket.socket.connect) или передавать параметр тайм-аута в [`create_connection()`](https://python-all.ru/2.7/library/socket.html#socket.create_connection). Системный сетевой стек может вернуть собственную ошибку тайм-аута соединения независимо от любых настроек тайм-аута сокета Python.446447#### `socket.setsockopt(level, optname, value)`448449Устанавливает значение указанной опции сокета (см. страницу руководства Unix *setsockopt(2)*). Необходимые символические константы определены в модуле [`socket`](https://python-all.ru/2.7/library/socket.html#module-socket) (`SO_*` и т.д.). Значение может быть целым числом или строкой, представляющей буфер. В последнем случае вызывающий должен убедиться, что строка содержит правильные биты (см. опциональный встроенный модуль [`struct`](https://python-all.ru/2.7/library/struct.html#module-struct) для способа кодирования C-структур в строки).450451#### `socket.shutdown(how)`452453Завершает одну или обе половины соединения. Если *how* равно `SHUT_RD`, дальнейший приём запрещён. Если *how* равно `SHUT_WR`, дальнейшая отправка запрещена. Если *how* равно `SHUT_RDWR`, дальнейшие отправка и приём запрещены. В зависимости от платформы, завершение одной половины соединения может также закрыть противоположную половину (например, на Mac OS X `shutdown(SHUT_WR)` не позволяет дальнейшее чтение на другом конце соединения).454455Обратите внимание, что методы `read()` и `write()` отсутствуют; вместо них используйте [`recv()`](https://python-all.ru/2.7/library/socket.html#socket.socket.recv) и [`send()`](https://python-all.ru/2.7/library/socket.html#socket.socket.send) без аргумента *flags*.456457Объекты сокетов также имеют следующие (только для чтения) атрибуты, соответствующие значениям, переданным конструктору [`socket`](https://python-all.ru/2.7/library/socket.html#socket.socket).458459#### `socket.family`460461Семейство сокета.462463Новое в версии 2.5.464465#### `socket.type`466467Тип сокета.468469Новое в версии 2.5.470471#### `socket.proto`472473Протокол сокета.474475Новое в версии 2.5.476477## 17.2.2. Пример478479Вот четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который отправляет обратно все полученные данные (обслуживая только одного клиента), и использующий его клиент. Обратите внимание, что сервер должен выполнить последовательность [`socket()`](https://python-all.ru/2.7/library/socket.html#socket.socket), [`bind()`](https://python-all.ru/2.7/library/socket.html#socket.socket.bind), [`listen()`](https://python-all.ru/2.7/library/socket.html#socket.socket.listen), [`accept()`](https://python-all.ru/2.7/library/socket.html#socket.socket.accept) (возможно, повторяя [`accept()`](https://python-all.ru/2.7/library/socket.html#socket.socket.accept) для обслуживания более одного клиента), в то время как клиенту нужна только последовательность [`socket()`](https://python-all.ru/2.7/library/socket.html#socket.socket), [`connect()`](https://python-all.ru/2.7/library/socket.html#socket.socket.connect). Также обратите внимание, что сервер не вызывает [`sendall()`](https://python-all.ru/2.7/library/socket.html#socket.socket.sendall)/[`recv()`](https://python-all.ru/2.7/library/socket.html#socket.socket.recv) на сокете, который слушает, а на новом сокете, возвращённом [`accept()`](https://python-all.ru/2.7/library/socket.html#socket.socket.accept).480481Первые два примера поддерживают только IPv4.482483```python484# Программа эхо-сервера485import socket486487HOST = ''                 # Символическое имя, обозначающее все доступные интерфейсы488PORT = 50007              # Произвольный непривилегированный порт489s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)490s.bind((HOST, PORT))491s.listen(1)492conn, addr = s.accept()493print 'Connected by', addr494while 1:495    data = conn.recv(1024)496    if not data: break497    conn.sendall(data)498conn.close()499```500501```python502# Программа эхо-клиента503import socket504505HOST = 'daring.cwi.nl'    # Удалённый хост506PORT = 50007              # Тот же порт, что и у сервера507s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)508s.connect((HOST, PORT))509s.sendall('Hello, world')510data = s.recv(1024)511s.close()512print 'Received', repr(data)513```514515Следующие два примера идентичны двум предыдущим, но поддерживают как IPv4, так и IPv6. Серверная сторона будет прослушивать первое доступное семейство адресов (ей следовало бы прослушивать оба). На большинстве систем, готовых к IPv6, IPv6 будет иметь приоритет, и сервер может не принимать IPv4-трафик. Клиентская сторона попытается подключиться ко всем адресам, полученным в результате разрешения имен, и отправляет трафик на первый успешно подключенный.516517```python518# Программа эхо-сервера519import socket520import sys521522HOST = None               # Символическое имя, обозначающее все доступные интерфейсы523PORT = 50007              # Произвольный непривилегированный порт524s = None525for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,526                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):527    af, socktype, proto, canonname, sa = res528    try:529        s = socket.socket(af, socktype, proto)530    except socket.error as msg:531        s = None532        continue533    try:534        s.bind(sa)535        s.listen(1)536    except socket.error as msg:537        s.close()538        s = None539        continue540    break541if s is None:542    print 'could not open socket'543    sys.exit(1)544conn, addr = s.accept()545print 'Connected by', addr546while 1:547    data = conn.recv(1024)548    if not data: break549    conn.send(data)550conn.close()551```552553```python554# Программа эхо-клиента555import socket556import sys557558HOST = 'daring.cwi.nl'    # Удалённый хост559PORT = 50007              # Тот же порт, что и у сервера560s = None561for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):562    af, socktype, proto, canonname, sa = res563    try:564        s = socket.socket(af, socktype, proto)565    except socket.error as msg:566        s = None567        continue568    try:569        s.connect(sa)570    except socket.error as msg:571        s.close()572        s = None573        continue574    break575if s is None:576    print 'could not open socket'577    sys.exit(1)578s.sendall('Hello, world')579data = s.recv(1024)580s.close()581print 'Received', repr(data)582```583584Последний пример показывает, как написать очень простой сетевой сниффер с помощью сырых сокетов в Windows. Для выполнения примера требуются права администратора для изменения интерфейса:585586```python587import socket588589# общедоступный сетевой интерфейс590HOST = socket.gethostbyname(socket.gethostname())591592# создать сырой сокет и привязать его к общедоступному интерфейсу593s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)594s.bind((HOST, 0))595596# Включать IP-заголовки597s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)598599# принять все пакеты600s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)601602# принять пакет603print s.recvfrom(65565)604605# неразборчивый режим отключён606s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)607```608609Запуск примера несколько раз со слишком маленькой задержкой между выполнениями может привести к этой ошибке:610611```python612socket.error: [Errno 98] Address already in use613```614615Это связано с тем, что предыдущее выполнение оставило сокет в состоянии `TIME_WAIT`, и его нельзя сразу использовать повторно.616617Существует флаг [`socket`](https://python-all.ru/2.7/library/socket.html#module-socket), который можно установить, чтобы предотвратить это, `socket.SO_REUSEADDR`:618619```python620s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)621s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)622s.bind((HOST, PORT))623```624625Флаг `SO_REUSEADDR` указывает ядру переиспользовать локальный сокет в состоянии `TIME_WAIT`, не дожидаясь истечения его естественного тайм-аута.626