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

socket.md

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

1> **Источник:** https://python-all.ru/3.0/library/socket.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `socket` – низкоуровневый сетевой интерфейс89Этот модуль предоставляет доступ к интерфейсу BSD *socket*. Он доступен во всех современных Unix-системах, Windows, MacOS, 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/3.0/library/socket.html) под названием «Basic Socket Interface Extensions for IPv6».1617Интерфейс Python представляет собой прямую трансляцию системных вызовов и библиотечного интерфейса сокетов Unix в объектно-ориентированном стиле Python: функция [`socket()`](https://python-all.ru/3.0/library/socket.html#socket.socket) возвращает *объект сокета*, методы которого реализуют различные системные вызовы сокетов. Типы параметров находятся на более высоком уровне, чем в интерфейсе C: как и при операциях `read()` и `write()` с файлами Python, выделение буфера при приёме происходит автоматически, а длина буфера при отправке подразумевается неявно.1819Адреса сокетов представляются следующим образом: для семейства адресов [`AF_UNIX`](https://python-all.ru/3.0/library/socket.html#socket.AF_UNIX) используется одна строка. Для семейства адресов [`AF_INET`](https://python-all.ru/3.0/library/socket.html#socket.AF_INET) используется пара `(host, port)`, где *host* – строка, представляющая либо имя хоста в нотации интернет-доменов, например `'daring.cwi.nl'`, либо IPv4-адрес, например `'100.50.200.5'`, а *port* – целочисленный номер порта. Для семейства адресов [`AF_INET6`](https://python-all.ru/3.0/library/socket.html#socket.AF_INET6) используется четверка `(host, port, flowinfo, scopeid)`, где *flowinfo* и *scopeid* представляют члены `sin6_flowinfo` и `sin6_scope_id` в структуре `struct sockaddr_in6` в C. Для методов модуля `socket` *flowinfo* и *scopeid* могут быть опущены только для обратной совместимости. Однако обратите внимание, что опускание *scopeid* может вызвать проблемы при работе с scoped IPv6-адресами. Другие семейства адресов в настоящее время не поддерживаются. Формат адреса, требуемый конкретным объектом сокета, автоматически выбирается на основе семейства адресов, указанного при создании объекта сокета.2021Для IPv4-адресов вместо адреса хоста принимаются две специальные формы: пустая строка представляет `INADDR_ANY`, а строка `'<broadcast>'` представляет `INADDR_BROADCAST`. Это поведение недоступно для IPv6 из соображений обратной совместимости, поэтому, если вы планируете поддерживать IPv6 в своих программах на Python, лучше избегать этих форм.2223Если в части *узел* адреса сокета IPv4/v6 указано имя узла, программа может демонстрировать недетерминированное поведение, так как Python использует первый адрес, возвращённый при разрешении DNS. Адрес сокета будет разрешаться по-разному в фактический IPv4/v6-адрес в зависимости от результатов разрешения DNS и/или конфигурации узла. Для детерминированного поведения используйте числовой адрес в части *узел*.2425Сокеты AF\_NETLINK представляются в виде пар `pid, groups`.2627Поддержка TIPC, доступная только в Linux, также реализована с использованием семейства адресов `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.32>33>   Если *addr\_type* равно TIPC\_ADDR\_NAMESEQ, то *v1* – это тип сервера, *v2* – нижний номер порта, а *v3* – верхний номер порта.34>35>   Если *addr\_type* равно TIPC\_ADDR\_ID, то *v1* – это узел, *v2* – ссылка (reference), а *v3* должно быть установлено в 0.3637Все ошибки вызывают исключения. Могут возникать обычные исключения для недопустимых типов аргументов и нехватки памяти; ошибки, связанные с семантикой сокетов или адресов, вызывают исключение [`socket.error`](https://python-all.ru/3.0/library/socket.html#socket.error).3839Неблокирующий режим поддерживается с помощью `setblocking()`. Обобщение этого подхода на основе тайм-аутов реализовано через `settimeout()`.4041Модуль `socket` экспортирует следующие константы и функции:4243#### `[socket.error]exception socket.error`4445Это исключение возникает при ошибках, связанных с сокетами. Сопутствующее значение – либо строка с описанием ошибки, либо пара `(errno, string)`, представляющая ошибку, возвращенную системным вызовом, аналогично значению, сопутствующему [`os.error`](https://python-all.ru/3.0/library/os.html#os.error). См. модуль [`errno`](https://python-all.ru/3.0/library/errno.html#module-errno), который содержит имена для кодов ошибок, определенных базовой операционной системой.4647#### `[socket.herror]exception socket.herror`4849Это исключение возникает при ошибках, связанных с адресами, т.е. для функций, использующих *h\_errno* в C API, включая [`gethostbyname_ex()`](https://python-all.ru/3.0/library/socket.html#socket.gethostbyname_ex) и [`gethostbyaddr()`](https://python-all.ru/3.0/library/socket.html#socket.gethostbyaddr).5051Сопутствующее значение – это пара `(h_errno, string)`, представляющая ошибку, возвращённую библиотечным вызовом. *string* представляет описание *h\_errno*, возвращаемое функцией `hstrerror` из C.5253#### `[socket.gaierror]exception socket.gaierror`5455Это исключение возникает при ошибках, связанных с адресами, для5657[`getaddrinfo()`](https://python-all.ru/3.0/library/socket.html#socket.getaddrinfo)5859и6061[`getnameinfo()`](https://python-all.ru/3.0/library/socket.html#socket.getnameinfo)6263. Сопутствующее значение – это пара6465`(error, string)`6667, представляющая ошибку, возвращённую библиотечным вызовом.6869*string*7071представляет описание7273*error*7475, возвращаемое функцией7677`gai_strerror`7879из C. Значение8081*error*8283будет соответствовать одной из констант8485`EAI_*`8687, определённых в этом модуле.8889#### `[socket.timeout]exception socket.timeout`9091Это исключение возникает, когда происходит тайм-аут на сокете, для которого тайм-ауты были включены предыдущим вызовом9293`settimeout()`9495. Сопутствующее значение – это строка, которая в настоящее время всегда равна «timed out».9697#### `[socket.AF_UNIX]socket.AF_UNIX`9899#### `socket.AF_INET`100101#### `socket.AF_INET6`102103Эти константы представляют семейства адресов (и протоколов), используемые для первого аргумента104105[`socket()`](https://python-all.ru/3.0/library/socket.html#socket.socket)106107. Если константа108109[`AF_UNIX`](https://python-all.ru/3.0/library/socket.html#socket.AF_UNIX)110111не определена, то этот протокол не поддерживается.112113#### `[socket.SOCK_STREAM]socket.SOCK_STREAM`114115#### `socket.SOCK_DGRAM`116117#### `socket.SOCK_RAW`118119#### `socket.SOCK_RDM`120121#### `socket.SOCK_SEQPACKET`122123Эти константы представляют типы сокетов, используемые для второго аргумента124125[`socket()`](https://python-all.ru/3.0/library/socket.html#socket.socket)126127. (Как правило, полезными оказываются только128129[`SOCK_STREAM`](https://python-all.ru/3.0/library/socket.html#socket.SOCK_STREAM)130131и132133[`SOCK_DGRAM`](https://python-all.ru/3.0/library/socket.html#socket.SOCK_DGRAM)134135.)136137#### `SO_*`138139#### `[socket.SOMAXCONN]socket.SOMAXCONN`140141#### `MSG_*`142143#### `SOL_*`144145#### `IPPROTO_*`146147#### `IPPORT_*`148149#### `INADDR_*`150151#### `IP_*`152153#### `IPV6_*`154155#### `EAI_*`156157#### `AI_*`158159#### `NI_*`160161#### `TCP_*`162163Многие константы этих форм, описанные в документации Unix по сокетам и/или протоколу IP, также определены в модуле socket. Они обычно используются в аргументах методов164165`setsockopt()`166167и168169`getsockopt()`170171объектов сокетов. В большинстве случаев определены только те символы, которые есть в заголовочных файлах Unix; для некоторых символов заданы значения по умолчанию.172173#### `SIO_*`174175#### `RCVALL_*`176177Константы для WSAIoctl() в Windows. Используются как аргументы метода178179`ioctl()`180181объектов сокетов.182183#### `TIPC_*`184185Константы, связанные с TIPC, соответствующие тем, что экспортируются C API сокетов. Дополнительную информацию см. в документации TIPC.186187#### `[socket.has_ipv6]socket.has_ipv6`188189Эта константа содержит логическое значение, указывающее, поддерживается ли IPv6 на данной платформе.190191#### `[socket.create_connection]socket.create_connection(address[, timeout])`192193Вспомогательная функция. Подключается к194195*address*196197(кортеж из двух элементов198199`(host, port)`200201) и возвращает объект сокета. Передача необязательного параметра202203*timeout*204205устанавливает тайм-аут для экземпляра сокета перед попыткой подключения. Если206207*timeout*208209не указан, используется глобальная настройка тайм-аута по умолчанию, возвращаемая210211[`getdefaulttimeout()`](https://python-all.ru/3.0/library/socket.html#socket.getdefaulttimeout)212213.214215#### `[socket.getaddrinfo]socket.getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]])`216217Resolves the *host*/*port* argument, into a sequence of 5-tuples that contain all the necessary arguments for creating the corresponding socket. *host* is a domain name, a string representation of an IPv4/v6 address or `None`. *port* is a string service name such as `'http'`, a numeric port number or `None`. The rest of the arguments are optional and must be numeric if specified. By passing `None` as the value of *host* and *port*, , you can pass `NULL` to the C API.218219Функция [`getaddrinfo()`](https://python-all.ru/3.0/library/socket.html#socket.getaddrinfo) возвращает список кортежей из 5 элементов со следующей структурой:220221`(семейство, тип сокета, протокол, каноническое имя, адрес сокета)`222223*family*, *socktype*, *proto* – целые числа и предназначены для передачи в функцию [`socket()`](https://python-all.ru/3.0/library/socket.html#socket.socket). *canonname* – строка, представляющая каноническое имя *хоста*. Она может быть числовым IPv4/v6 адресом, если для числового *хоста* указан `AI_CANONNAME`. *sockaddr* – кортеж, описывающий адрес сокета, как описано выше. См. исходный код `socket` и других библиотечных модулей для получения типичного примера использования функции.224225#### `[socket.getfqdn]socket.getfqdn([name])`226227Возвращает полное доменное имя для228229*name*230231. Если232233*name*234235опущен или пуст, он интерпретируется как локальный хост. Чтобы найти полное имя, проверяется имя хоста, возвращённое236237[`gethostbyaddr()`](https://python-all.ru/3.0/library/socket.html#socket.gethostbyaddr)238239, а затем, при наличии, псевдонимы хоста. Выбирается первое имя, содержащее точку. Если полное доменное имя недоступно, возвращается имя хоста, полученное через240241[`gethostname()`](https://python-all.ru/3.0/library/socket.html#socket.gethostname)242243.244245#### `[socket.gethostbyname]socket.gethostbyname(hostname)`246247Преобразует имя хоста в формат IPv4-адреса. IPv4-адрес возвращается в виде строки, например248249`'100.50.200.5'`250251. Если само имя хоста является IPv4-адресом, оно возвращается без изменений. См.252253[`gethostbyname_ex()`](https://python-all.ru/3.0/library/socket.html#socket.gethostbyname_ex)254255для более полного интерфейса.256257[`gethostbyname()`](https://python-all.ru/3.0/library/socket.html#socket.gethostbyname)258259не поддерживает разрешение имён IPv6, поэтому для поддержки dual stack IPv4/v6 следует использовать260261[`getaddrinfo()`](https://python-all.ru/3.0/library/socket.html#socket.getaddrinfo)262263.264265#### `[socket.gethostbyname_ex]socket.gethostbyname_ex(hostname)`266267Преобразует имя хоста в формат IPv4-адреса, расширенный интерфейс. Возвращает тройку268269`(hostname, aliaslist, ipaddrlist)`270271, где272273*hostname*274275– основное имя хоста, отвечающего на заданный276277*ip\_address*278279,280281*aliaslist*282283– (возможно, пустой) список альтернативных имён хоста для того же адреса, а284285*ipaddrlist*286287– список IPv4-адресов того же интерфейса на том же хосте (часто, но не всегда, один адрес).288289[`gethostbyname_ex()`](https://python-all.ru/3.0/library/socket.html#socket.gethostbyname_ex)290291не поддерживает разрешение имён IPv6, поэтому для поддержки dual stack IPv4/v6 следует использовать292293[`getaddrinfo()`](https://python-all.ru/3.0/library/socket.html#socket.getaddrinfo)294295.296297#### `[socket.gethostname]socket.gethostname()`298299Возвращает строку, содержащую имя хоста машины, на которой в данный момент выполняется интерпретатор Python.300301Если нужно узнать IP-адрес текущей машины, можно использовать `gethostbyname(gethostname())`. Эта операция предполагает, что существует корректное отображение адреса на хост, и это предположение выполняется не всегда.302303Примечание: [`gethostname()`](https://python-all.ru/3.0/library/socket.html#socket.gethostname) не всегда возвращает полное доменное имя; используйте `getfqdn()` (см. выше).304305#### `[socket.gethostbyaddr]socket.gethostbyaddr(ip_address)`306307Возвращает тройку308309`(hostname, aliaslist, ipaddrlist)`310311, где312313*hostname*314315– основное имя хоста, отвечающего на заданный316317*ip\_address*318319,320321*aliaslist*322323– (возможно, пустой) список альтернативных имён хоста для того же адреса, а324325*ipaddrlist*326327– список IPv4/v6-адресов того же интерфейса на том же хосте (скорее всего, содержащий только один адрес). Чтобы найти полное доменное имя, используйте функцию328329[`getfqdn()`](https://python-all.ru/3.0/library/socket.html#socket.getfqdn)330331.332333[`gethostbyaddr()`](https://python-all.ru/3.0/library/socket.html#socket.gethostbyaddr)334335поддерживает как IPv4, так и IPv6.336337#### `[socket.getnameinfo]socket.getnameinfo(sockaddr, flags)`338339Преобразует адрес сокета340341*sockaddr*342343в кортеж из двух элементов344345`(host, port)`346347. В зависимости от настроек348349*flags*350351результат может содержать полное доменное имя или числовое представление адреса в352353*host*354355. Аналогично,356357*port*358359может содержать строковое имя порта или числовой номер порта.360361#### `[socket.getprotobyname]socket.getprotobyname(protocolname)`362363Преобразует имя интернет-протокола (например,364365`'icmp'`366367) в константу, пригодную для передачи в качестве (необязательного) третьего аргумента функции368369[`socket()`](https://python-all.ru/3.0/library/socket.html#socket.socket)370371. Обычно это требуется только для сокетов, открытых в «сыром» режиме (372373[`SOCK_RAW`](https://python-all.ru/3.0/library/socket.html#socket.SOCK_RAW)374375); для обычных режимов сокета правильный протокол выбирается автоматически, если протокол опущен или равен нулю.376377#### `[socket.getservbyname]socket.getservbyname(servicename[, protocolname])`378379Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если указано, должно быть380381`'tcp'`382383или384385`'udp'`386387, в противном случае подойдёт любой протокол.388389#### `[socket.getservbyport]socket.getservbyport(port[, protocolname])`390391Преобразует номер порта и имя протокола в имя службы для этой службы. Необязательное имя протокола, если указано, должно быть392393`'tcp'`394395или396397`'udp'`398399, иначе подойдет любой протокол.400401#### `[socket.socket]socket.socket([family[, type[, proto]]])`402403Создаёт новый сокет с заданным семейством адресов, типом сокета и номером протокола. Семейство адресов должно быть404405[`AF_INET`](https://python-all.ru/3.0/library/socket.html#socket.AF_INET)406407(по умолчанию),408409[`AF_INET6`](https://python-all.ru/3.0/library/socket.html#socket.AF_INET6)410411или412413[`AF_UNIX`](https://python-all.ru/3.0/library/socket.html#socket.AF_UNIX)414415. Тип сокета должен быть416417[`SOCK_STREAM`](https://python-all.ru/3.0/library/socket.html#socket.SOCK_STREAM)418419(по умолчанию),420421[`SOCK_DGRAM`](https://python-all.ru/3.0/library/socket.html#socket.SOCK_DGRAM)422423или, возможно, одна из констант424425`SOCK_`426427. Номер протокола обычно равен нулю и в этом случае может быть опущен.428429#### `[socket.socketpair]socket.socketpair([family[, type[, proto]]])`430431Создаёт пару соединённых объектов сокетов, используя указанное семейство адресов, тип сокета и номер протокола. Семейство адресов, тип сокета и номер протокола такие же, как для функции432433[`socket()`](https://python-all.ru/3.0/library/socket.html#socket.socket)434435выше. Семейство по умолчанию –436437[`AF_UNIX`](https://python-all.ru/3.0/library/socket.html#socket.AF_UNIX)438439, если оно определено на платформе; в противном случае по умолчанию используется440441[`AF_INET`](https://python-all.ru/3.0/library/socket.html#socket.AF_INET)442443. Доступность: Unix.444445#### `[socket.fromfd]socket.fromfd(fd, family, type[, proto])`446447Дублирует файловый дескриптор448449*fd*450451(целое число, возвращаемое методом452453`fileno()`454455файлового объекта) и создаёт из результата объект сокета. Семейство адресов, тип сокета и номер протокола – как у функции456457[`socket()`](https://python-all.ru/3.0/library/socket.html#socket.socket)458459выше. Файловый дескриптор должен указывать на сокет, но это не проверяется – последующие операции с объектом могут завершиться ошибкой, если дескриптор некорректен. Эта функция редко нужна, но может использоваться для получения или установки параметров сокета, переданного программе в качестве стандартного ввода или вывода (например, сервер, запущенный демоном inet в Unix). Предполагается, что сокет работает в блокирующем режиме. Доступность: Unix.460461#### `[socket.ntohl]socket.ntohl(x)`462463Преобразует 32-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта операция ничего не делает; в противном случае выполняется перестановка 4 байтов.464465#### `[socket.ntohs]socket.ntohs(x)`466467Преобразует 16-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.468469#### `[socket.htonl]socket.htonl(x)`470471Преобразует 32-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен четырёх байтов.472473#### `[socket.htons]socket.htons(x)`474475Преобразует 16-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.476477#### `[socket.inet_aton]socket.inet_aton(ip_string)`478479Преобразует IPv4-адрес из строкового формата с точками (например, '123.45.67.89') в 32-битный упакованный двоичный формат в виде объекта bytes длиной четыре символа. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `struct in_addr`, который является типом C для 32-битного упакованного двоичного представления, возвращаемого этой функцией.480481Если переданная этой функции строка IPv4-адреса недопустима, будет возбуждено [`socket.error`](https://python-all.ru/3.0/library/socket.html#socket.error). Обратите внимание, что точное определение допустимости зависит от нижележащей реализации C функции `inet_aton`.482483[`inet_aton()`](https://python-all.ru/3.0/library/socket.html#socket.inet_aton) не поддерживает IPv6, и для поддержки двойного стека IPv4/v6 вместо него следует использовать [`getnameinfo()`](https://python-all.ru/3.0/library/socket.html#socket.getnameinfo).484485#### `[socket.inet_ntoa]socket.inet_ntoa(packed_ip)`486487Преобразует 32-битный упакованный IPv4-адрес (объект bytes длиной четыре символа) в его стандартное строковое представление с точками (например, '123.45.67.89'). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа `struct in_addr`, который является типом C для 32-битных упакованных двоичных данных, принимаемых этой функцией в качестве аргумента.488489Если длина переданной этой функции последовательности байтов не равна ровно 4 байтам, будет возбуждено [`socket.error`](https://python-all.ru/3.0/library/socket.html#socket.error). [`inet_ntoa()`](https://python-all.ru/3.0/library/socket.html#socket.inet_ntoa) не поддерживает IPv6, и для поддержки двойного стека IPv4/v6 вместо него следует использовать [`getnameinfo()`](https://python-all.ru/3.0/library/socket.html#socket.getnameinfo).490491#### `[socket.inet_pton]socket.inet_pton(address_family, ip_string)`492493Преобразует IP-адрес из строкового формата, зависящего от семейства, в упакованный двоичный формат. [`inet_pton()`](https://python-all.ru/3.0/library/socket.html#socket.inet_pton) полезен, когда библиотека или сетевой протокол требует объект типа `struct in_addr` (аналогично [`inet_aton()`](https://python-all.ru/3.0/library/socket.html#socket.inet_aton)) или `struct in6_addr`.494495В настоящее время поддерживаемыми значениями для *address\_family* являются [`AF_INET`](https://python-all.ru/3.0/library/socket.html#socket.AF_INET) и [`AF_INET6`](https://python-all.ru/3.0/library/socket.html#socket.AF_INET6). Если строка IP-адреса *ip\_string* недопустима, будет возбуждено [`socket.error`](https://python-all.ru/3.0/library/socket.html#socket.error). Обратите внимание, что точное определение допустимости зависит как от значения *address\_family*, так и от нижележащей реализации функции `inet_pton`.496497Доступность: Unix (возможно, не на всех платформах).498499#### `[socket.inet_ntop]socket.inet_ntop(address_family, packed_ip)`500501Convert 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.0/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.0/library/socket.html#socket.inet_ntoa)) or `struct in6_addr`.502503В настоящее время *address\_family* поддерживает значения [`AF_INET`](https://python-all.ru/3.0/library/socket.html#socket.AF_INET) и [`AF_INET6`](https://python-all.ru/3.0/library/socket.html#socket.AF_INET6). Если длина строки *packed\_ip* не соответствует указанному семейству адресов, возбуждается [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError). [`socket.error`](https://python-all.ru/3.0/library/socket.html#socket.error) возбуждается при ошибках вызова [`inet_ntop()`](https://python-all.ru/3.0/library/socket.html#socket.inet_ntop).504505Доступность: Unix (возможно, не на всех платформах).506507#### `[socket.getdefaulttimeout]socket.getdefaulttimeout()`508509Возвращает таймаут по умолчанию в секундах с плавающей запятой для новых объектов сокета. Значение510511`None`512513означает, что у новых объектов сокета нет таймаута. При первом импорте модуля socket значение по умолчанию –514515`None`516517.518519#### `[socket.setdefaulttimeout]socket.setdefaulttimeout(timeout)`520521Устанавливает тайм-аут по умолчанию для новых сокетных объектов в секундах с плавающей запятой. Значение522523`None`524525означает, что новые сокетные объекты не имеют тайм-аута. При первом импорте модуля socket значением по умолчанию является526527`None`528529.530531#### `[socket.SocketType]socket.SocketType`532533Это объект типа Python, представляющий тип объекта сокета. Он эквивалентен534535`type(socket(...))`536537.538539> **См. также**540>541> **Модуль [`socketserver`](https://python-all.ru/3.0/library/socketserver.html#module-socketserver)**542>543> Классы, упрощающие написание сетевых серверов.544545## Объекты сокетов546547Объекты сокетов имеют следующие методы. За исключением `makefile()`, они соответствуют системным вызовам Unix, применимым к сокетам.548549#### `[socket.socket.accept]socket.accept()`550551Принимает соединение. Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение – пара552553`(conn, address)`554555, где556557*conn*558559– это560561*новый*562563объект сокета, который можно использовать для отправки и получения данных по соединению, а564565*address*566567– это адрес, привязанный к сокету на другом конце соединения.568569#### `[socket.socket.bind]socket.bind(address)`570571Привязывает сокет к572573*address*574575. Сокет не должен быть уже привязан. (Формат576577*address*578579зависит от семейства адресов – см. выше.)580581#### `[socket.socket.close]socket.close()`582583Закрывает сокет. Все последующие операции с объектом сокета будут завершаться ошибкой. Удаленная сторона не получит больше данных (после сброса находящихся в очереди данных). Сокеты автоматически закрываются при сборке мусора.584585#### `[socket.socket.connect]socket.connect(address)`586587Подключается к удалённому сокету по адресу588589*address*590591. (Формат592593*address*594595зависит от семейства адресов – см. выше.)596597#### `[socket.socket.connect_ex]socket.connect_ex(address)`598599Похож на600601`connect(address)`602603, но возвращает индикатор ошибки вместо возбуждения исключения для ошибок, возвращаемых вызовом C-уровня604605`connect`606607(другие проблемы, например, «хост не найден», по-прежнему могут возбуждать исключения). Индикатор ошибки равен608609`0`610611, если операция выполнена успешно, в противном случае – значению переменной612613`errno`614615. Это полезно, например, для поддержки асинхронных соединений.616617#### `[socket.socket.fileno]socket.fileno()`618619Возвращает файловый дескриптор сокета (небольшое целое число). Это полезно с [`select.select()`](https://python-all.ru/3.0/library/select.html#select.select).620621В Windows небольшое целое число, возвращаемое этим методом, нельзя использовать там, где может использоваться файловый дескриптор (например, в [`os.fdopen()`](https://python-all.ru/3.0/library/os.html#os.fdopen)). В Unix такого ограничения нет.622623#### `[socket.socket.getpeername]socket.getpeername()`624625Возвращает удалённый адрес, к которому подключён сокет. Это полезно, например, для определения номера порта удалённого сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов – см. выше.) На некоторых системах эта функция не поддерживается.626627#### `[socket.socket.getsockname]socket.getsockname()`628629Возвращает собственный адрес сокета. Это полезно, например, для определения номера порта сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов – см. выше.)630631#### `[socket.socket.getsockopt]socket.getsockopt(level, optname[, buflen])`632633Возвращает значение указанной опции сокета (см. страницу man Unix634635*getsockopt(2)*636637). Необходимые символьные константы (638639`SO_*`640641и т.д.) определены в этом модуле. Если642643*buflen*644645отсутствует, предполагается целочисленная опция, и функция возвращает её целочисленное значение. Если646647*buflen*648649присутствует, он задает максимальную длину буфера для получения опции, и этот буфер возвращается в виде объекта bytes. Вызывающий код должен сам декодировать содержимое буфера (см. опциональный встроенный модуль650651[`struct`](https://python-all.ru/3.0/library/struct.html#module-struct)652653для способа декодирования структур C, закодированных как байтовые строки).654655#### `[socket.socket.ioctl]socket.ioctl(control, option)`656657| Платформа: | Windows |658| --- | --- |659660Метод [`ioctl()`](https://python-all.ru/3.0/library/socket.html#socket.socket.ioctl) представляет собой ограниченный интерфейс к системному интерфейсу WSAIoctl. За дополнительной информацией обратитесь к документации MSDN.661662#### `[socket.socket.listen]socket.listen(backlog)`663664Ожидает подключения к сокету. Аргумент665666*backlog*667668задаёт максимальное количество ожидающих соединений в очереди и должен быть не менее 1; максимальное значение зависит от системы (обычно 5).669670#### `[socket.socket.makefile]socket.makefile([mode[, bufsize]])`671672Возвращает *файловый объект*, связанный с сокетом. (Файловые объекты описаны в разделе [*Файловые объекты*](https://python-all.ru/3.0/library/stdtypes.html#bltin-file-objects).) Файловый объект ссылается на `dup`лированную версию файлового дескриптора сокета, поэтому файловый объект и объект сокета могут быть закрыты или собраны сборщиком мусора независимо. Сокет должен находиться в блокирующем режиме (он не может иметь тайм-аут). Необязательные аргументы *mode* и *bufsize* интерпретируются так же, как и встроенной функцией `file()`.673674#### `[socket.socket.recv]socket.recv(bufsize[, flags])`675676Получает данные из сокета. Возвращает объект bytes с полученными данными. Максимальный объём данных за одно получение задаётся параметром *bufsize*. Значение необязательного аргумента *flags* описано на странице руководства Unix *recv(2)*; по умолчанию он равен нулю.677678> **Примечание**679>680> Для наилучшего соответствия реальным характеристикам оборудования и сети значение *bufsize* должно быть относительно небольшой степенью двойки, например, 4096.681682#### `[socket.socket.recvfrom]socket.recvfrom(bufsize[, flags])`683684Receive data from the socket. The return value is a pair685686`(bytes, address)`687688where689690*bytes*691692is a bytes object representing the data received and693694*address*695696is the address of the socket sending the data. See the Unix manual page697698*recv(2)*699700for the meaning of the optional argument701702*flags*703704; it defaults to zero. (The format of705706*address*707708depends on the address family – see above.)709710#### `[socket.socket.recvfrom_into]socket.recvfrom_into(buffer[, nbytes[, flags]])`711712Receive data from the socket, writing it into713714*buffer*715716instead of creating a new bytestring. The return value is a pair717718`(nbytes, address)`719720where721722*nbytes*723724is the number of bytes received and725726*address*727728is the address of the socket sending the data. See the Unix manual page729730*recv(2)*731732for the meaning of the optional argument733734*flags*735736; it defaults to zero. (The format of737738*address*739740depends on the address family – see above.)741742#### `[socket.socket.recv_into]socket.recv_into(buffer[, nbytes[, flags]])`743744Принимает до745746*nbytes*747748байт из сокета, сохраняя данные в буфер, а не создавая новую байтовую строку. Если749750*nbytes*751752не указан (или равен 0), принимает столько байт, сколько помещается в переданный буфер. Смысл необязательного аргумента753754*flags*755756описан на странице руководства Unix757758*recv(2)*759760; по умолчанию он равен нулю.761762#### `[socket.socket.send]socket.send(bytes[, flags])`763764Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент765766*flags*767768имеет тот же смысл, что и для769770[`recv()`](https://python-all.ru/3.0/library/socket.html#socket.socket.recv)771772выше. Возвращает количество отправленных байт. Приложения должны проверять, что все данные были отправлены; если передана только часть данных, приложению необходимо повторить попытку отправки оставшихся данных.773774#### `[socket.socket.sendall]socket.sendall(bytes[, flags])`775776Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент777778*flags*779780имеет то же значение, что и для781782[`recv()`](https://python-all.ru/3.0/library/socket.html#socket.socket.recv)783784выше. В отличие от785786[`send()`](https://python-all.ru/3.0/library/socket.html#socket.socket.send)787788, этот метод продолжает отправлять данные из789790*bytes*791792, пока не будут отправлены все данные или не возникнет ошибка. В случае успеха возвращается793794`None`795796. При ошибке вызывается исключение, и невозможно определить, сколько данных (если вообще было) было успешно отправлено.797798#### `[socket.socket.sendto]socket.sendto(bytes[, flags], address)`799800Отправляет данные в сокет. Сокет не должен быть подключён к удалённому сокету, так как целевой сокет задаётся аргументом801802*address*803804. Необязательный аргумент805806*flags*807808имеет то же значение, что и для809810[`recv()`](https://python-all.ru/3.0/library/socket.html#socket.socket.recv)811812выше. Возвращает количество отправленных байт. (Формат813814*address*815816зависит от семейства адресов – см. выше.)817818#### `[socket.socket.setblocking]socket.setblocking(flag)`819820Устанавливает блокирующий или неблокирующий режим сокета: если821822*flag*823824равен 0, сокет переводится в неблокирующий режим, иначе – в блокирующий. Изначально все сокеты работают в блокирующем режиме. В неблокирующем режиме, если вызов825826[`recv()`](https://python-all.ru/3.0/library/socket.html#socket.socket.recv)827828не находит данных или вызов829830[`send()`](https://python-all.ru/3.0/library/socket.html#socket.socket.send)831832не может немедленно отправить данные, возбуждается исключение833834[`error`](https://python-all.ru/3.0/library/socket.html#socket.error)835836; в блокирующем режиме вызовы блокируются до завершения.837838`s.setblocking(0)`839840эквивалентно841842`s.settimeout(0)`843844;845846`s.setblocking(1)`847848эквивалентно849850`s.settimeout(None)`851852.853854#### `[socket.socket.settimeout]socket.settimeout(value)`855856Устанавливает тайм-аут для блокирующих операций с сокетом. Аргумент857858*value*859860может быть неотрицательным числом с плавающей запятой, выражающим секунды, или861862`None`863864. Если передано число с плавающей запятой, последующие операции с сокетом будут возбуждать исключение865866[`timeout`](https://python-all.ru/3.0/library/socket.html#socket.timeout)867868, если период тайм-аута869870*value*871872истёк до завершения операции. Установка тайм-аута873874`None`875876отключает тайм-ауты для операций с сокетом.877878`s.settimeout(0.0)`879880эквивалентно881882`s.setblocking(0)`883884;885886`s.settimeout(None)`887888эквивалентно889890`s.setblocking(1)`891892.893894#### `[socket.socket.gettimeout]socket.gettimeout()`895896Возвращает тайм-аут в секундах с плавающей запятой, связанный с операциями сокета, или897898`None`899900, если тайм-аут не установлен. Это отражает последний вызов901902[`setblocking()`](https://python-all.ru/3.0/library/socket.html#socket.socket.setblocking)903904или905906[`settimeout()`](https://python-all.ru/3.0/library/socket.html#socket.socket.settimeout)907908.909910Несколько замечаний о блокировке и тайм-аутах сокетов: объект сокета может находиться в одном из трёх режимов: блокирующий, неблокирующий или тайм-аут. Сокеты всегда создаются в блокирующем режиме. В блокирующем режиме операции блокируются до завершения. В неблокирующем режиме операции завершаются ошибкой (с системно-зависимой ошибкой), если их невозможно выполнить немедленно. В режиме тайм-аута операции завершаются ошибкой, если их невозможно выполнить в течение заданного для сокета тайм-аута. Метод `setblocking()` является просто сокращённой записью для некоторых вызовов `settimeout()`.911912Режим тайм-аута внутренне переводит сокет в неблокирующий режим. Режимы блокировки и тайм-аута являются общими для файловых дескрипторов и объектов сокетов, указывающих на одну и ту же сетевую конечную точку. Следствием этого является то, что файловые объекты, возвращаемые методом `makefile()`, должны использоваться только при блокирующем режиме сокета; в режиме тайм-аута или неблокирующем режиме файловые операции, которые не могут быть выполнены немедленно, завершатся ошибкой.913914Обратите внимание, что на операцию `connect()` распространяется настройка тайм-аута, и в целом рекомендуется вызывать `settimeout()` перед вызовом `connect()`.915916#### `[socket.socket.setsockopt]socket.setsockopt(level, optname, value)`917918Устанавливает значение указанного параметра сокета (см. страницу руководства Unix *setsockopt(2)*). Необходимые символические константы определены в модуле `socket` (`SO_*` и т.д.). Значением может быть целое число или объект bytes, представляющий буфер. В последнем случае вызывающая сторона должна обеспечить, чтобы байтовая строка содержала правильные биты (см. дополнительный встроенный модуль [`struct`](https://python-all.ru/3.0/library/struct.html#module-struct) для способа кодирования структур C в виде байтовых строк).919920#### `[socket.socket.shutdown]socket.shutdown(how)`921922Завершает одну или обе половины соединения. Если923924*how*925926равно927928`SHUT_RD`929930, дальнейший приём запрещён. Если931932*how*933934равно935936`SHUT_WR`937938, дальнейшая отправка запрещена. Если939940*how*941942равно943944`SHUT_RDWR`945946, дальнейшие отправка и приём запрещены.947948Обратите внимание, что методы `read()` или `write()` отсутствуют; вместо них используйте `recv()` и `send()` без аргумента *flags*.949950Объекты сокетов также имеют следующие (только для чтения) атрибуты, которые соответствуют значениям, переданным конструктору [`socket`](https://python-all.ru/3.0/library/socket.html#socket.socket).951952#### `[socket.socket.family]socket.family`953954Семейство сокета.955956#### `[socket.socket.type]socket.type`957958Тип сокета.959960#### `[socket.socket.proto]socket.proto`961962Протокол сокета.963964## Пример965966Вот четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который отправляет обратно все полученные данные (обслуживая только одного клиента), и клиент, использующий его. Обратите внимание, что сервер должен выполнить последовательность [`socket()`](https://python-all.ru/3.0/library/socket.html#socket.socket), `bind()`, `listen()`, `accept()` (возможно, повторяя `accept()` для обслуживания нескольких клиентов), в то время как клиенту нужна только последовательность [`socket()`](https://python-all.ru/3.0/library/socket.html#socket.socket), `connect()`. Также обратите внимание, что сервер выполняет `send()`/`recv()` не на том сокете, на котором он слушает, а на новом сокете, возвращённом `accept()`.967968Первые два примера поддерживают только IPv4.969970```python971# Программа эхо-сервера972import socket973974HOST = ''                 # Символическое имя, обозначающее все доступные интерфейсы975PORT = 50007              # Произвольный непривилегированный порт976s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)977s.bind((HOST, PORT))978s.listen(1)979conn, addr = s.accept()980print('Connected by', addr)981while True:982    data = conn.recv(1024)983    if not data: break984    conn.send(data)985conn.close()986```987988```python989# Программа эхо-клиента990import socket991992HOST = 'daring.cwi.nl'    # Удалённый хост993PORT = 50007              # Тот же порт, что и у сервера994s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)995s.connect((HOST, PORT))996s.send(b'Hello, world')997data = s.recv(1024)998s.close()999print('Received', repr(data))1000```10011002Следующие два примера идентичны двум предыдущим, но поддерживают как IPv4, так и IPv6. Серверная сторона будет прослушивать первое доступное семейство адресов (ей следовало бы прослушивать оба). На большинстве систем, готовых к IPv6, IPv6 будет иметь приоритет, и сервер может не принимать IPv4-трафик. Клиентская сторона попытается подключиться ко всем адресам, полученным в результате разрешения имен, и отправляет трафик на первый успешно подключенный.10031004```python1005# Программа эхо-сервера1006import socket1007import sys10081009HOST = None               # Символическое имя, обозначающее все доступные интерфейсы1010PORT = 50007              # Произвольный непривилегированный порт1011s = None1012for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,1013                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):1014    af, socktype, proto, canonname, sa = res1015    try:1016        s = socket.socket(af, socktype, proto)1017    except socket.error as msg:1018        s = None1019        continue1020    try:1021        s.bind(sa)1022        s.listen(1)1023    except socket.error as msg:1024        s.close()1025        s = None1026        continue1027    break1028if s is None:1029    print('could not open socket')1030    sys.exit(1)1031conn, addr = s.accept()1032print('Connected by', addr)1033while True:1034    data = conn.recv(1024)1035    if not data: break1036    conn.send(data)1037conn.close()1038```10391040```python1041# Программа эхо-клиента1042import socket1043import sys10441045HOST = 'daring.cwi.nl'    # Удалённый хост1046PORT = 50007              # Тот же порт, что и у сервера1047s = None1048for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):1049    af, socktype, proto, canonname, sa = res1050    try:1051        s = socket.socket(af, socktype, proto)1052    except socket.error as msg:1053        s = None1054        continue1055    try:1056        s.connect(sa)1057    except socket.error as msg:1058        s.close()1059        s = None1060        continue1061    break1062if s is None:1063    print('could not open socket')1064    sys.exit(1)1065s.send(b'Hello, world')1066data = s.recv(1024)1067s.close()1068print('Received', repr(data))1069```10701071Последний пример показывает, как написать очень простой сетевой сниффер с помощью сырых сокетов в Windows. Для выполнения примера требуются права администратора для изменения интерфейса:10721073```python1074import socket10751076# общедоступный сетевой интерфейс1077HOST = socket.gethostbyname(socket.gethostname())10781079# создать сырой сокет и привязать его к общедоступному интерфейсу1080s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)1081s.bind((HOST, 0))10821083# Включать IP-заголовки1084s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)10851086# принять все пакеты1087s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)10881089# принять пакет1090print(s.recvfrom(65565))10911092# неразборчивый режим отключён1093s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)1094```1095