socket — Низкоуровневый сетевой интерфейс
Исходный код: Lib/socket.py
Этот модуль предоставляет доступ к интерфейсу сокетов BSD. Он доступен во всех современных системах 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. В методах модуляsocketпараметры flowinfo и scope_id можно опустить для обратной совместимости. Однако учтите, что пропуск scope_id может вызвать проблемы при работе с адресами IPv6 с областью действия.Изменено в версии 3.7: Для многоадресных адресов (для которых имеет значение scope_id) address может не содержать часть
%scope_id(илиzone id). Эта информация избыточна и может быть безопасно опущена (рекомендуется). -
Сокеты
AF_NETLINKпредставляются парами(pid, groups). -
В Linux доступна поддержка TIPC с использованием семейства адресов
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), гдеbdaddr— Bluetooth-адрес в виде строки, аpsm— целое число. -
BTPROTO_RFCOMMпринимает(bdaddr, channel), гдеbdaddr— Bluetooth-адрес в виде строки, аchannel— целое число. -
BTPROTO_HCIпринимает формат, зависящий от вашей ОС.- В Linux принимается кортеж
(device_id,), гдеdevice_id— целое число, указывающее номер устройства Bluetooth. - В FreeBSD, NetBSD и DragonFly BSD принимается
bdaddr, гдеbdaddr— Bluetooth-адрес в виде строки.
Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.
Изменено в версии 3.13.3: Добавлена поддержка FreeBSD.
- В Linux принимается кортеж
-
BTPROTO_SCOпринимаетbdaddr, гдеbdaddr— Bluetooth-адрес в виде строки или объектbytes(например,'12:23:34:45:56:67'илиb'12:23:34:45:56:67'). Этот протокол не поддерживается в 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 C API, включаяgethostbyname_ex()иgethostbyaddr(). Сопутствующее значение — пара(h_errno, string), представляющая ошибку, возвращённую вызовом библиотеки. h_errno — числовое значение, а string содержит описание h_errno, возвращённое функциейhstrerror()языка C.Изменено в версии 3.3: Этот класс стал подклассом
OSError.
-
exception socket.gaierror -
Подкласс
OSError. Это исключение возникает при ошибках, связанных с адресами, в функцияхgetaddrinfo()иgetnameinfo(). Сопутствующее значение — пара(error, string), представляющая ошибку, возвращённую вызовом библиотеки. string содержит описание error, возвращённое функциейgai_strerror()языка C. Числовое значение 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: В Windows
TCP_FASTOPEN,TCP_KEEPCNTдоступны, если это поддерживается средой выполнения Windows.Изменено в версии 3.7: Добавлена
TCP_NOTSENT_LOWAT.В Windows
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, но вместо имени указывается индекс сетевого интерфейса.
-
socket.AF_CAN -
socket.PF_CAN - SOL_CAN_*
- CAN_*
-
В модуле socket также определено множество констант этих форм, описанных в документации Linux.
Доступность: Linux >= 2.6.25, NetBSD >= 8.
Добавлено в версии 3.3.
Изменено в версии 3.11: Добавлена поддержка NetBSD.
Изменено в версии 3.13.4: В 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 и соответствующие константам, экспортируемым C API сокетов. Дополнительную информацию см. в документации 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.BDADDR_ANY -
socket.BDADDR_LOCAL -
Это строковые константы, содержащие адреса Bluetooth со специальным значением. Например,
BDADDR_ANYможно использовать для обозначения любого адреса при привязке сокета с помощьюBTPROTO_RFCOMM.
-
socket.HCI_FILTER -
socket.HCI_TIME_STAMP -
socket.HCI_DATA_DIR -
Используются с
BTPROTO_HCI.HCI_FILTERдоступна только в Linux и FreeBSD.HCI_TIME_STAMPиHCI_DATA_DIRдоступны только в Linux.
-
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 -
Константа для оптимизации локальности процессора; используется совместно с
SO_REUSEPORT.Добавлено в версии 3.11.
Доступность: Linux >= 3.9
-
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.
Функции
Создание сокетов
Все следующие функции создают объекты сокетов.
-
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: При передаче битовых флагов
SOCK_NONBLOCKилиSOCK_CLOEXECв type они сбрасываются, и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.
-
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-службе, прослушивающей интернет-адрес address (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-сокет, привязанный к адресу address (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, чтобы сразу повторно использовать предыдущие сокеты, привязанные к тому же адресу address и оставшиеся в состоянии 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.SocketType -
Это объект типа Python, представляющий тип объекта сокета. Он совпадает с
type(socket(...)).
Другие функции
Модуль 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, если аргумент flags содержитAI_CANONNAME; в противном случае canonname будет пустым. sockaddr — это кортеж с описанием адреса сокета; его формат зависит от возвращаемого значения family (кортеж из(address, port)2 элементов дляAF_INET, кортеж из(address, port, flowinfo, scope_id)4 элементов для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(). Обычно это требуется только для сокетов, открытых в режиме «raw» (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. ИсключениеOSErrorвызывается при ошибках во время вызоваinet_ntop().Доступность: 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.
Примечание
Любые усечённые целые числа в конце списка файловых дескрипторов.
Объекты сокетов
Объекты сокетов имеют следующие методы. За исключением makefile(), они соответствуют системным вызовам Unix, применимым к сокетам.
Изменено в версии 3.2: Добавлена поддержка протокола менеджера контекста. Выход из менеджера контекста равносилен вызову close().
-
socket.accept() -
Принять соединение. Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение — пара
(conn, address), где conn — новый объект сокета, который можно использовать для отправки и получения данных через соединение, а address — адрес, привязанный к сокету на другом конце соединения.Созданный сокет является не наследуемым.
Изменено в версии 3.4: Теперь сокет не является наследуемым.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не возбуждает исключение, метод теперь повторяет системный вызов вместо возбуждения исключения
InterruptedError(обоснование см. в PEP 475).
-
socket.bind(address) -
Привязать сокет к адресу address. Сокет не должен быть уже привязан. (Формат address зависит от семейства адресов — см. выше.)
Вызывает событие аудита
socket.bindс аргументамиself,address.Доступность: кроме WASI.
-
socket.close() -
Пометить сокет как закрытый. Соответствующий системный ресурс (например, файловый дескриптор) также закрывается, когда закрыты все файловые объекты, созданные с помощью
makefile(). После этого все последующие операции с объектом сокета завершатся ошибкой. Удалённая сторона больше не получит данных (после отправки данных, находящихся в очереди).Сокеты автоматически закрываются при сборке мусора, однако рекомендуется явно
close()их или использовать для них операторwith.Изменено в версии 3.6: Если при выполнении нижележащего вызова
close()возникает ошибка, теперь возбуждаетсяOSError.Примечание
close()освобождает ресурс, связанный с соединением, но не обязательно сразу закрывает само соединение. Чтобы закрыть соединение без задержки, вызовитеshutdown()передclose().
-
socket.connect(address) -
Подключиться к удалённому сокету по адресу address. (Формат address зависит от семейства адресов — см. выше.)
Если соединение прерывается сигналом, метод ожидает завершения соединения или при истечении времени ожидания возбуждает
TimeoutError, если обработчик сигнала не возбуждает исключение, а сокет является блокирующим или для него задано время ожидания. Для неблокирующих сокетов метод возбуждает исключениеInterruptedError, если соединение прерывается сигналом (или исключение, возбужденное обработчиком сигнала).Вызывает событие аудита
socket.connectс аргументамиself,address.Изменено в версии 3.5: Если соединение прерывается сигналом, обработчик сигнала не возбуждает исключение, а сокет является блокирующим или для него задано время ожидания, метод теперь ожидает завершения соединения, а не возбуждает исключение
InterruptedError(обоснование см. в PEP 475).Доступность: кроме WASI.
-
socket.connect_ex(address) -
Подобно
connect(address), но вместо возбуждения исключения при ошибках, возвращённых вызовомconnect()на уровне C, возвращает индикатор ошибки (при других проблемах, например «узел не найден», исключения всё ещё могут возбуждаться). Индикатор ошибки равен0, если операция выполнена успешно, в противном случае он содержит значение переменнойerrno. Это полезно, например, для поддержки асинхронных подключений.Вызывает событие аудита
socket.connectс аргументамиself,address.Доступность: кроме WASI.
-
socket.detach() -
Перевести объект сокета в закрытое состояние, фактически не закрывая нижележащий файловый дескриптор. Файловый дескриптор возвращается и может быть повторно использован для других целей.
Добавлено в версии 3.2.
-
socket.dup() -
Создать копию сокета.
Созданный сокет является не наследуемым.
Изменено в версии 3.4: Теперь сокет не является наследуемым.
Доступность: кроме WASI.
-
socket.fileno() -
Вернуть файловый дескриптор сокета (небольшое целое число) или -1 в случае ошибки. Это полезно при использовании с
select.select().В Windows небольшое целое число, возвращаемое этим методом, нельзя использовать там, где можно использовать файловый дескриптор (например, с
os.fdopen()). В Unix такого ограничения нет.
-
socket.get_inheritable() -
Получить флаг наследования файлового дескриптора или дескриптора сокета:
True, если сокет может наследоваться дочерними процессами,False, если не может.Добавлено в версии 3.4.
-
socket.getpeername() -
Вернуть адрес удалённой стороны, к которой подключён сокет. Это полезно, например, для определения номера порта удалённого сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов — см. выше.) В некоторых системах эта функция не поддерживается.
-
socket.getsockname() -
Вернуть собственный адрес сокета. Это полезно, например, для определения номера порта сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов — см. выше.)
-
socket.getsockopt(level, optname[, buflen]) -
Вернуть значение заданного параметра сокета (см. страницу руководства Unix getsockopt(2)). Необходимые символьные константы (SO_* и т. д.) определены в этом модуле. Если buflen не указан, предполагается, что параметр является целочисленным, и функция возвращает его целочисленное значение. Если указан buflen, он задаёт максимальную длину буфера, используемого для получения параметра, и этот буфер возвращается как объект bytes. Вызывающая сторона должна декодировать содержимое буфера (способ декодирования структур C, закодированных в виде байтовых строк, описан в необязательном встроенном модуле
struct).Доступность: кроме WASI.
-
socket.getblocking() -
Вернуть
True, если сокет работает в блокирующем режиме, иFalse, если в неблокирующем.Это эквивалентно проверке
socket.gettimeout() != 0.Добавлено в версии 3.7.
-
socket.gettimeout() -
Вернуть время ожидания в секундах (число с плавающей запятой), заданное для операций с сокетом, или
None, если время ожидания не задано. Это значение соответствует последнему вызовуsetblocking()илиsettimeout().
-
socket.ioctl(control, option) -
- Платформа:
-
Windows
Метод
ioctl()предоставляет ограниченный интерфейс к системному интерфейсу WSAIoctl. Дополнительные сведения см. в документации Win32.На других платформах можно использовать универсальные функции
fcntl.fcntl()иfcntl.ioctl(); они принимают объект сокета в качестве первого аргумента.В настоящее время поддерживаются только следующие управляющие коды:
SIO_RCVALL,SIO_KEEPALIVE_VALSиSIO_LOOPBACK_FAST_PATH.Изменено в версии 3.6: Добавлен
SIO_LOOPBACK_FAST_PATH.
-
socket.listen([backlog]) -
Разрешить серверу принимать соединения. Если указан параметр backlog, его значение должно быть не меньше 0 (если оно меньше, ему присваивается 0); он задаёт количество не принятых соединений, которое система разрешит до отклонения новых соединений. Если параметр не указан, выбирается разумное значение по умолчанию.
Доступность: кроме WASI.
Изменено в версии 3.5: Параметр backlog теперь необязателен.
-
socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None) -
Вернуть файловый объект, связанный с сокетом. Точный тип возвращаемого объекта зависит от аргументов, переданных в
makefile(). Эти аргументы интерпретируются так же, как встроенной функциейopen(), за исключением того, что поддерживаются только следующие значения mode:'r'(по умолчанию),'w','b'или их комбинация.Сокет должен работать в блокирующем режиме; для него можно задать время ожидания, но при его истечении внутренний буфер файлового объекта может оказаться в несогласованном состоянии.
Закрытие файлового объекта, возвращённого
makefile(), не закроет исходный сокет, пока не будут закрыты все остальные файловые объекты и не будет вызванsocket.close()для объекта сокета.Примечание
В Windows файловоподобный объект, созданный с помощью
makefile(), нельзя использовать там, где требуется файловый объект с файловым дескриптором, например в аргументах потоковsubprocess.Popen().
-
socket.recv(bufsize[, flags]) -
Получить данные из сокета. Возвращаемое значение — объект bytes, содержащий полученные данные. Максимальный объём данных, получаемых за один раз, задаётся параметром bufsize. Возвращённый пустой объект bytes указывает на то, что клиент отключился. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию оно равно нулю.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не возбуждает исключение, метод теперь повторяет системный вызов вместо возбуждения исключения
InterruptedError(обоснование см. в PEP 475).
-
socket.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().
-
socket.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, представляющий новые файловые дескрипторы в виде двоичного массива элементов типа int языка C для данной платформы. Если после возврата системного вызова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).
-
socket.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.
-
socket.recvfrom_into(buffer[, nbytes[, flags]]) -
Получить данные из сокета и записать их в buffer, не создавая новую байтовую строку. Возвращаемое значение — пара
(nbytes, address), где nbytes — количество полученных байтов, а address — адрес сокета, отправившего данные. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию оно равно нулю. (Формат address зависит от семейства адресов — см. выше.)
-
socket.recv_into(buffer[, nbytes[, flags]]) -
Получить из сокета до nbytes байт, сохранив данные в буфере, а не создав новую байтовую строку. Если nbytes не указан (или равен 0), получить столько данных, сколько помещается в заданный буфер. Возвращает количество полученных байтов. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию оно равно нулю.
-
socket.send(bytes[, flags]) -
Отправить данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и описанный выше
recv(). Возвращает количество отправленных байтов. Приложения должны самостоятельно проверять, отправлены ли все данные; если передана только часть данных, приложение должно попытаться отправить оставшиеся данные. Дополнительные сведения по этой теме см. в документе HOWTO по программированию сокетов.Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не возбуждает исключение, метод теперь повторяет системный вызов вместо возбуждения исключения
InterruptedError(обоснование см. в PEP 475).
-
socket.sendall(bytes[, flags]) -
Отправить данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и описанный выше
recv(). В отличие отsend(), этот метод продолжает отправлять данные из bytes, пока все данные не будут отправлены или не произойдёт ошибка. При успешном выполнении возвращаетсяNone. В случае ошибки возбуждается исключение, и определить, какой объём данных, если таковые были, удалось отправить, невозможно.Изменено в версии 3.5: Время ожидания сокета больше не сбрасывается после каждой успешной отправки данных. Теперь оно задаёт максимальную общую длительность отправки всех данных.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не возбуждает исключение, метод теперь повторяет системный вызов вместо возбуждения исключения
InterruptedError(обоснование см. в PEP 475).
-
socket.sendto(bytes, address) - socket.sendto(bytes, flags, address)
-
Отправить данные в сокет. Сокет не должен быть подключён к удалённому сокету, поскольку целевой сокет указывается параметром address. Необязательный аргумент flags имеет то же значение, что и для приведённого выше метода
recv(). Возвращает количество отправленных байтов. (Формат address зависит от семейства адресов — см. выше.)Вызывает событие аудита
socket.sendtoс аргументамиself,address.Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение
InterruptedError(обоснование см. в PEP 475).
-
socket.sendmsg(buffers[, ancdata[, flags[, address]]]) -
Отправить обычные и вспомогательные данные в сокет, собрав обычные данные из нескольких буферов и объединив их в одно сообщение. Аргумент buffers задаёт обычные данные в виде итерируемого объекта, содержащего байтоподобные объекты (например, объекты
bytes); операционная система может установить ограничение (sysconf()со значениемSC_IOV_MAX) на количество используемых буферов. Аргумент ancdata задаёт вспомогательные данные (управляющие сообщения) в виде итерируемого объекта, содержащего ноль или более кортежей(cmsg_level, cmsg_type, cmsg_data), где cmsg_level и cmsg_type — целые числа, указывающие соответственно уровень протокола и тип, специфичный для протокола, а cmsg_data — байтоподобный объект, содержащий связанные данные. Обратите внимание, что некоторые системы (в частности, системы без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).
-
socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]]) -
Специализированная версия
sendmsg()для сокетаAF_ALG. Задать режим, IV, длину связанных данных AEAD и флаги для сокетаAF_ALG.Доступность: Linux >= 2.6.38.
Добавлено в версии 3.6.
-
socket.sendfile(file, offset=0, count=None) -
Отправить файл до достижения EOF, используя высокопроизводительный метод
os.sendfile, и вернуть общее количество отправленных байтов. file должен быть обычным файловым объектом, открытым в двоичном режиме. Еслиos.sendfileнедоступен (например, в Windows) или file не является обычным файлом, вместо него будет использоватьсяsend(). Параметр offset указывает, с какого места начать чтение файла. Если указан параметр count, он задаёт общее количество передаваемых байтов; в противном случае файл отправляется до достижения EOF. При возврате позиция файла обновляется; она также обновляется в случае ошибки. В таком случае с помощьюfile.tell()можно определить количество отправленных байтов. Сокет должен иметь типSOCK_STREAM. Неблокирующие сокеты не поддерживаются.Добавлено в версии 3.5.
-
socket.set_inheritable(inheritable) -
Установить флаг наследования для файлового дескриптора или дескриптора сокета.
Добавлено в версии 3.4.
-
socket.setblocking(flag) -
Установить для сокета блокирующий или неблокирующий режим: если flag имеет значение false, сокет переключается в неблокирующий режим, иначе — в блокирующий.
Этот метод является сокращённой записью для некоторых вызовов
settimeout():-
sock.setblocking(True)эквивалентноsock.settimeout(None) -
sock.setblocking(False)эквивалентноsock.settimeout(0.0)
Изменено в версии 3.7: Метод больше не применяет флаг
SOCK_NONBLOCKкsocket.type. -
-
socket.settimeout(value) -
Установить время ожидания для блокирующих операций с сокетом. Аргумент value может быть неотрицательным числом с плавающей точкой, задающим секунды, или
None. Если задано ненулевое значение, последующие операции с сокетом вызовут исключениеtimeout, если до завершения операции истечёт период ожидания value. Если задан 0, сокет переходит в неблокирующий режим. Если заданоNone, сокет переходит в блокирующий режим.Дополнительные сведения см. в примечаниях о времени ожидания сокетов.
Изменено в версии 3.7: Метод больше не переключает флаг
SOCK_NONBLOCKуsocket.type.
-
socket.setsockopt(level, optname, value: int)
- socket.setsockopt(level, optname, value: buffer)
- socket.setsockopt(level, optname, None, optlen: int)
-
Установить значение указанного параметра сокета (см. страницу руководства Unix setsockopt(2)). Необходимые символьные константы определены в этом модуле (SO_* и т. д. <socket-unix-constants>). Значением может быть целое число,
Noneили байтоподобный объект, представляющий буфер. В последнем случае вызывающий код должен самостоятельно убедиться, что байтовая строка содержит нужные биты (способ кодирования структур C в байтовые строки см. в необязательном встроенном модулеstruct). Если для value заданоNone, необходимо указать аргумент optlen. Это эквивалентно вызову функции Csetsockopt()сoptval=NULLиoptlen=optlen.Изменено в версии 3.5: Теперь принимается записываемый байтоподобный объект.
Изменено в версии 3.6: Добавлена форма setsockopt(level, optname, None, optlen: int).
Доступность: кроме WASI.
-
socket.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 -
Семейство сокета.
-
socket.type -
Тип сокета.
-
socket.proto -
Протокол сокета.
Примечания о времени ожидания сокетов
Объект сокета может находиться в одном из трёх режимов: блокирующем, неблокирующем или с тайм-аутом. По умолчанию сокеты всегда создаются в блокирующем режиме, но его можно изменить вызовом setdefaulttimeout().
- В блокирующем режиме операции блокируются до завершения или до тех пор, пока система не вернёт ошибку (например, истечение времени ожидания соединения).
- В неблокирующем режиме операции завершаются ошибкой (к сожалению, зависящей от системы), если их нельзя выполнить немедленно: функции модуля
selectпозволяют определить, доступен ли сокет для чтения или записи и когда именно. - В режиме тайм-аута операции завершаются ошибкой, если их не удаётся выполнить в течение заданного для сокета времени ожидания (вызывается исключение
timeout) или если система возвращает ошибку.
Примечание
На уровне операционной системы сокеты в режиме тайм-аута внутренне переводятся в неблокирующий режим. Кроме того, блокирующий режим и режим тайм-аута являются общими для файловых дескрипторов и объектов сокетов, относящихся к одной и той же сетевой конечной точке. Эта деталь реализации может иметь заметные последствия, если, например, вы решите использовать 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 с протоколом broadcast manager, откройте сокет следующим образом:
socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
После привязки (CAN_RAW) или подключения (CAN_BCM) сокета можно, как обычно, использовать для объекта сокета операции 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, автор Stuart Sechrest
- Расширенное руководство по межпроцессному взаимодействию в 4.3BSD, автор Samuel J. Leffler и др.,
обе статьи опубликованы в дополнительной документации к руководству программиста UNIX, том 1 (разделы PS1:7 и PS1:8). Справочные материалы для конкретных платформ по различным системным вызовам, связанным с сокетами, также являются ценным источником информации о деталях семантики сокетов. Для Unix см. страницы руководства; для Windows — спецификацию WinSock (или Winsock 2). Тем, кто работает с API с поддержкой IPv6, может быть полезен документ RFC 3493 под названием «Основные расширения интерфейса сокетов для IPv6».
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/socket.html