socket — низкоуровневый интерфейс сетевого взаимодействия
Исходный код: Lib/socket.py
Этот модуль предоставляет доступ к интерфейсу BSD socket. Он доступен во всех современных Unix-системах, Windows, MacOS и, вероятно, на некоторых других платформах.
Примечание
Некоторое поведение может зависеть от платформы, поскольку вызовы выполняются через API сокетов операционной системы.
Доступность: недоступен в WASI.
Этот модуль не работает или недоступен в WebAssembly. Подробнее см. в разделе Платформы WebAssembly.
Интерфейс Python представляет собой прямой перенос системного вызова Unix и библиотечного интерфейса для сокетов в объектно-ориентированный стиль Python: функция socket() возвращает объект сокета, методы которого реализуют различные системные вызовы для сокетов. Типы параметров несколько более высокоуровневые, чем в интерфейсе C: как и при операциях read() и write() с файлами Python, выделение буфера при операциях получения выполняется автоматически, а длина буфера при операциях отправки указывается неявно.
См. также
-
Modulesocketserver -
Классы, упрощающие написание сетевых серверов.
-
Modulessl -
Обёртка TLS/SSL для объектов сокетов.
Семейства сокетов
В зависимости от системы и параметров сборки этот модуль поддерживает различные семейства сокетов.
Необходимый для конкретного объекта сокета формат адреса выбирается автоматически на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представлены следующим образом:
-
Адрес сокета
AF_UNIX, привязанного к узлу файловой системы, представлен строкой с использованием кодировки файловой системы и обработчика ошибок'surrogateescape'(см. PEP 383). Адрес в абстрактном пространстве имён Linux возвращается как объект, подобный bytes, начинающийся с нулевого байта; обратите внимание, что сокеты в этом пространстве имён могут взаимодействовать с обычными сокетами файловой системы, поэтому программам, предназначенным для работы в Linux, возможно, потребуется обрабатывать оба типа адресов. При передаче в качестве аргумента для любого из этих типов адресов можно использовать строку или объект, подобный bytes.Изменено в версии 3.3: Ранее предполагалось, что пути сокетов
AF_UNIXиспользуют кодировку UTF-8.Изменено в версии 3.5: Теперь принимаются записываемые объекты, подобные bytes.
-
Для семейства адресов
AF_INETиспользуется пара(host, port), где host — строка, представляющая либо имя хоста в формате доменного имени интернета, например'daring.cwi.nl', либо адрес IPv4, например'100.50.200.5', а port — целое число.- Для адресов IPv4 вместо адреса хоста допускаются две специальные формы:
''представляетINADDR_ANYи используется для привязки ко всем интерфейсам, а строка'<broadcast>'представляетINADDR_BROADCAST. Такое поведение несовместимо с IPv6, поэтому, если вы планируете поддерживать IPv6 в своих программах на Python, возможно, стоит избегать этих форм.
- Для адресов IPv4 вместо адреса хоста допускаются две специальные формы:
-
Для семейства адресов
AF_INET6используется кортеж из четырёх элементов(host, port, flowinfo, scope_id), где flowinfo и scope_id представляют поляsin6_flowinfoиsin6_scope_idвstruct sockaddr_in6в C. Для методов модуляsocketflowinfo и scope_id можно опустить только для обратной совместимости. Однако учтите, что опускание scope_id может вызвать проблемы при работе с IPv6-адресами с заданной областью действия.Изменено в версии 3.7: Для многоадресных адресов (где scope_id имеет значение) адрес address может не содержать часть
%scope_id(илиzone id). Эта информация избыточна и может быть безопасно опущена (рекомендуется). -
Сокеты
AF_NETLINKпредставлены парами(pid, groups). -
Поддержка TIPC доступна только в Linux через семейство адресов
AF_TIPC. TIPC — открытый сетевой протокол, не основанный на IP, разработанный для использования в кластерных вычислительных средах. Адреса представлены кортежем, поля которого зависят от типа адреса. Общая форма кортежа:(addr_type, v1, v2, v3 [, scope]), где:-
addr_type — один из вариантов:
TIPC_ADDR_NAMESEQ,TIPC_ADDR_NAMEилиTIPC_ADDR_ID. -
scope — один из вариантов:
TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPEиTIPC_NODE_SCOPE. -
Если addr_type равен
TIPC_ADDR_NAME, то v1 — это тип сервера, v2 — идентификатор порта, а v3 должен быть равен 0.Если addr_type равен
TIPC_ADDR_NAMESEQ, то v1 — это тип сервера, v2 — нижний номер порта, а v3 — верхний номер порта.Если addr_type равен
TIPC_ADDR_ID, то v1 — это узел, v2 — ссылка, а v3 должен быть равен 0.
-
addr_type — один из вариантов:
-
Для семейства адресов
AF_CANиспользуется кортеж(interface, ), где interface — строка с именем сетевого интерфейса, например'can0'. Имя сетевого интерфейса''можно использовать для получения пакетов со всех сетевых интерфейсов этого семейства.- Для протокола
CAN_ISOTPтребуется кортеж(interface, rx_addr, tx_addr), где оба дополнительных параметра — беззнаковые целые числа типа long, представляющие идентификатор CAN (стандартный или расширенный). - Для протокола
CAN_J1939требуется кортеж(interface, name, pgn, addr), где дополнительные параметры — беззнаковое 64-битное целое число, представляющее имя ECU, беззнаковое 32-битное целое число, представляющее номер группы параметров (PGN), и 8-битное целое число, представляющее адрес.
- Для протокола
-
Для протокола
SYSPROTO_CONTROLсемействаPF_SYSTEMиспользуется строка или кортеж(id, unit). Строка — это имя элемента управления ядра с динамически назначенным идентификатором. Кортеж можно использовать, если известны идентификатор и номер экземпляра элемента управления ядра или если используется зарегистрированный идентификатор.Добавлено в версии 3.3.
-
AF_BLUETOOTHподдерживает следующие протоколы и форматы адресов:-
BTPROTO_L2CAPпринимает кортеж(bdaddr, psm[, cid[, bdaddr_type]]), где:-
bdaddr— строка, задающая адрес Bluetooth. -
psm— целое число, задающее мультиплексор протокола/службы. -
cid— необязательное целое число, задающее идентификатор канала. Если оно не указано, по умолчанию используется ноль. -
bdaddr_type— необязательное целое число, задающее тип адреса; одно из значенийBDADDR_BREDR(по умолчанию),BDADDR_LE_PUBLIC,BDADDR_LE_RANDOM.
Изменено в версии 3.14: Добавлены поля
cidиbdaddr_type. -
-
BTPROTO_RFCOMMпринимает(bdaddr, channel), гдеbdaddr— адрес Bluetooth в виде строки, аchannel— целое число. -
BTPROTO_HCIпринимает формат, зависящий от вашей ОС.- В Linux принимается целое число
device_idили кортеж(device_id, [channel]), гдеdevice_idзадаёт номер устройства Bluetooth, аchannel— необязательное целое число, задающее канал HCI (по умолчанию —HCI_CHANNEL_RAW). - В FreeBSD, NetBSD и DragonFly BSD принимается
bdaddr, гдеbdaddr— адрес Bluetooth в виде строки.
Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.
Изменено в версии 3.13.3: Добавлена поддержка FreeBSD.
Изменено в версии 3.14: Добавлено поле
channel. Теперь принимаетсяdevice_id, не упакованное в кортеж. - В Linux принимается целое число
-
BTPROTO_SCOпринимаетbdaddr, гдеbdaddr— адрес Bluetooth в виде строки или объектаbytes. (Например,'12:23:34:45:56:67'илиb'12:23:34:45:56:67'.)Изменено в версии 3.14: Добавлена поддержка FreeBSD.
-
-
AF_ALG— доступный только в Linux интерфейс криптографии ядра на основе сокетов. Сокет алгоритма настраивается кортежем из двух-четырёх элементов(type, name [, feat [, mask]]), где:-
type — тип алгоритма в виде строки, например
aead,hash,skcipherилиrng. -
name — имя алгоритма и режим операции в виде строки, например
sha256,hmac(sha256),cbc(aes)илиdrbg_nopr_ctr_aes256. - feat и mask — беззнаковые 32-битные целые числа.
Доступность: Linux >= 2.6.38.
Для некоторых типов алгоритмов требуются более новые версии ядра.
Добавлено в версии 3.6.
-
type — тип алгоритма в виде строки, например
-
AF_VSOCKобеспечивает связь между виртуальными машинами и их хостами. Сокеты представлены кортежем(CID, port), где идентификатор контекста (CID) и порт являются целыми числами.Доступность: Linux >= 3.9
См. vsock(7)
Добавлено в версии 3.7.
-
AF_PACKET— это низкоуровневый интерфейс, напрямую взаимодействующий с сетевыми устройствами. Адреса представлены кортежем(ifname, proto[, pkttype[, hatype[, addr]]]), где:- ifname — строка с именем устройства.
-
proto — номер протокола Ethernet. Для перехвата всех протоколов можно указать
ETH_P_ALL, одну из констант ETHERTYPE_* или любой другой номер протокола Ethernet. -
pkttype — необязательное целое число, задающее тип пакета:
-
PACKET_HOST(по умолчанию) — пакет, адресованный локальному хосту. -
PACKET_BROADCAST— широковещательный пакет канального уровня. -
PACKET_MULTICAST— пакет, отправленный на многоадресный адрес канального уровня. -
PACKET_OTHERHOST— пакет для другого хоста, перехваченный драйвером устройства в неразборчивом режиме. -
PACKET_OUTGOING— пакет, исходящий от локального хоста и возвращённый в сокет пакетов.
-
- hatype — необязательное целое число, задающее тип аппаратного адреса ARP.
- addr — необязательный объект, подобный bytes, задающий физический аппаратный адрес; его интерпретация зависит от устройства.
Доступность: Linux >= 2.2.
-
AF_QIPCRTR— доступный только в Linux интерфейс на основе сокетов для связи со службами, работающими на сопроцессорах платформ Qualcomm. Семейство адресов представлено кортежем(node, port), где node и port — неотрицательные целые числа.Доступность: Linux >= 4.7.
Добавлено в версии 3.8.
-
IPPROTO_UDPLITE— это вариант UDP, позволяющий указать, какая часть пакета включается в контрольную сумму. Он добавляет два параметра сокета, которые можно изменять.self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)меняет часть исходящих пакетов, включаемую в контрольную сумму, аself.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)отфильтровывает пакеты, в которых в контрольную сумму включена слишком малая часть данных. В обоих случаяхlengthдолжен находиться в диапазонеrange(8, 2**16, 8).Такой сокет следует создавать с помощью
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)для IPv4 илиsocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)для IPv6.Доступность: Linux >= 2.6.20, FreeBSD >= 10.1
Добавлено в версии 3.9.
-
AF_HYPERV— доступный только в Windows интерфейс на основе сокетов для связи с хостами и гостевыми системами Hyper-V. Семейство адресов представлено кортежем(vm_id, service_id), гдеvm_idиservice_id— строки UUID.vm_id— это идентификатор виртуальной машины или одно из известных значений VMID, если целевая система не является конкретной виртуальной машиной. Известные константы VMID, определённые вsocket:HV_GUID_ZEROHV_GUID_BROADCAST-
HV_GUID_WILDCARD— используется для привязки к себе и принятия подключений от всех разделов. -
HV_GUID_CHILDREN— используется для привязки к себе и принятия подключений от дочерних разделов. -
HV_GUID_LOOPBACK— используется как цель для подключения к себе. -
HV_GUID_PARENT— при использовании для привязки принимает подключение от родительского раздела. При использовании в качестве адреса назначения подключается к родительскому разделу.
service_id— это идентификатор зарегистрированной службы.Добавлено в версии 3.12.
Если в части host адреса сокета IPv4/IPv6 используется имя хоста, поведение программы может быть недетерминированным, поскольку Python использует первый адрес, возвращённый при разрешении DNS-имени. Фактический адрес IPv4/IPv6, в который будет преобразован адрес сокета, зависит от результатов разрешения DNS-имени и/или конфигурации хоста. Для детерминированного поведения указывайте в части host числовой адрес.
Все ошибки вызывают исключения. Могут возникать обычные исключения для недопустимых типов аргументов и нехватки памяти. Ошибки, связанные с семантикой сокетов или адресов, вызывают OSError или один из его подклассов.
Неблокирующий режим поддерживается с помощью setblocking(). Более общий вариант на основе тайм-аутов поддерживается с помощью settimeout().
Содержимое модуля
Модуль socket экспортирует следующие элементы.
Исключения
-
exception socket.error -
Устаревший псевдоним
OSError.
-
exception socket.herror -
Подкласс
OSError. Это исключение вызывается при ошибках, связанных с адресами, то есть в функциях, использующих h_errno в POSIX API C, включаяgethostbyname_ex()иgethostbyaddr(). Сопровождающее значение — пара(h_errno, string), представляющая ошибку, возвращённую вызовом библиотеки. h_errno — числовое значение, а string содержит описание h_errno, возвращаемое функцией Chstrerror().Изменено в версии 3.3: Этот класс стал подклассом
OSError.
-
exception socket.gaierror -
Подкласс
OSError. Это исключение вызывается при ошибках, связанных с адресами, функциямиgetaddrinfo()иgetnameinfo(). Сопровождающее значение — пара(error, string), представляющая ошибку, возвращённую вызовом библиотеки. string содержит описание error, возвращаемое функцией Cgai_strerror(). Числовое значение error совпадает с одной из константEAI_*, определённых в этом модуле.Изменено в версии 3.3: Этот класс стал подклассом
OSError.
-
exception socket.timeout -
Устаревший псевдоним
TimeoutError.Подкласс
OSError. Это исключение вызывается при возникновении тайм-аута на сокете, для которого тайм-ауты были включены предыдущим вызовомsettimeout()(или неявно черезsetdefaulttimeout()). Сопровождающее значение — строка, значение которой в настоящее время всегда равно «timed out».Изменено в версии 3.3: Этот класс стал подклассом
OSError.Изменено в версии 3.10: Этот класс стал псевдонимом
TimeoutError.
Константы
Константы AF_* и SOCK_* теперь являются коллекциями AddressFamily и SocketKind IntEnum.
Добавлено в версии 3.4.
-
socket.AF_UNIX -
socket.AF_INET -
socket.AF_INET6 -
Эти константы представляют семейства адресов (и протоколов), используемые в качестве первого аргумента для
socket(). Если константаAF_UNIXне определена, этот протокол не поддерживается. В зависимости от системы могут быть доступны дополнительные константы.
-
socket.AF_UNSPEC -
AF_UNSPECозначает, чтоgetaddrinfo()должна возвращать адреса сокетов для любого доступного семейства адресов (IPv4, IPv6 или любого другого).
-
socket.SOCK_STREAM -
socket.SOCK_DGRAM -
socket.SOCK_RAW -
socket.SOCK_RDM -
socket.SOCK_SEQPACKET -
Эти константы представляют типы сокетов, используемые в качестве второго аргумента для
socket(). В зависимости от системы могут быть доступны дополнительные константы. (По-видимому, обычно полезны толькоSOCK_STREAMиSOCK_DGRAM.)
-
socket.SOCK_CLOEXEC -
socket.SOCK_NONBLOCK -
Эти две константы, если они определены, можно комбинировать с типами сокетов, чтобы атомарно устанавливать некоторые флаги (тем самым избегая возможных состояний гонки и необходимости в отдельных вызовах).
См. также
В статье Безопасная работа с файловыми дескрипторами приведено более подробное объяснение.
Доступность: Linux >= 2.6.27.
Добавлено в версии 3.2.
- SO_*
-
socket.SOMAXCONN - MSG_*
- SOL_*
- SCM_*
- IPPROTO_*
- IPPORT_*
- INADDR_*
- IP_*
- IPV6_*
- EAI_*
- AI_*
- NI_*
- TCP_*
-
В модуле socket также определены многие константы этих форм, описанные в документации Unix по сокетам и/или протоколу IP. Обычно они используются в качестве аргументов методов
setsockopt()иgetsockopt()объектов сокетов. В большинстве случаев определены только те символы, которые указаны в заголовочных файлах Unix; для некоторых символов предусмотрены значения по умолчанию.Изменено в версии 3.6: добавлены
SO_DOMAIN,SO_PROTOCOL,SO_PEERSEC,SO_PASSSEC,TCP_USER_TIMEOUT,TCP_CONGESTION.Изменено в версии 3.6.5: добавлена поддержка
TCP_FASTOPEN,TCP_KEEPCNTна платформах Windows, если они доступны.Изменено в версии 3.7: добавлена
TCP_NOTSENT_LOWAT.Добавлена поддержка
TCP_KEEPIDLE,TCP_KEEPINTVLна платформах Windows, если они доступны.Изменено в версии 3.10: добавлена
IP_RECVTOS. ДобавленаTCP_KEEPALIVE. В macOS эту константу можно использовать так же, какTCP_KEEPIDLEиспользуется в Linux.Изменено в версии 3.11: добавлена
TCP_CONNECTION_INFO. В macOS эту константу можно использовать так же, какTCP_INFOиспользуется в Linux и BSD.Изменено в версии 3.12: добавлены
SO_RTABLEиSO_USER_COOKIE. В OpenBSD и FreeBSD соответственно эти константы можно использовать так же, какSO_MARKиспользуется в Linux. Также добавлены отсутствовавшие параметры сокетов TCP из Linux:TCP_MD5SIG,TCP_THIN_LINEAR_TIMEOUTS,TCP_THIN_DUPACK,TCP_REPAIR,TCP_REPAIR_QUEUE,TCP_QUEUE_SEQ,TCP_REPAIR_OPTIONS,TCP_TIMESTAMP,TCP_CC_INFO,TCP_SAVE_SYN,TCP_SAVED_SYN,TCP_REPAIR_WINDOW,TCP_FASTOPEN_CONNECT,TCP_ULP,TCP_MD5SIG_EXT,TCP_FASTOPEN_KEY,TCP_FASTOPEN_NO_COOKIE,TCP_ZEROCOPY_RECEIVE,TCP_INQ,TCP_TX_DELAY. ДобавленыIP_PKTINFO,IP_UNBLOCK_SOURCE,IP_BLOCK_SOURCE,IP_ADD_SOURCE_MEMBERSHIP,IP_DROP_SOURCE_MEMBERSHIP.Изменено в версии 3.13: добавлена
SO_BINDTOIFINDEX. В Linux эту константу можно использовать так же, какSO_BINDTODEVICE, но вместо имени указывается индекс сетевого интерфейса.Изменено в версии 3.14: в Linux добавлены отсутствовавшие
IP_FREEBIND,IP_RECVERR,IPV6_RECVERR,IP_RECVTTLиIP_RECVORIGDSTADDR.Изменено в версии 3.14: добавлена поддержка
TCP_QUICKACKна платформах Windows, если она доступна.
-
socket.AF_CAN -
socket.PF_CAN - SOL_CAN_*
- CAN_*
-
В модуле socket также определены многие константы этих форм, описанные в документации Linux.
Доступность: Linux >= 2.6.25, NetBSD >= 8.
Добавлено в версии 3.3.
Изменено в версии 3.11: добавлена поддержка NetBSD.
Изменено в версии 3.14: в Linux восстановлена отсутствовавшая
CAN_RAW_ERR_FILTER.
-
socket.CAN_BCM - CAN_BCM_*
-
CAN_BCM в семействе протоколов CAN — это протокол диспетчера широковещательных рассылок (BCM). Константы диспетчера широковещательных рассылок, описанные в документации Linux, также определены в модуле socket.
Доступность: Linux >= 2.6.25.
Примечание
Флаг
CAN_BCM_CAN_FD_FRAMEдоступен только в Linux >= 4.8.Добавлено в версии 3.4.
-
socket.CAN_RAW_FD_FRAMES -
Включает поддержку CAN FD в сокете CAN_RAW. По умолчанию она отключена. Это позволяет приложению отправлять как кадры CAN, так и кадры CAN FD; однако при чтении из сокета необходимо принимать и кадры CAN, и кадры CAN FD.
Эта константа описана в документации Linux.
Доступность: Linux >= 3.6.
Добавлено в версии 3.5.
-
socket.CAN_RAW_JOIN_FILTERS -
Объединяет применённые фильтры CAN так, что в пространство пользователя передаются только кадры CAN, соответствующие всем указанным фильтрам CAN.
Эта константа описана в документации Linux.
Доступность: Linux >= 4.1.
Добавлено в версии 3.9.
-
socket.CAN_ISOTP -
CAN_ISOTP в семействе протоколов CAN — это протокол ISO-TP (ISO 15765-2). Константы ISO-TP описаны в документации Linux.
Доступность: Linux >= 2.6.25.
Добавлено в версии 3.7.
-
socket.CAN_J1939 -
CAN_J1939 в семействе протоколов CAN — это протокол SAE J1939. Константы J1939 описаны в документации Linux.
Доступность: Linux >= 5.4.
Добавлено в версии 3.9.
-
socket.AF_DIVERT -
socket.PF_DIVERT -
Эти две константы, описанные на справочной странице FreeBSD divert(4), также определены в модуле socket.
Доступность: FreeBSD >= 14.0.
Добавлено в версии 3.12.
-
socket.AF_PACKET -
socket.PF_PACKET - PACKET_*
-
В модуле socket также определены многие константы этих форм, описанные в документации Linux.
Доступность: Linux >= 2.2.
-
socket.ETH_P_ALL -
ETH_P_ALLможно использовать в конструктореsocketв качестве proto для семействаAF_PACKET, чтобы захватывать все пакеты независимо от протокола.Дополнительную информацию см. на справочной странице packet(7).
Доступность: Linux.
Добавлено в версии 3.12.
-
socket.AF_RDS -
socket.PF_RDS -
socket.SOL_RDS - RDS_*
-
В модуле socket также определены многие константы этих форм, описанные в документации Linux.
Доступность: Linux >= 2.6.30.
Добавлено в версии 3.3.
-
socket.SIO_RCVALL -
socket.SIO_KEEPALIVE_VALS -
socket.SIO_LOOPBACK_FAST_PATH - RCVALL_*
-
Константы для WSAIoctl() в Windows. Они используются в качестве аргументов метода
ioctl()объектов сокетов.Изменено в версии 3.6: добавлена
SIO_LOOPBACK_FAST_PATH.
- TIPC_*
-
Константы, связанные с TIPC и соответствующие константам, экспортируемым API сокетов C. Дополнительную информацию см. в документации TIPC.
-
socket.AF_ALG -
socket.SOL_ALG - ALG_*
-
Константы для криптографии ядра Linux.
Доступность: Linux >= 2.6.38.
Добавлено в версии 3.6.
-
socket.AF_VSOCK -
socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID - VMADDR*
- SO_VM*
-
Константы для взаимодействия между хостом и гостевой системой в Linux.
Доступность: Linux >= 4.8.
Добавлено в версии 3.7.
-
socket.AF_LINK -
Доступность: BSD, macOS.
Добавлено в версии 3.4.
-
socket.has_ipv6 -
Эта константа содержит логическое значение, указывающее, поддерживается ли IPv6 на данной платформе.
-
socket.AF_BLUETOOTH -
socket.BTPROTO_L2CAP -
socket.BTPROTO_RFCOMM -
socket.BTPROTO_HCI -
socket.BTPROTO_SCO -
Целочисленные константы для использования с адресами Bluetooth.
-
socket.BDADDR_ANY -
socket.BDADDR_LOCAL -
Это строковые константы, содержащие адреса Bluetooth со специальным значением. Например,
BDADDR_ANYможно использовать для указания любого адреса при привязке сокета с помощьюBTPROTO_RFCOMM.
-
socket.BDADDR_BREDR -
socket.BDADDR_LE_PUBLIC -
socket.BDADDR_LE_RANDOM -
Эти константы определяют тип адреса Bluetooth при привязке или подключении сокета
BTPROTO_L2CAP.Доступность: Linux, FreeBSD
Добавлено в версии 3.14.
-
socket.SOL_RFCOMM -
socket.SOL_L2CAP -
socket.SOL_HCI -
socket.SOL_SCO -
socket.SOL_BLUETOOTH -
Используются в аргументе level методов
setsockopt()иgetsockopt()объектов Bluetooth-сокетов.SOL_BLUETOOTHдоступна только в Linux. Другие константы доступны, если поддерживается соответствующий протокол.
- SO_L2CAP_*
-
socket.L2CAP_LM - L2CAP_LM_*
- SO_RFCOMM_*
- RFCOMM_LM_*
- SO_SCO_*
- SO_BTH_*
- BT_*
-
Используются в аргументах, задающих имя и значение параметра, методов
setsockopt()иgetsockopt()объектов Bluetooth-сокетов.BT_*иL2CAP_LMдоступны только в Linux.SO_BTH_*доступны только в Windows. Другие константы могут быть доступны в Linux и различных системах BSD.Добавлено в версии 3.14.
-
socket.HCI_FILTER -
socket.HCI_TIME_STAMP -
socket.HCI_DATA_DIR -
socket.SO_HCI_EVT_FILTER -
socket.SO_HCI_PKT_FILTER -
Имена параметров для использования с
BTPROTO_HCI. Доступность и формат значений параметров зависят от платформы.Изменено в версии 3.14: добавлены
SO_HCI_EVT_FILTERиSO_HCI_PKT_FILTERв NetBSD и DragonFly BSD. ДобавленаHCI_DATA_DIRв FreeBSD, NetBSD и DragonFly BSD.
-
socket.HCI_DEV_NONE -
Значение
device_id, используемое для создания сокета HCI, не привязанного к одному конкретному адаптеру Bluetooth.Доступность: Linux
Добавлено в версии 3.14.
-
socket.HCI_CHANNEL_RAW -
socket.HCI_CHANNEL_USER -
socket.HCI_CHANNEL_MONITOR -
socket.HCI_CHANNEL_CONTROL -
socket.HCI_CHANNEL_LOGGING -
Возможные значения поля
channelв адресеBTPROTO_HCI.Доступность: Linux
Добавлено в версии 3.14.
-
socket.AF_QIPCRTR -
Константа для протокола маршрутизатора IPC компании Qualcomm, используемого для связи со службами, предоставляемыми удалёнными процессорами.
Доступность: Linux >= 4.7.
-
socket.SCM_CREDS2 -
socket.LOCAL_CREDS -
socket.LOCAL_CREDS_PERSISTENT -
LOCAL_CREDS и LOCAL_CREDS_PERSISTENT можно использовать с сокетами SOCK_DGRAM и SOCK_STREAM; они эквивалентны SO_PASSCRED в Linux/DragonFlyBSD. LOCAL_CREDS отправляет учётные данные при первом чтении, а LOCAL_CREDS_PERSISTENT — при каждом чтении; в последнем случае для типа сообщения необходимо использовать SCM_CREDS2.
Добавлено в версии 3.11.
Доступность: FreeBSD.
-
socket.SO_INCOMING_CPU -
Константа для оптимизации локальности CPU, используется совместно с
SO_REUSEPORT.Добавлено в версии 3.11.
Доступность: Linux >= 3.9
-
socket.SO_REUSEPORT_LB -
Константа для включения привязки нескольких сокетов к одному адресу и порту с балансировкой нагрузки.
Добавлено в версии 3.14.
Доступность: FreeBSD >= 12.0
-
socket.AF_HYPERV -
socket.HV_PROTOCOL_RAW -
socket.HVSOCKET_CONNECT_TIMEOUT -
socket.HVSOCKET_CONNECT_TIMEOUT_MAX -
socket.HVSOCKET_CONNECTED_SUSPEND -
socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU -
socket.HV_GUID_ZERO -
socket.HV_GUID_WILDCARD -
socket.HV_GUID_BROADCAST -
socket.HV_GUID_CHILDREN -
socket.HV_GUID_LOOPBACK -
socket.HV_GUID_PARENT -
Константы для сокетов Windows Hyper-V, обеспечивающих взаимодействие хоста и гостевой системы.
Доступность: Windows.
Добавлено в версии 3.12.
-
socket.ETHERTYPE_ARP -
socket.ETHERTYPE_IP -
socket.ETHERTYPE_IPV6 -
socket.ETHERTYPE_VLAN -
Константы — номер протокола IEEE 802.3.
Доступность: Linux, FreeBSD, macOS.
Добавлено в версии 3.12.
-
socket.SHUT_RD -
socket.SHUT_WR -
socket.SHUT_RDWR -
Эти константы используются методом
shutdown()объектов сокетов.Доступность: недоступно в WASI.
Функции
Создание сокетов
Все перечисленные ниже функции создают объекты сокетов.
Конструктор класса socket создаёт новый сокет напрямую; параметры и полное описание см. в разделе Объекты сокетов.
-
socket.socketpair([family[, type[, proto]]]) -
Создаёт пару связанных объектов сокетов с указанными семейством адресов, типом сокета и номером протокола. Семейство адресов, тип сокета и номер протокола задаются так же, как для функции
socket(). Семейство по умолчанию —AF_UNIX, если оно определено на платформе; в противном случае используетсяAF_INET.Созданные сокеты являются не наследуемыми.
Изменено в версии 3.2: Возвращаемые объекты сокетов теперь поддерживают весь API сокетов, а не только его часть.
Изменено в версии 3.4: Возвращаемые сокеты теперь не наследуются.
Изменено в версии 3.5: Добавлена поддержка Windows.
-
socket.create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False) -
Подключается к TCP-службе, прослушивающей интернет-адрес (2-кортеж
(host, port)), и возвращает объект сокета. Это функция более высокого уровня, чемsocket.connect(): если host — нечисловое имя узла, функция попытается разрешить его как дляAF_INET, так и дляAF_INET6, а затем по очереди попытается подключиться ко всем возможным адресам, пока подключение не будет установлено. Это упрощает создание клиентов, совместимых как с IPv4, так и с IPv6.При передаче необязательного параметра timeout время ожидания для экземпляра сокета устанавливается перед попыткой подключения. Если timeout не указан, используется глобальное значение времени ожидания по умолчанию, возвращаемое функцией
getdefaulttimeout().Если указан параметр source_address, он должен быть 2-кортежем
(host, port), по которому сокет привязывается к исходному адресу перед подключением. Если host или port равны ‘’ или 0 соответственно, используется поведение ОС по умолчанию.Если установить подключение не удаётся, возникает исключение. По умолчанию это исключение, возникшее при попытке подключения к последнему адресу в списке. Если all_errors равно
True, возникаетExceptionGroup, содержащая ошибки всех попыток.Изменено в версии 3.2: Добавлен параметр source_address.
Изменено в версии 3.11: Добавлен параметр all_errors.
-
socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False) -
Вспомогательная функция, создающая TCP-сокет, привязанный к адресу (2-кортеж
(host, port)), и возвращающая объект сокета.Значением family должно быть
AF_INETилиAF_INET6. backlog — размер очереди, передаваемый вsocket.listen(); если он не указан, выбирается подходящее значение по умолчанию. Параметр reuse_port определяет, следует ли устанавливать параметр сокетаSO_REUSEPORT.Если dualstack_ipv6 имеет значение true, family равно
AF_INET6, а платформа поддерживает эту возможность, сокет сможет принимать подключения как IPv4, так и IPv6; в противном случае возникнетValueError. Предполагается, что большинство POSIX-платформ и Windows поддерживают эту функциональность. Если эта функция включена, адрес, возвращаемый методомsocket.getpeername()при подключении IPv4, будет адресом IPv6, представленным в виде IPv4-отображённого адреса IPv6. Если dualstack_ipv6 имеет значение false, эта функция будет явно отключена на платформах, где она включена по умолчанию (например, в Linux). Этот параметр можно использовать вместе сhas_dualstack_ipv6():import socket addr = ("", 8080) # all interfaces, port 8080 if socket.has_dualstack_ipv6(): s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True) else: s = socket.create_server(addr)Примечание
На POSIX-платформах параметр сокета
SO_REUSEADDRустанавливается, чтобы можно было немедленно повторно использовать ранее привязанные к тому же адресу сокеты, оставшиеся в состоянии TIME_WAIT.Добавлено в версии 3.8.
-
socket.has_dualstack_ipv6() -
Возвращает
True, если платформа поддерживает создание TCP-сокета, способного обрабатывать подключения как IPv4, так и IPv6.Добавлено в версии 3.8.
-
socket.fromfd(fd, family, type, proto=0) -
Дублирует файловый дескриптор fd (целое число, возвращаемое методом
fileno()файлового объекта) и создаёт из результата объект сокета. Семейство адресов, тип сокета и номер протокола задаются так же, как для функцииsocket(). Файловый дескриптор должен ссылаться на сокет, но это не проверяется — последующие операции над объектом могут завершиться ошибкой, если файловый дескриптор недействителен. Эта функция редко бывает нужна, но её можно использовать для получения или установки параметров сокета, переданного программе в качестве стандартного ввода или вывода (например, сервером, запущенным демоном inet в Unix). Предполагается, что сокет работает в блокирующем режиме.Созданный сокет является не наследуемым.
Изменено в версии 3.4: Возвращаемый сокет теперь не наследуется.
-
Создаёт экземпляр сокета из данных, полученных методом
socket.share(). Предполагается, что сокет работает в блокирующем режиме.Доступность: Windows.
Добавлено в версии 3.3.
Другие функции
Модуль socket также предоставляет различные сетевые службы:
-
socket.close(fd) -
Закрывает файловый дескриптор сокета. Это аналог
os.close(), но для сокетов. На некоторых платформах (в частности, в Windows)os.close()не работает с файловыми дескрипторами сокетов.Добавлено в версии 3.7.
-
socket.getaddrinfo(host, port, family=AF_UNSPEC, type=0, proto=0, flags=0) -
Эта функция обёртывает системную функцию C
getaddrinfo.Преобразует аргументы host/port в последовательность кортежей из 5 элементов, содержащих все необходимые аргументы для создания сокета, подключённого к этой службе. host — это доменное имя, строковое представление адреса IPv4/IPv6 или
None. port — строковое имя службы, например'http', номер порта илиNone. ПередавNoneв качестве значения host и port, можно передатьNULLв нижележащий API C.Аргументы family, type и proto можно указать дополнительно, чтобы задать параметры и ограничить список возвращаемых адресов. Чтобы не ограничивать результаты, передайте их значения по умолчанию (
AF_UNSPEC, 0 и 0 соответственно). Подробнее см. примечание ниже.Аргумент flags может содержать одну или несколько констант
AI_*и влияет на то, как вычисляются и возвращаются результаты. Например,AI_NUMERICHOSTотключает разрешение доменных имён и вызывает ошибку, если host — доменное имя.Функция возвращает список кортежей из 5 элементов следующей структуры:
(family, type, proto, canonname, sockaddr)В этих кортежах значения family, type, proto — целые числа, предназначенные для передачи функции
socket(). canonname будет строкой с каноническим именем host, еслиAI_CANONNAMEвключён в аргумент flags; в противном случае canonname будет пустым. sockaddr — это кортеж с адресом сокета, формат которого зависит от возвращённого значения family (кортеж из 2 элементов(address, port)дляAF_INET, кортеж из 4 элементов(address, port, flowinfo, scope_id)дляAF_INET6). Он предназначен для передачи методуsocket.connect().Примечание
Если вы собираетесь использовать результаты
getaddrinfo()для создания сокета (а не, например, для получения canonname), рассмотрите возможность ограничить результаты с помощью type (например,SOCK_STREAMилиSOCK_DGRAM) и/или proto (например,IPPROTO_TCPилиIPPROTO_UDP), которые поддерживает ваше приложение.Поведение при значениях по умолчанию для family, type, proto и flags зависит от системы.
Многие системы (например, большинство конфигураций Linux) возвращают отсортированный список всех подходящих адресов. Обычно следует пробовать эти адреса по порядку, пока подключение не будет установлено (возможно, параллельно, например, с помощью алгоритма Happy Eyeballs). В таких случаях ограничение type и/или proto может помочь исключить неудачные или непригодные попытки подключения.
Однако некоторые системы возвращают только один адрес. (Например, такое поведение отмечалось в конфигурациях Solaris и AIX.) В этих системах ограничение type и/или proto помогает убедиться, что этот адрес пригоден для использования.
Вызывает событие аудита
socket.getaddrinfoс аргументамиhost,port,family,type,protocol.В следующем примере извлекаются сведения об адресе для гипотетического TCP-подключения к
example.orgчерез порт 80 (результаты могут отличаться в вашей системе, если IPv6 не включён):>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP) [(socket.AF_INET6, socket.SOCK_STREAM, 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)), (socket.AF_INET, socket.SOCK_STREAM, 6, '', ('93.184.216.34', 80))]Изменено в версии 3.2: параметры теперь можно передавать с помощью именованных аргументов.
Изменено в версии 3.7: для адресов многоадресной рассылки IPv6 строковое представление адреса не будет содержать часть
%scope_id.
-
socket.getfqdn([name]) -
Возвращает полное доменное имя для name. Если name не задано или пусто, оно интерпретируется как имя локального узла. Чтобы найти полное имя, проверяется имя узла, возвращённое функцией
gethostbyaddr(), а затем, если они доступны, псевдонимы узла. Выбирается первое имя, содержащее точку. Если полное доменное имя недоступно и name было задано, оно возвращается без изменений. Если name было пустым или равнялось'0.0.0.0', возвращается имя узла изgethostname().
-
socket.gethostbyname(hostname) -
Преобразует имя узла в формат адреса IPv4. Адрес IPv4 возвращается в виде строки, например
'100.50.200.5'. Если имя узла само является адресом IPv4, оно возвращается без изменений. Более полный интерфейс предоставляет функцияgethostbyname_ex().gethostbyname()не поддерживает разрешение имён IPv6; для поддержки IPv4/IPv6 в двойном стеке следует использоватьgetaddrinfo().Вызывает событие аудита
socket.gethostbynameс аргументомhostname.Доступность: недоступно в WASI.
-
socket.gethostbyname_ex(hostname) -
Преобразует имя узла в формат адреса IPv4; расширенный интерфейс. Возвращает кортеж из 3 элементов
(hostname, aliaslist, ipaddrlist), где hostname — основное имя узла, aliaslist — (возможно, пустой) список альтернативных имён того же узла, а ipaddrlist — список адресов IPv4 того же интерфейса на том же узле (часто, но не всегда, содержащий один адрес).gethostbyname_ex()не поддерживает разрешение имён IPv6; для поддержки IPv4/IPv6 в двойном стеке следует использоватьgetaddrinfo().Вызывает событие аудита
socket.gethostbynameс аргументомhostname.Доступность: недоступно в WASI.
-
socket.gethostname() -
Возвращает строку с именем узла компьютера, на котором в данный момент выполняется интерпретатор Python.
Вызывает событие аудита
socket.gethostnameбез аргументов.Примечание:
gethostname()не всегда возвращает полное доменное имя; для этого используйтеgetfqdn().Доступность: недоступно в WASI.
-
socket.gethostbyaddr(ip_address) -
Возвращает кортеж из 3 элементов
(hostname, aliaslist, ipaddrlist), где hostname — основное имя узла, отвечающего на запрос по заданному ip_address, aliaslist — (возможно, пустой) список альтернативных имён того же узла, а ipaddrlist — список адресов IPv4/IPv6 того же интерфейса на том же узле (скорее всего, содержащий только один адрес). Чтобы найти полное доменное имя, используйте функциюgetfqdn().gethostbyaddr()поддерживает IPv4 и IPv6.Вызывает событие аудита
socket.gethostbyaddrс аргументомip_address.Доступность: недоступно в WASI.
-
socket.getnameinfo(sockaddr, flags) -
Преобразует адрес сокета sockaddr в кортеж из 2 элементов
(host, port). В зависимости от значения flags, результат может содержать полное доменное имя или числовое представление адреса в host. Аналогично, port может содержать строковое имя порта или его номер.Для адресов IPv6 к части узла добавляется
%scope_id, если sockaddr содержит значимый scope_id. Обычно это происходит для адресов многоадресной рассылки.Дополнительные сведения об аргументе flags можно найти в getnameinfo(3).
Вызывает событие аудита
socket.getnameinfoс аргументомsockaddr.Доступность: недоступно в WASI.
-
socket.getprotobyname(protocolname) -
Преобразует имя интернет-протокола (например,
'icmp') в константу, подходящую для передачи в качестве третьего (необязательного) аргумента функцииsocket(). Обычно это требуется только для сокетов, открытых в «необработанном» режиме (SOCK_RAW); в обычных режимах сокета правильный протокол выбирается автоматически, если он не указан или равен нулю.Доступность: недоступно в WASI.
-
socket.getservbyname(servicename[, protocolname]) -
Преобразует имя интернет-службы и имя протокола в номер порта этой службы. Если необязательное имя протокола задано, оно должно быть
'tcp'или'udp'; в противном случае подойдёт любой протокол.Вызывает событие аудита
socket.getservbynameс аргументамиservicename,protocolname.Доступность: недоступно в WASI.
-
socket.getservbyport(port[, protocolname]) -
Преобразует номер интернет-порта и имя протокола в имя службы, использующей этот порт. Если необязательное имя протокола задано, оно должно быть
'tcp'или'udp'; в противном случае подойдёт любой протокол.Вызывает событие аудита
socket.getservbyportс аргументамиport,protocolname.Доступность: недоступно в WASI.
-
socket.ntohl(x) -
Преобразует положительные 32-разрядные целые числа из сетевого порядка байтов в порядок байтов узла. На компьютерах, где порядок байтов узла совпадает с сетевым, функция ничего не делает; в противном случае она меняет местами 4 байта.
-
socket.ntohs(x) -
Преобразует положительные 16-разрядные целые числа из сетевого порядка байтов в порядок байтов узла. На компьютерах, где порядок байтов узла совпадает с сетевым, функция ничего не делает; в противном случае она меняет местами 2 байта.
Изменено в версии 3.10: вызывает
OverflowError, если значение x не помещается в беззнаковое 16-разрядное целое число.
-
socket.htonl(x) -
Преобразует положительные 32-разрядные целые числа из порядка байтов узла в сетевой порядок байтов. На компьютерах, где порядок байтов узла совпадает с сетевым, функция ничего не делает; в противном случае она меняет местами 4 байта.
-
socket.htons(x) -
Преобразует положительные 16-разрядные целые числа из порядка байтов узла в сетевой порядок байтов. На компьютерах, где порядок байтов узла совпадает с сетевым, функция ничего не делает; в противном случае она меняет местами 2 байта.
Изменено в версии 3.10: вызывает
OverflowError, если значение x не помещается в беззнаковое 16-разрядное целое число.
-
socket.inet_aton(ip_string) -
Преобразует адрес IPv4 из строкового формата с точками (например, ‘123.45.67.89’) в упакованный двоичный формат длиной 32 бита — объект bytes длиной четыре символа. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа
in_addr, которым в C обозначается упакованный двоичный формат длиной 32 бита, возвращаемый этой функцией.inet_aton()также принимает строки с менее чем тремя точками; подробности см. на странице руководства Unix inet(3).Если переданная этой функции строка адреса IPv4 недопустима, будет вызвано исключение
OSError. Обратите внимание, что точное определение допустимого значения зависит от нижележащей реализации Cinet_aton().inet_aton()не поддерживает IPv6; для поддержки IPv4/IPv6 в двойном стеке следует использоватьinet_pton().
-
socket.inet_ntoa(packed_ip) -
Преобразует упакованный 32-разрядный адрес IPv4 (объект подобный bytes длиной четыре байта) в стандартное строковое представление с точками (например, ‘123.45.67.89’). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа
in_addr, которым в C обозначаются упакованные двоичные данные длиной 32 бита, принимаемые этой функцией в качестве аргумента.Если переданная этой функции последовательность байтов имеет длину, отличную от 4 байт, будет вызвано исключение
OSError.inet_ntoa()не поддерживает IPv6; для поддержки IPv4/IPv6 в двойном стеке следует использоватьinet_ntop().Изменено в версии 3.5: теперь принимаются доступные для записи объекты подобные bytes.
-
socket.inet_pton(address_family, ip_string) -
Преобразует IP-адрес из строкового формата, специфичного для его семейства, в упакованный двоичный формат.
inet_pton()полезна, когда библиотеке или сетевому протоколу требуется объект типаin_addr(аналогичныйinet_aton()) илиin6_addr.В настоящее время поддерживаются значения address_family
AF_INETиAF_INET6. Если строка IP-адреса ip_string недопустима, будет вызвано исключениеOSError. Обратите внимание, что точное определение допустимого значения зависит как от значения address_family, так и от нижележащей реализацииinet_pton().Доступность: Unix, Windows.
Изменено в версии 3.4: добавлена поддержка Windows
-
socket.inet_ntop(address_family, packed_ip) -
Преобразует упакованный IP-адрес (объект подобный bytes некоторой длины) в стандартное строковое представление, специфичное для его семейства (например,
'7.10.0.5'или'5aef:2b::8').inet_ntop()полезна, когда библиотека или сетевой протокол возвращает объект типаin_addr(аналогичныйinet_ntoa()) илиin6_addr.В настоящее время поддерживаются значения address_family
AF_INETиAF_INET6. Если объект bytes packed_ip имеет длину, не соответствующую указанному семейству адресов, будет вызвано исключениеValueError. При ошибках вызоваinet_ntop()вызывается исключениеOSError.Доступность: Unix, Windows.
Изменено в версии 3.4: добавлена поддержка Windows
Изменено в версии 3.5: теперь принимаются доступные для записи объекты подобные bytes.
-
socket.CMSG_LEN(length) -
Возвращает общую длину элемента вспомогательных данных с данными заданной длины length без учёта завершающего заполнения. Это значение часто можно использовать как размер буфера для
recvmsg(), чтобы получить один элемент вспомогательных данных, однако RFC 3542 требует, чтобы переносимые приложения использовалиCMSG_SPACE()и тем самым резервировали место для заполнения, даже если элемент будет последним в буфере. Вызывает исключениеOverflowError, если значение length выходит за допустимый диапазон.Доступность: Unix, кроме WASI.
Большинство платформ Unix.
Добавлено в версии 3.3.
-
socket.CMSG_SPACE(length) -
Возвращает размер буфера, необходимый для
recvmsg(), чтобы получить элемент вспомогательных данных с данными заданной длины length вместе с завершающим заполнением. Размер буфера, необходимый для получения нескольких элементов, равен сумме значенийCMSG_SPACE()для длин данных этих элементов. Вызывает исключениеOverflowError, если значение length выходит за допустимый диапазон.Обратите внимание, что некоторые системы могут поддерживать вспомогательные данные, не предоставляя эту функцию. Кроме того, установка размера буфера на основе результата этой функции может не ограничить точно объём получаемых вспомогательных данных, поскольку дополнительные данные могут поместиться в области заполнения.
Доступность: Unix, кроме WASI.
Большинство платформ Unix.
Добавлено в версии 3.3.
-
socket.getdefaulttimeout() -
Возвращает значение времени ожидания по умолчанию в секундах (число с плавающей точкой) для новых объектов сокетов. Значение
Noneозначает, что у новых объектов сокетов нет времени ожидания. При первом импорте модуля socket значение по умолчанию равноNone.
-
socket.setdefaulttimeout(timeout) -
Задаёт значение времени ожидания по умолчанию в секундах (число с плавающей точкой) для новых объектов сокетов. При первом импорте модуля socket значение по умолчанию равно
None. Возможные значения и их значения см. вsettimeout().
-
socket.sethostname(name) -
Задаёт компьютеру имя узла name. Если у вас недостаточно прав, будет вызвано исключение
OSError.Вызывает событие аудита
socket.sethostnameс аргументомname.Доступность: Unix, кроме Android.
Добавлено в версии 3.3.
-
socket.if_nameindex() -
Возвращает список кортежей со сведениями о сетевых интерфейсах (целочисленный индекс, строковое имя). Вызывает исключение
OSErrorпри сбое системного вызова.Доступность: Unix, Windows, кроме WASI.
Добавлено в версии 3.3.
Изменено в версии 3.8: добавлена поддержка Windows.
Примечание
В Windows сетевые интерфейсы имеют разные имена в разных контекстах (все примеры):
- UUID:
{FB605B73-AAC2-49A6-9A2F-25416AEA0573} - имя:
ethernet_32770 - понятное имя:
vEthernet (nat) - описание:
Hyper-V Virtual Ethernet Adapter
Эта функция возвращает имена второго типа из списка — в данном примере
ethernet_32770. - UUID:
-
socket.if_nametoindex(if_name) -
Возвращает номер индекса сетевого интерфейса, соответствующий имени интерфейса. Вызывает исключение
OSError, если интерфейса с указанным именем не существует.Доступность: Unix, Windows, кроме WASI.
Добавлено в версии 3.3.
Изменено в версии 3.8: добавлена поддержка Windows.
См. также
«Имя интерфейса» — это имя, описанное в
if_nameindex().
-
socket.if_indextoname(if_index) -
Возвращает имя сетевого интерфейса, соответствующее номеру его индекса. Вызывает исключение
OSError, если интерфейса с указанным индексом не существует.Доступность: Unix, Windows, кроме WASI.
Добавлено в версии 3.3.
Изменено в версии 3.8: добавлена поддержка Windows.
См. также
«Имя интерфейса» — это имя, описанное в
if_nameindex().
-
socket.send_fds(sock, buffers, fds[, flags[, address]]) -
Отправляет список файловых дескрипторов fds через сокет
AF_UNIXsock. Параметр fds — это последовательность файловых дескрипторов. Описание этих параметров см. вsendmsg().Доступность: Unix, кроме WASI.
Платформы Unix с поддержкой
sendmsg()и механизмаSCM_RIGHTS.Добавлено в версии 3.9.
-
socket.recv_fds(sock, bufsize, maxfds[, flags]) -
Получает до maxfds файловых дескрипторов из сокета
AF_UNIXsock. Возвращает(msg, list(fds), flags, addr). Описание этих параметров см. вrecvmsg().Доступность: Unix, кроме WASI.
Платформы Unix с поддержкой
recvmsg()и механизмаSCM_RIGHTS.Добавлено в версии 3.9.
Примечание
Любые усечённые целые числа в конце списка файловых дескрипторов.
Объекты сокетов
-
class socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -
Создаёт новый сокет, используя заданные семейство адресов, тип сокета и номер протокола. Семейство адресов должно быть
AF_INET(по умолчанию),AF_INET6,AF_UNIX,AF_CAN,AF_PACKETилиAF_RDS. Тип сокета должен бытьSOCK_STREAM(по умолчанию),SOCK_DGRAM,SOCK_RAWили, возможно, одной из других константSOCK_. Номер протокола обычно равен нулю, поэтому его можно не указывать; в случае, когда семейство адресов —AF_CAN, протоколом должен быть один изCAN_RAW,CAN_BCM,CAN_ISOTPилиCAN_J1939.Если указан fileno, значения family, type и proto автоматически определяются по указанному файловому дескриптору. Автоматическое определение можно переопределить, вызвав функцию с явными аргументами family, type или proto. Это влияет только на представление данных в Python, например на возвращаемое значение
socket.getpeername(), но не на сам ресурс ОС. В отличие отsocket.fromfd(), fileno возвращает тот же сокет, а не его дубликат. Это может помочь закрыть отсоединённый сокет с помощьюsocket.close().Созданный сокет является не наследуемым.
Вызывает событие аудита
socket.__new__с аргументамиself,family,type,protocol.Изменено в версии 3.3: Добавлено семейство AF_CAN. Добавлено семейство AF_RDS.
Изменено в версии 3.4: Добавлен протокол CAN_BCM.
Изменено в версии 3.4: Теперь возвращаемый сокет не наследуется.
Изменено в версии 3.7: Добавлен протокол CAN_ISOTP.
Изменено в версии 3.7: Если к type применяются битовые флаги
SOCK_NONBLOCKилиSOCK_CLOEXEC, они сбрасываются, иsocket.typeих не отражает. При этом они по-прежнему передаются нижележащему системному вызовуsocket(). Поэтомуsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK)по-прежнему создаст неблокирующий сокет в ОС, поддерживающих
SOCK_NONBLOCK, ноsock.typeбудет установлено вsocket.SOCK_STREAM.Изменено в версии 3.9: Добавлен протокол CAN_J1939.
Изменено в версии 3.10: Добавлен протокол IPPROTO_MPTCP.
Объекты сокетов имеют следующие методы. За исключением
makefile(), они соответствуют системным вызовам Unix, применимым к сокетам.Изменено в версии 3.2: Добавлена поддержка протокола менеджера контекста. Выход из менеджера контекста равносилен вызову
close().-
accept() -
Принимает соединение. Сокет должен быть привязан к адресу и ожидать входящих соединений. Возвращаемое значение — пара
(conn, address), где conn — новый объект сокета, который можно использовать для отправки и получения данных в рамках соединения, а address — адрес, к которому привязан сокет на другом конце соединения.Созданный сокет является не наследуемым.
Изменено в версии 3.4: Теперь сокет не наследуется.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение
InterruptedError(обоснование см. в PEP 475).
-
bind(address) -
Привязывает сокет к адресу address. Сокет ещё не должен быть привязан. Формат address зависит от семейства адресов — см. Семейства сокетов.
Вызывает событие аудита
socket.bindс аргументамиself,address.Доступность: недоступно в WASI.
-
close() -
Помечает сокет как закрытый. Нижележащий системный ресурс (например, файловый дескриптор) также закрывается, когда закрыты все файловые объекты, созданные с помощью
makefile(). После этого все дальнейшие операции с объектом сокета завершатся ошибкой. Удалённый конец больше не будет получать данные (после отправки данных, находящихся в очереди).Сокеты автоматически закрываются при сборке мусора, но рекомендуется закрывать их явно с помощью
close()или использовать для них операторwith.Изменено в версии 3.6: Теперь вызывается
OSError, если при выполнении нижележащего вызоваclose()возникает ошибка.Примечание
close()освобождает ресурс, связанный с соединением, но не обязательно немедленно закрывает само соединение. Чтобы закрыть соединение без задержки, вызовитеshutdown()передclose().
-
connect(address) -
Подключается к удалённому сокету по адресу address. Формат address зависит от семейства адресов — см. Семейства сокетов.
Если соединение прерывается сигналом, метод ожидает его установления или при истечении времени ожидания вызывает
TimeoutError, если обработчик сигнала не вызывает исключение, а сокет является блокирующим или для него установлен тайм-аут. Для неблокирующих сокетов метод вызывает исключениеInterruptedError, если соединение прерывается сигналом (или исключение, вызванное обработчиком сигнала).Вызывает событие аудита
socket.connectс аргументамиself,address.Изменено в версии 3.5: Теперь метод ожидает завершения соединения вместо того, чтобы вызывать исключение
InterruptedError, если соединение прерывается сигналом, обработчик сигнала не вызывает исключение, а сокет является блокирующим или для него установлен тайм-аут (обоснование см. в PEP 475).Доступность: недоступно в WASI.
-
connect_ex(address) -
Как
connect(address), но вместо вызова исключения при ошибках, возвращённых вызовомconnect()на уровне C, возвращает индикатор ошибки (другие проблемы, например «узел не найден», всё ещё могут приводить к исключениям). Если операция выполнена успешно, индикатор ошибки равен0; в противном случае возвращается значение переменнойerrno. Это полезно, например, для поддержки асинхронных подключений.Вызывает событие аудита
socket.connectс аргументамиself,address.Доступность: недоступно в WASI.
-
detach() -
Переводит объект сокета в закрытое состояние, фактически не закрывая нижележащий файловый дескриптор. Файловый дескриптор возвращается и может быть использован для других целей.
Добавлено в версии 3.2.
-
dup() -
Создаёт копию сокета.
Созданный сокет является не наследуемым.
Изменено в версии 3.4: Теперь сокет не наследуется.
Доступность: недоступно в WASI.
-
fileno() -
Возвращает файловый дескриптор сокета (небольшое целое число) или -1 в случае сбоя. Это полезно при использовании с
select.select().В Windows небольшое целое число, возвращаемое этим методом, нельзя использовать там, где допустим файловый дескриптор (например, в
os.fdopen()). В Unix такого ограничения нет.
-
get_inheritable() -
Возвращает флаг наследования файлового дескриптора или дескриптора сокета:
True, если сокет может наследоваться дочерними процессами, иFalse, если не может.Добавлено в версии 3.4.
-
getpeername() -
Возвращает удалённый адрес, к которому подключён сокет. Например, это полезно, чтобы узнать номер порта удалённого сокета IPv4/v6. Формат возвращаемого адреса зависит от семейства адресов — см. Семейства сокетов. В некоторых системах эта функция не поддерживается.
-
getsockname() -
Возвращает собственный адрес сокета. Например, это полезно, чтобы узнать номер порта сокета IPv4/v6. Формат возвращаемого адреса зависит от семейства адресов — см. Семейства сокетов.
-
getsockopt(level, optname[, buflen]) -
Возвращает значение заданной опции сокета (см. страницу руководства Unix getsockopt(2)). Необходимые символьные константы (SO_* и т. д.) определены в этом модуле. Если buflen не задан, предполагается, что опция целочисленная, и функция возвращает её целочисленное значение. Если buflen задан, он указывает максимальную длину буфера, используемого для получения опции; этот буфер возвращается как объект bytes. Вызывающий код должен самостоятельно декодировать содержимое буфера (способ декодирования структур C, закодированных в виде байтовых строк, см. в необязательном встроенном модуле
struct).Доступность: недоступно в WASI.
-
getblocking() -
Возвращает
True, если сокет работает в блокирующем режиме, иFalse, если в неблокирующем.Это эквивалентно проверке
socket.gettimeout() != 0.Добавлено в версии 3.7.
-
gettimeout() -
Возвращает тайм-аут в секундах (число с плавающей точкой), установленный для операций с сокетом, или
None, если тайм-аут не задан. Значение соответствует последнему вызовуsetblocking()илиsettimeout().
-
ioctl(control, option) -
Метод
ioctl()предоставляет ограниченный интерфейс к системному интерфейсу WSAIoctl. Дополнительную информацию см. в документации Win32.На других платформах можно использовать универсальные функции
fcntl.fcntl()иfcntl.ioctl(); они принимают объект сокета в качестве первого аргумента.В настоящее время поддерживаются только следующие управляющие коды:
SIO_RCVALL,SIO_KEEPALIVE_VALSиSIO_LOOPBACK_FAST_PATH.Доступность: Windows
Изменено в версии 3.6: Добавлен
SIO_LOOPBACK_FAST_PATH.
-
listen([backlog]) -
Позволяет серверу принимать соединения. Если указан backlog, он должен быть не меньше 0 (если значение меньше, оно устанавливается равным 0); он задаёт количество непринятых соединений, которое система допускает до отказа принимать новые соединения. Если значение не указано, выбирается разумное значение по умолчанию.
Доступность: недоступно в WASI.
Изменено в версии 3.5: Параметр backlog теперь необязателен.
-
makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None) -
Возвращает файловый объект, связанный с сокетом. Точный тип возвращаемого объекта зависит от аргументов, переданных в
makefile(). Эти аргументы интерпретируются так же, как и встроенной функциейopen(), за исключением того, что поддерживаются только следующие значения mode:'r'(по умолчанию),'w','b'или их сочетание.Сокет должен работать в блокирующем режиме; для него может быть установлен тайм-аут, но при его срабатывании внутренний буфер файлового объекта может оказаться в несогласованном состоянии.
Закрытие файлового объекта, возвращённого
makefile(), не закроет исходный сокет, если не закрыты все остальные файловые объекты и для объекта сокета не был вызванsocket.close().Примечание
В Windows файловый объект, созданный с помощью
makefile(), нельзя использовать там, где требуется файловый объект с файловым дескриптором, например в аргументах потоковsubprocess.Popen().
-
recv(bufsize[, flags]) -
Получает данные из сокета. Возвращаемое значение — объект bytes, содержащий полученные данные. Максимальный объём данных, получаемых за один раз, задаётся параметром bufsize. Пустой возвращаемый объект bytes означает, что клиент отключился. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию он равен нулю.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение
InterruptedError(обоснование см. в PEP 475).
-
recvfrom(bufsize[, flags]) -
Получает данные из сокета. Возвращаемое значение — пара
(bytes, address), где bytes — объект bytes, содержащий полученные данные, а address — адрес сокета, отправившего данные. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию он равен нулю. Формат address зависит от семейства адресов — см. Семейства сокетов.Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение
InterruptedError(обоснование см. в PEP 475).Изменено в версии 3.7: Для многоадресного IPv6-адреса первый элемент address больше не содержит часть
%scope_id. Чтобы получить полный IPv6-адрес, используйтеgetnameinfo().
-
recvmsg(bufsize[, ancbufsize[, flags]]) -
Получает обычные данные (до bufsize байт) и вспомогательные данные из сокета. Аргумент ancbufsize задаёт размер в байтах внутреннего буфера, используемого для получения вспомогательных данных; по умолчанию он равен 0, то есть вспомогательные данные не получаются. Подходящие размеры буфера для вспомогательных данных можно вычислить с помощью
CMSG_SPACE()илиCMSG_LEN(); элементы, не помещающиеся в буфер, могут быть усечены или отброшены. По умолчанию аргумент flags равен 0; он имеет то же значение, что и дляrecv().Возвращаемое значение — кортеж из 4 элементов:
(data, ancdata, msg_flags, address). Элемент data — объектbytes, содержащий полученные данные, не относящиеся к вспомогательным. Элемент ancdata — список из нуля или более кортежей(cmsg_level, cmsg_type, cmsg_data), представляющих полученные вспомогательные данные (управляющие сообщения): cmsg_level и cmsg_type — целые числа, задающие соответственно уровень протокола и тип, специфичный для протокола, а cmsg_data — объектbytes, содержащий связанные с ними данные. Элемент msg_flags — побитовое ИЛИ различных флагов, указывающих на условия получения сообщения; подробности см. в документации вашей системы. Если принимающий сокет не подключён, address содержит адрес отправляющего сокета, если он доступен; в противном случае его значение не определено.В некоторых системах
sendmsg()иrecvmsg()позволяют передавать файловые дескрипторы между процессами через сокетAF_UNIX. При использовании этой возможности (она часто ограничена сокетамиSOCK_STREAM)recvmsg()возвращает во вспомогательных данных элементы вида(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds), где fds — объектbytes, представляющий новые файловые дескрипторы в виде двоичного массива элементов нативного типа C int. Еслиrecvmsg()вызывает исключение после возврата системного вызова, сначала будет предпринята попытка закрыть все файловые дескрипторы, полученные этим способом.Некоторые системы не сообщают длину усечённых вспомогательных данных, полученных лишь частично. Если какой-либо элемент, судя по всему, выходит за пределы буфера,
recvmsg()выдаст предупреждениеRuntimeWarningи вернёт ту его часть, которая помещается в буфер, если только элемент не был усечён до начала связанных с ним данных.В системах, поддерживающих механизм
SCM_RIGHTS, следующая функция получит до maxfds файловых дескрипторов и вернёт данные сообщения и список с дескрипторами (игнорируя неожиданные ситуации, например получение посторонних управляющих сообщений). См. такжеsendmsg().import socket, array def recv_fds(sock, msglen, maxfds): fds = array.array("i") # Array of ints msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize)) for cmsg_level, cmsg_type, cmsg_data in ancdata: if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS: # Append data, ignoring any truncated integers at the end. fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) return msg, list(fds)Доступность: Unix.
Большинство платформ Unix.
Добавлено в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение
InterruptedError(обоснование см. в PEP 475).
-
recvmsg_into(buffers[, ancbufsize[, flags]]) -
Получает обычные и вспомогательные данные из сокета, работая так же, как
recvmsg(), но распределяет данные, не относящиеся к вспомогательным, по нескольким буферам вместо возврата нового объекта bytes. Аргумент buffers должен быть итерируемым объектом, элементы которого предоставляют доступные для записи буферы (например, объектамиbytearray); эти буферы заполняются последовательными фрагментами обычных данных, пока все данные не будут записаны или не закончатся буферы. Операционная система может ограничивать число используемых буферов (значениемsysconf()SC_IOV_MAX). Аргументы ancbufsize и flags имеют то же значение, что и дляrecvmsg().Возвращаемое значение — кортеж из 4 элементов:
(nbytes, ancdata, msg_flags, address), где nbytes — общее количество байтов обычных данных, записанных в буферы, а ancdata, msg_flags и address имеют то же значение, что и вrecvmsg().Пример:
>>> import socket >>> s1, s2 = socket.socketpair() >>> b1 = bytearray(b'----') >>> b2 = bytearray(b'0123456789') >>> b3 = bytearray(b'--------------') >>> s1.send(b'Mary had a little lamb') 22 >>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3]) (22, [], 0, None) >>> [b1, b2, b3] [bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]
Доступность: Unix.
Большинство платформ Unix.
Добавлено в версии 3.3.
-
recvfrom_into(buffer[, nbytes[, flags]]) -
Получает данные из сокета и записывает их в buffer, не создавая новую байтовую строку. Возвращаемое значение — пара
(nbytes, address), где nbytes — количество полученных байтов, а address — адрес сокета, отправившего данные. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию он равен нулю. Формат address зависит от семейства адресов — см. Семейства сокетов.
-
-
recv_into(buffer[, nbytes[, flags]]) -
Получает из сокета не более nbytes байт и сохраняет данные в буфер, а не создаёт новую байтовую строку. Если nbytes не задано (или равно 0), получает не более объёма данных, доступного в указанном буфере. Возвращает количество полученных байт. О значении необязательного аргумента flags см. страницу руководства Unix recv(2); по умолчанию он равен нулю.
-
send(bytes[, flags]) -
Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и для
recv(). Возвращает количество отправленных байт. Приложения отвечают за проверку того, что все данные отправлены; если передана только часть данных, приложению необходимо попытаться доставить оставшиеся данные. Дополнительные сведения см. в руководстве по программированию сокетов.Изменено в версии 3.5: Если системный вызов прерван, а обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо вызова исключения
InterruptedError(обоснование см. в PEP 475).
-
sendall(bytes[, flags]) -
Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и для
recv(). В отличие отsend(), этот метод продолжает отправлять данные из bytes, пока не будут отправлены все данные или не произойдёт ошибка. В случае успеха возвращаетсяNone. При ошибке вызывается исключение, и определить, сколько данных, если вообще сколько-нибудь, было успешно отправлено, невозможно.Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается после каждой успешной отправки данных. Теперь тайм-аут сокета задаёт максимальную общую продолжительность отправки всех данных.
Изменено в версии 3.5: Если системный вызов прерван, а обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо вызова исключения
InterruptedError(обоснование см. в PEP 475).
-
sendto(bytes, address) - sendto(bytes, flags, address)
-
Отправляет данные в сокет. Сокет не должен быть подключён к удалённому сокету, поскольку адрес сокета назначения задаётся аргументом address. Необязательный аргумент flags имеет то же значение, что и для
recv(). Возвращает количество отправленных байт. Формат address зависит от семейства адресов — см. Семейства сокетов.Вызывает событие аудита
socket.sendtoс аргументамиself,address.Изменено в версии 3.5: Если системный вызов прерван, а обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо вызова исключения
InterruptedError(обоснование см. в PEP 475).
-
sendmsg(buffers[, ancdata[, flags[, address]]]) -
Отправляет обычные и вспомогательные данные в сокет, собирая обычные данные из последовательности буферов и объединяя их в одно сообщение. Аргумент buffers задаёт обычные данные как итерируемый объект из объектов, подобных bytes (например, объектов
bytes); операционная система может ограничить (sysconf(), значениеSC_IOV_MAX) количество используемых буферов. Аргумент ancdata задаёт вспомогательные данные (управляющие сообщения) как итерируемый объект с нулём или более кортежей(cmsg_level, cmsg_type, cmsg_data), где cmsg_level и cmsg_type — целые числа, задающие соответственно уровень протокола и тип, специфичный для протокола, а cmsg_data — объект, подобный bytes, содержащий связанные данные. Обратите внимание, что некоторые системы (в частности, системы безCMSG_SPACE()) могут поддерживать отправку только одного управляющего сообщения за вызов. Аргумент flags по умолчанию равен 0 и имеет то же значение, что и дляsend(). Если аргумент address задан и не равенNone, он задаёт адрес назначения сообщения. Возвращаемое значение — количество отправленных байт обычных данных.Следующая функция отправляет список файловых дескрипторов fds через сокет
AF_UNIXв системах, поддерживающих механизмSCM_RIGHTS. См. такжеrecvmsg().import socket, array def send_fds(sock, msg, fds): return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])Доступность: Unix, кроме WASI.
Большинство платформ Unix.
Вызывает событие аудита
socket.sendmsgс аргументамиself,address.Добавлено в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерван, а обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо вызова исключения
InterruptedError(обоснование см. в PEP 475).
-
sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]]) -
Специализированная версия
sendmsg()для сокетаAF_ALG. Задаёт режим, IV, длину связанных данных AEAD и флаги для сокетаAF_ALG.Доступность: Linux >= 2.6.38.
Добавлено в версии 3.6.
-
sendfile(file, offset=0, count=None) -
Отправляет файл до достижения EOF, используя высокопроизводительную функцию
os.sendfile, и возвращает общее количество отправленных байт. file должен быть обычным файловым объектом, открытым в двоичном режиме. Еслиos.sendfileнедоступна (например, в Windows) или file не является обычным файлом, вместо неё будет использоватьсяsend(). offset указывает, с какого места начать чтение файла. Если задан аргумент count, он определяет общее количество байт для передачи, вместо отправки файла до достижения EOF. При возврате позиция в файле обновляется; она обновляется и в случае ошибки, и тогда для определения количества отправленных байт можно использоватьfile.tell(). Сокет должен иметь типSOCK_STREAM. Неблокирующие сокеты не поддерживаются.Добавлено в версии 3.5.
-
set_inheritable(inheritable) -
Устанавливает флаг наследования файлового дескриптора или дескриптора сокета.
Добавлено в версии 3.4.
-
setblocking(flag) -
Устанавливает для сокета блокирующий или неблокирующий режим: если flag имеет значение false, сокет переводится в неблокирующий режим, в противном случае — в блокирующий.
Этот метод является сокращённой записью для некоторых вызовов
settimeout():-
sock.setblocking(True)эквивалентноsock.settimeout(None) -
sock.setblocking(False)эквивалентноsock.settimeout(0.0)
Изменено в версии 3.7: Метод больше не устанавливает флаг
SOCK_NONBLOCKдляsocket.type. -
-
settimeout(value) -
Устанавливает тайм-аут для блокирующих операций с сокетом. Аргумент value может быть неотрицательным вещественным числом, задающим секунды, или
None. Если задано ненулевое значение, последующие операции с сокетом вызовут исключениеtimeout, если до завершения операции истечёт период тайм-аута value. Если задано нулевое значение, сокет переводится в неблокирующий режим. Если заданоNone, сокет переводится в блокирующий режим.Дополнительные сведения см. в примечаниях о тайм-аутах сокетов.
Изменено в версии 3.7: Метод больше не переключает флаг
SOCK_NONBLOCKдляsocket.type.
-
setsockopt(level, optname, value: int | Buffer) - setsockopt(level, optname, None, optlen: int)
-
Устанавливает значение указанной опции сокета (см. страницу руководства Unix setsockopt(2)). Необходимые символьные константы определены в этом модуле (SO_* и т. д. <socket-unix-constants>). Значение может быть целым числом,
Noneили объектом, подобным bytes, представляющим буфер. В последнем случае вызывающий код должен обеспечить, чтобы байтовая строка содержала правильные биты (способ кодирования структур C в байтовые строки см. в необязательном встроенном модулеstruct). Если для value заданоNone, необходимо указать аргумент optlen. Это эквивалентно вызову функции Csetsockopt()сoptval=NULLиoptlen=optlen.Изменено в версии 3.5: Теперь допускается записываемый объект, подобный bytes.
Изменено в версии 3.6: Добавлена форма setsockopt(level, optname, None, optlen: int).
Доступность: кроме WASI.
-
shutdown(how) -
Завершает работу одной или обеих сторон соединения. Если how имеет значение
SHUT_RD, дальнейший приём данных запрещён. Если how имеет значениеSHUT_WR, дальнейшая отправка данных запрещена. Если how имеет значениеSHUT_RDWR, дальнейшие отправка и приём данных запрещены.Доступность: кроме WASI.
-
Создаёт копию сокета и подготавливает её для совместного использования с целевым процессом. Необходимо указать process_id целевого процесса. Полученный объект bytes можно передать целевому процессу с помощью какого-либо механизма межпроцессного взаимодействия, а затем воссоздать там сокет с помощью
fromshare(). После вызова этого метода сокет можно безопасно закрыть, поскольку операционная система уже создала его копию для целевого процесса.Доступность: Windows.
Добавлено в версии 3.3.
Обратите внимание, что методов
read()иwrite()нет; вместо них используйтеrecv()иsend()без аргумента flags.У объектов socket также есть следующие атрибуты (только для чтения), соответствующие значениям, переданным конструктору
socket.-
family -
Семейство сокета.
-
type -
Тип сокета.
-
proto -
Протокол сокета.
-
-
class socket.SocketType -
Базовый класс типа
socket, повторно экспортируемый из_socket. Проверка экземпляра, напримерisinstance(socket(...), SocketType), возвращает true, ноSocketType— не то же самое, чтоtype(socket(...)), которым является самsocket.
Примечания о тайм-аутах сокетов
Объект socket может находиться в одном из трёх режимов: блокирующем, неблокирующем или с тайм-аутом. По умолчанию сокеты всегда создаются в блокирующем режиме, но это можно изменить, вызвав setdefaulttimeout().
- В блокирующем режиме операции блокируются до завершения или до возврата системой ошибки (например, тайм-аута соединения).
- В неблокирующем режиме операции завершаются с ошибкой (которая, к сожалению, зависит от системы), если их нельзя выполнить немедленно: функции модуля
selectможно использовать, чтобы узнать, доступен ли сокет для чтения или записи и когда именно. - В режиме с тайм-аутом операции завершаются с ошибкой, если их нельзя выполнить в течение указанного для сокета тайм-аута (вызывается исключение
timeout) или если система возвращает ошибку.
Примечание
На уровне операционной системы сокеты в режиме с тайм-аутом внутренне переводятся в неблокирующий режим. Кроме того, блокирующий режим и режим с тайм-аутом являются общими для файловых дескрипторов и объектов socket, ссылающихся на одну и ту же сетевую конечную точку. Эта особенность реализации может иметь видимые последствия, если, например, вы решите использовать fileno() сокета.
Тайм-ауты и метод connect
На операцию connect() также распространяется настройка тайм-аута. В общем случае рекомендуется вызвать settimeout() перед вызовом connect() или передать параметр тайм-аута в create_connection(). Однако сетевой стек системы также может самостоятельно вернуть ошибку тайм-аута соединения независимо от настроек тайм-аута сокетов Python.
Тайм-ауты и метод accept
Если getdefaulttimeout() не равен None, сокеты, возвращаемые методом accept(), наследуют этот тайм-аут. В противном случае поведение зависит от настроек слушающего сокета:
- если слушающий сокет работает в блокирующем режиме или в режиме с тайм-аутом, сокет, возвращаемый
accept(), работает в блокирующем режиме; - если слушающий сокет работает в неблокирующем режиме, выбор между блокирующим и неблокирующим режимом для сокета, возвращаемого
accept(), зависит от операционной системы. Для обеспечения единообразного поведения на разных платформах рекомендуется вручную переопределить эту настройку.
Пример
Ниже приведены четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который возвращает все полученные данные (обслуживая только одного клиента), и клиент, использующий этот сервер. Обратите внимание: сервер должен выполнить последовательность socket(), bind(), listen(), accept() (возможно, повторяя accept() для обслуживания нескольких клиентов), тогда как клиенту достаточно последовательности socket(), connect(). Также обратите внимание: сервер вызывает sendall()/recv() не для слушающего сокета, а для нового сокета, возвращённого accept().
Первые два примера поддерживают только IPv4.
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
# Echo client program
import socket
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Следующие два примера идентичны предыдущим, но поддерживают как IPv4, так и IPv6. Сервер будет слушать адрес первого доступного семейства адресов (вместо этого ему следовало бы слушать оба). В большинстве систем с поддержкой IPv6 приоритет будет у IPv6, поэтому сервер может не принимать трафик IPv4. Клиент попытается подключиться ко всем адресам, полученным в результате разрешения имени, и отправит трафик по первому адресу, с которым удалось установить соединение.
# Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.send(data)
# Echo client program
import socket
import sys
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.connect(sa)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
with s:
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
В следующем примере показано, как написать очень простой сетевой анализатор с использованием raw-сокетов в Windows. Для изменения интерфейса примеру требуются права администратора:
import socket # the public network interface HOST = socket.gethostbyname(socket.gethostname()) # create a raw socket and bind it to the public interface s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) s.bind((HOST, 0)) # Include IP headers s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # receive all packets s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) # receive a packet print(s.recvfrom(65565)) # disabled promiscuous mode s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
В следующем примере показано, как использовать интерфейс сокетов для взаимодействия с сетью CAN с помощью протокола raw-сокетов. Чтобы вместо этого использовать CAN с протоколом диспетчера широковещательной рассылки, откройте сокет следующим образом:
socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
После привязки (CAN_RAW) или подключения (CAN_BCM) сокета можно, как обычно, использовать для объекта socket операции socket.send() и socket.recv() (и соответствующие им операции).
Для последнего примера могут потребоваться специальные привилегии:
import socket
import struct
# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)
can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)
def build_can_frame(can_id, data):
can_dlc = len(data)
data = data.ljust(8, b'\x00')
return struct.pack(can_frame_fmt, can_id, can_dlc, data)
def dissect_can_frame(frame):
can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
return (can_id, can_dlc, data[:can_dlc])
# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))
while True:
cf, addr = s.recvfrom(can_frame_size)
print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))
try:
s.send(cf)
except OSError:
print('Error sending CAN frame')
try:
s.send(build_can_frame(0x01, b'\x01\x02\x03'))
except OSError:
print('Error sending CAN frame')
Повторный запуск примера с недостаточной задержкой между запусками может привести к этой ошибке:
OSError: [Errno 98] Address already in use
Это происходит потому, что после предыдущего запуска сокет остался в состоянии TIME_WAIT и его нельзя использовать повторно немедленно.
Чтобы предотвратить это, необходимо установить флаг socket: socket.SO_REUSEADDR:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT))
флаг SO_REUSEADDR сообщает ядру, что нужно повторно использовать локальный сокет в состоянии TIME_WAIT, не дожидаясь истечения естественного тайм-аута.
См. также
Введение в программирование сокетов (на C) см. в следующих статьях:
- Вводное руководство по межпроцессному взаимодействию в 4.3BSD, Стюарт Секрест
- Расширенное руководство по межпроцессному взаимодействию в 4.3BSD, Сэмюэл Дж. Леффлер и др.,
обе статьи опубликованы в UNIX Programmer’s Manual, Supplementary Documents 1 (разделы PS1:7 и PS1:8). Справочные материалы, относящиеся к конкретным платформам и посвящённые различным системным вызовам, связанным с сокетами, также служат ценным источником информации о семантике сокетов. Для Unix см. страницы руководства; для Windows — спецификацию WinSock (или Winsock 2). Тем, кто работает с API, поддерживающими IPv6, может быть полезен документ RFC 3493 под названием «Расширения базового интерфейса сокетов для IPv6».
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/socket.html