Содержание страницы
socket – низкоуровневый сетевой интерфейс¶socket – Low-level networking interface
Исходный код: Lib/socket.py
Этот модуль предоставляет доступ к интерфейсу сокетов BSD. Он доступен во всех современных системах Unix, Windows, MacOS и, возможно, на других платформах.
Примечание
Некоторые аспекты поведения могут зависеть от платформы, поскольку вызовы выполняются через API сокетов операционной системы.
Доступность: не WASI.
Этот модуль не работает или недоступен на WebAssembly. Подробнее см. платформы WebAssembly.
Интерфейс Python представляет собой прямую трансляцию системных вызовов Unix и библиотечного интерфейса сокетов в объектно-ориентированный стиль Python: функция socket() возвращает объект сокета, методы которого реализуют различные системные вызовы сокетов. Типы параметров несколько более высокоуровневые, чем в интерфейсе C: как и при операциях read() и write() с файлами Python, выделение буфера при операциях приёма происходит автоматически, а длина буфера неявно задаётся при отправке.
См. также
- Модуль
socketserver Классы, упрощающие написание сетевых серверов.
- Модуль
ssl Обёртка TLS/SSL для объектов сокетов.
Семейства сокетов¶Socket families
В зависимости от системы и параметров сборки этим модулем поддерживаются различные семейства сокетов.
Формат адреса, требуемый для конкретного объекта сокета, автоматически выбирается на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представляются следующим образом:
Адрес сокета
AF_UNIX, привязанного к узлу файловой системы, представляется в виде строки с использованием кодировки файловой системы и обработчика ошибок'surrogateescape'(см. PEP 383). Адрес в абстрактном пространстве имён Linux возвращается как байтоподобный объект с начальным нулевым байтом; обратите внимание, что сокеты в этом пространстве имён могут взаимодействовать с обычными файловыми сокетами, поэтому программы, предназначенные для работы в Linux, возможно, должны работать с обоими типами адресов. Строка или байтоподобный объект могут использоваться для любого из этих типов адресов при передаче в качестве аргумента.Изменено в версии 3.3: Ранее предполагалось, что пути сокетов
AF_UNIXиспользуют кодировку UTF-8.Изменено в версии 3.5: Теперь принимается записываемый байтоподобный объект.
Пара
(host, port)используется для семейства адресовAF_INET, где host – строка, представляющая либо имя хоста в доменной нотации Интернета, например'daring.cwi.nl', либо IPv4-адрес, например'100.50.200.5', а port – целое число.Для IPv4-адресов вместо адреса хоста принимаются две специальные формы:
''представляетINADDR_ANY, что используется для привязки ко всем интерфейсам, а строка'<broadcast>'представляетINADDR_BROADCAST. Такое поведение несовместимо с IPv6, поэтому, возможно, следует избегать их, если предполагается поддержка IPv6 в программах на Python.
Для семейства адресов
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, имеющими область действия (scoped).Изменено в версии 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.
Кортеж
(interface, )используется для семейства адресовAF_CAN, где interface – строка, представляющая имя сетевого интерфейса, например'can0'. Имя сетевого интерфейса''может использоваться для приёма пакетов от всех сетевых интерфейсов данного семейства.Протокол
CAN_ISOTPтребует кортеж(interface, rx_addr, tx_addr), где оба дополнительных параметра являются целыми числами без знака (unsigned long), представляющими идентификатор CAN (стандартный или расширенный).Протокол
CAN_J1939требует кортеж(interface, name, pgn, addr), где дополнительные параметры – 64-битное целое без знака, представляющее имя ECU, 32-битное целое без знака, представляющее номер группы параметров (PGN), и 8-битное целое, представляющее адрес.
Строка или кортеж
(id, unit)используется для протоколаSYSPROTO_CONTROLсемействаPF_SYSTEM. Строка – это имя элемента управления ядра с динамически назначаемым ID. Кортеж может использоваться, если известны ID и номер устройства элемента управления ядра или если используется зарегистрированный ID.Добавлено в версии 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.
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.
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– пакет, предназначенный другому хосту, но перехваченный драйвером устройства в неразборчивом режиме (promiscuous).PACKET_OUTGOING– пакет, отправленный с локального хоста и возвращённый обратно на пакетный сокет.
hatype – необязательное целое число, задающее тип аппаратного адреса ARP.
addr – необязательный байтоподобный объект, задающий аппаратный физический адрес; его интерпретация зависит от устройства.
Доступность: Linux >= 2.2.
AF_QIPCRTR– это интерфейс на основе сокетов, доступный только в Linux, для связи с сервисами, работающими на сопроцессорах в платформах Qualcomm. Семейство адресов представляется в виде кортежа(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_BROADCASTHV_GUID_WILDCARD– используется для привязки к себе и приёма подключений от всех разделов.HV_GUID_CHILDREN– используется для привязки к себе и приёма подключений от дочерних разделов.HV_GUID_LOOPBACK– используется как цель для себя.HV_GUID_PARENT– при использовании в качестве привязки принимает подключения от родительского раздела. При использовании в качестве адреса назначения подключается к родительскому разделу.
service_id– это идентификатор службы зарегистрированной службы.Добавлено в версии 3.12.
Если в части узел адреса сокета IPv4/v6 указано имя узла, программа может демонстрировать недетерминированное поведение, так как Python использует первый адрес, возвращённый при разрешении DNS. Адрес сокета будет разрешаться по-разному в фактический IPv4/v6-адрес в зависимости от результатов разрешения DNS и/или конфигурации узла. Для детерминированного поведения используйте числовой адрес в части узел.
Все ошибки порождают исключения. Могут возникать обычные исключения для недопустимых типов аргументов
и состояний нехватки памяти. Ошибки,
связанные с семантикой сокетов или адресов, порождают OSError или одно из его
подклассов.
Неблокирующий режим поддерживается через setblocking(). Его
обобщение на основе тайм-аутов поддерживается через
settimeout().
Содержимое модуля¶Module contents
Модуль socket экспортирует следующие элементы.
Исключения¶Exceptions
- exception socket.herror¶
Подкласс
OSError, это исключение возникает при ошибках, связанных с адресами, т.е. для функций, использующих h_errno в POSIX C API, включаяgethostbyname_ex()иgethostbyaddr(). Сопутствующее значение – пара(h_errno, string), представляющая ошибку, возвращённую библиотечным вызовом. h_errno – числовое значение, а строка представляет описание h_errno, возвращаемое функцией языка Chstrerror().Изменено в версии 3.3: Этот класс стал подклассом
OSError.
- exception socket.gaierror¶
Подкласс
OSError, это исключение возникает при ошибках, связанных с адресами, функциямиgetaddrinfo()иgetnameinfo(). Сопутствующее значение – пара(error, string), представляющая ошибку, возвращённую библиотечным вызовом. строка представляет описание error, возвращаемое функцией языка Cgai_strerror(). Числовое значение error будет соответствовать одной из константEAI_*, определённых в этом модуле.Изменено в версии 3.3: Этот класс стал подклассом
OSError.
- exception socket.timeout¶
Устаревший псевдоним
TimeoutError.Подкласс
OSError, это исключение возникает при возникновении тайм-аута на сокете, для которого тайм-ауты были включены с помощью предыдущего вызоваsettimeout()(или неявно черезsetdefaulttimeout()). Сопутствующее значение – строка, которая в настоящее время всегда равна «timed out».Изменено в версии 3.3: Этот класс стал подклассом
OSError.Изменено в версии 3.10: Этот класс стал псевдонимом
TimeoutError.
Константы¶Constants
Константы 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_*
Многие константы этих форм, описанные в документации Unix по сокетам и/или протоколу IP, также определены в модуле socket. Они обычно используются в аргументах методов
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_*
Множество констант такого вида, описанных в документации Linux, также определены в модуле socket.
Доступность: Linux >= 2.6.25, NetBSD >= 8.
Добавлено в версии 3.3.
Изменено в версии 3.11: Добавлена поддержка NetBSD.
Изменено в версии 3.13.4: Восстановлено отсутствующее
CAN_RAW_ERR_FILTERв Linux.
- socket.CAN_BCM¶
- CAN_BCM_*
CAN_BCM в семействе протоколов CAN – это протокол broadcast manager (BCM). Константы broadcast manager, описанные в документации 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-кадры; однако при чтении из сокета необходимо принимать оба типа кадров.
Эта константа описана в документации Linux.
Доступность: Linux >= 3.6.
Добавлено в версии 3.5.
- socket.CAN_RAW_JOIN_FILTERS¶
Объединяет установленные 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_*
Множество констант такого вида, описанных в документации Linux, также определены в модуле socket.
Доступность: 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_*
Множество констант такого вида, описанных в документации Linux, также определены в модуле socket.
Доступность: Linux >= 2.6.30.
Добавлено в версии 3.3.
- socket.SIO_RCVALL¶
- socket.SIO_KEEPALIVE_VALS¶
- socket.SIO_LOOPBACK_FAST_PATH¶
- RCVALL_*
Константы для Windows’ WSAIoctl(). Эти константы используются в качестве аргументов метода
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.12.
Доступность: FreeBSD
- socket.SO_INCOMING_CPU¶
Константа для оптимизации локальности ЦП, используется совместно с
SO_REUSEPORT.Добавлено в версии 3.12.
Доступность: 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.
Функции¶Functions
Создание сокетов¶Creating sockets
Все следующие функции создают объекты сокетов.
Конструктор класса 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-сервису, слушающему интернет-адрес address (кортеж из двух элементов
(host, port)), и возвращает объект сокета. Это функция более высокого уровня, чемsocket.connect(): если host является нечисловым именем хоста, она попытается разрешить его как дляAF_INET, так и дляAF_INET6, а затем попытается подключиться ко всем возможным адресам по очереди, пока соединение не будет установлено. Это упрощает написание клиентов, совместимых с IPv4 и IPv6.Передача необязательного параметра timeout установит тайм-аут для экземпляра сокета перед попыткой подключения. Если timeout не указан, используется глобальная настройка тайм-аута по умолчанию, возвращаемая
getdefaulttimeout().Если указан, source_address должен быть кортежем из двух элементов
(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 (кортеж из двух элементов
(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-mapped IPv6-адрес. Если dualstack_ipv6 равен false, это явно отключит данную функцию на платформах, которые включают её по умолчанию (например, Linux). Этот параметр можно использовать совместно сhas_dualstack_ipv6():import socket addr = ("", 8080) # все интерфейсы, порт 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.
Другие функции¶Other functions
Модуль 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/v6-адреса или
None. port – это строковое имя службы, такое как'http', числовой номер порта илиNone. ПередаваяNoneв качестве значения host и port, можно передатьNULLв базовый C API.Аргументы family, type и proto могут быть опционально указаны, чтобы предоставить опции и ограничить список возвращаемых адресов. Передайте их значения по умолчанию (соответственно
AF_UNSPEC, 0 и 0), чтобы не ограничивать результаты. Подробнее см. примечание ниже.Аргумент flags может быть одной или несколькими константами
AI_*и влияет на то, как вычисляются и возвращаются результаты. Например,AI_NUMERICHOSTотключает разрешение доменных имён и вызовет ошибку, если host является доменным именем.Функция возвращает список кортежей из 5 элементов со следующей структурой:
(family, type, proto, canonname, sockaddr)В этих кортежах family, type, proto – целые числа, предназначенные для передачи в функцию
socket(). canonname будет строкой, представляющей каноническое имя хоста, еслиAI_CANONNAMEявляется частью аргумента flags; в противном случае 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/v6 следует использоватьgetaddrinfo().Вызывает событие аудита
socket.gethostbynameс аргументомhostname.Доступность: не WASI.
- socket.gethostbyname_ex(hostname)¶
Преобразует имя хоста в формат IPv4-адреса, расширенный интерфейс. Возвращает кортеж из трёх элементов
(hostname, aliaslist, ipaddrlist), где hostname – основное имя хоста, aliaslist – (возможно пустой) список альтернативных имён хоста для того же адреса, а ipaddrlist – список IPv4-адресов того же интерфейса на том же хосте (часто, но не всегда, один адрес).gethostbyname_ex()не поддерживает разрешение имён IPv6, вместо него для поддержки двойного стека IPv4/v6 следует использоватьgetaddrinfo().Вызывает событие аудита
socket.gethostbynameс аргументомhostname.Доступность: не WASI.
- socket.gethostname()¶
Возвращает строку, содержащую имя хоста машины, на которой в данный момент выполняется интерпретатор Python.
Возбуждает событие аудита
socket.gethostnameбез аргументов.Примечание:
gethostname()не всегда возвращает полное доменное имя; для этого используйтеgetfqdn().Доступность: не WASI.
- socket.gethostbyaddr(ip_address)¶
Возвращает кортеж из трёх элементов
(hostname, aliaslist, ipaddrlist), где hostname – основное имя хоста, соответствующее указанному ip_address, aliaslist – (возможно пустой) список альтернативных имён хоста для того же адреса, а ipaddrlist – список IPv4/v6-адресов того же интерфейса на том же хосте (скорее всего, содержащий только один адрес). Чтобы найти полное доменное имя, используйте функциюgetfqdn().gethostbyaddr()поддерживает как IPv4, так и IPv6.Вызывает событие аудита
socket.gethostbyaddrс аргументомip_address.Доступность: не WASI.
- socket.getnameinfo(sockaddr, flags)¶
Преобразует адрес сокета sockaddr в кортеж из двух элементов
(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-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.
Изменено в версии 3.10: Возбуждает
OverflowError, если x не помещается в 16-битное беззнаковое целое.
- socket.htonl(x)¶
Преобразует 32-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен четырёх байтов.
- socket.htons(x)¶
Преобразует 16-битные положительные целые числа из порядка байтов хоста в сетевой порядок. На машинах, где порядок байтов хоста совпадает с сетевым, эта функция ничего не делает; в противном случае она выполняет обмен двух байтов.
Изменено в версии 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. Обратите внимание: что именно считается допустимым, зависит от нижележащей C-реализацииinet_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: Теперь принимается записываемый байтоподобный объект.
- 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: Теперь принимается записываемый байтоподобный объект.
- socket.CMSG_LEN(length)¶
Return the total length, without trailing padding, of an ancillary data item with associated data of the given length. This value can often be used as the buffer size for
recvmsg()to receive a single item of ancillary data, but RFC 3542 requires portable applications to useCMSG_SPACE()and thus include space for padding, even when the item will be the last in the buffer. RaisesOverflowErrorif length is outside the permissible range of values.Доступность: 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)¶
Устанавливает имя узла (hostname) машины равным 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.
- 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_UNIX-сокет sock. Параметр fds – последовательность файловых дескрипторов. Описание этих параметров см. вsendmsg().Доступность: Unix, не WASI.
Платформы Unix, поддерживающие механизмы
sendmsg()иSCM_RIGHTS.Добавлено в версии 3.9.
- socket.recv_fds(sock, bufsize, maxfds[, flags])¶
Принимает до maxfds файловых дескрипторов из
AF_UNIX-сокета sock. Возвращает(msg, list(fds), flags, addr). Описание этих параметров см. вrecvmsg().Доступность: Unix, не WASI.
Платформы Unix, поддерживающие механизмы
recvmsg()иSCM_RIGHTS.Добавлено в версии 3.9.
Примечание
Любые усечённые целые числа в конце списка файловых дескрипторов.
Объекты сокетов¶Socket Objects
- 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()¶
Получить наследуемый флаг файлового дескриптора сокета или handle сокета:
True, если сокет может наследоваться в дочерних процессах,False, если не может.Добавлено в версии 3.4.
- getpeername()¶
Возвращает удалённый адрес, к которому подключён сокет. Это полезно, например, для определения номера порта удалённого IPv4/v6 сокета. Формат возвращаемого адреса зависит от семейства адресов – см. Семейства сокетов. На некоторых системах эта функция не поддерживается.
- getsockname()¶
Возвращает собственный адрес сокета. Это полезно, например, для определения номера порта IPv4/v6 сокета. Формат возвращаемого адреса зависит от семейства адресов – см. Семейства сокетов.
- getsockopt(level, optname[, buflen])¶
Возвращает значение заданной опции сокета (см. man-страницу Unix getsockopt(2)). Нужные символические константы (SO_* и т.д.) определены в этом модуле. Если параметр buflen отсутствует, предполагается целочисленная опция, и функция возвращает её целое значение. Если buflen присутствует, он задаёт максимальную длину буфера для получения опции, и этот буфер возвращается в виде объекта bytes. Задача вызывающего кода – декодировать содержимое буфера (см. встроенный необязательный модуль
structдля способа декодирования C-структур, закодированных как байтовые строки).Доступность: не 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") # Массив целых чисел 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: # Добавить данные, игнорируя любые усечённые целые числа в конце. 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(). Возвращает количество отправленных байт. Приложения должны следить за тем, чтобы все данные были отправлены; если передана только часть данных, приложение должно попытаться доставить оставшиеся. Дополнительную информацию по этой теме см. в Руководстве по программированию сокетов (Socket Programming HOWTO).Изменено в версии 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-подобным объектом, представляющим буфер. В последнем случае вызывающий должен обеспечить, чтобы байтовая строка содержала правильные биты (см. опциональный встроенный модульstructдля способа кодирования структур C в виде байтовых строк). Когда value установлен вNone, требуется аргумент optlen. Это эквивалентно вызову C-функцииsetsockopt()сoptval=NULLиoptlen=optlen.Изменено в версии 3.5: Теперь принимается записываемый байтоподобный объект.
Изменено в версии 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.- family¶
Семейство сокета.
- type¶
Тип сокета.
- proto¶
Протокол сокета.
Примечания о тайм-аутах сокетов¶Notes on socket timeouts
Объект сокета может находиться в одном из трех режимов: блокирующем, неблокирующем или режиме тайм-аута. По умолчанию сокеты всегда создаются в блокирующем режиме, но это можно изменить, вызвав setdefaulttimeout().
В блокирующем режиме операции блокируются до завершения или пока система не вернет ошибку (например, истекло время соединения).
В неблокирующем режиме операции завершаются ошибкой (к сожалению, зависящей от системы), если их нельзя выполнить немедленно: функции из модуля
selectможно использовать, чтобы узнать, когда и готов ли сокет для чтения или записи.В режиме тайм-аута операции завершаются ошибкой, если их нельзя выполнить в течение заданного для сокета тайм-аута (возникает исключение
timeout) или если система возвращает ошибку.
Примечание
На уровне операционной системы сокеты в режиме тайм-аута внутренне устанавливаются в неблокирующий режим. Кроме того, блокирующий режим и режим тайм-аута разделяются между файловыми дескрипторами и объектами сокетов, относящимися к одной сетевой конечной точке. Эта деталь реализации может иметь заметные последствия, если, например, вы решите использовать fileno() сокета.
Тайм-ауты и метод connect¶Timeouts and the connect method
Операция connect() также подчиняется настройке тайм-аута, и в целом рекомендуется вызывать settimeout() перед вызовом connect() или передавать параметр тайм-аута в create_connection(). Однако сетевая подсистема системы также может вернуть собственную ошибку тайм-аута соединения независимо от любых настроек тайм-аута сокета Python.
Тайм-ауты и метод accept¶Timeouts and the accept method
Если getdefaulttimeout() не равно None, сокеты, возвращаемые методом accept(), наследуют этот тайм-аут. В противном случае поведение зависит от настроек слушающего сокета:
если слушающий сокет находится в блокирующем режиме или в режиме тайм-аута, то сокет, возвращаемый
accept(), находится в блокирующем режиме;если слушающий сокет находится в неблокирующем режиме, то будет ли сокет, возвращаемый
accept(), в блокирующем или неблокирующем режиме, зависит от операционной системы. Если вы хотите обеспечить кроссплатформенное поведение, рекомендуется вручную переопределить этот параметр.
Пример¶Example
Вот четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который отправляет обратно все полученные данные (обслуживая только одного клиента), и использующий его клиент. Обратите внимание, что сервер должен выполнить последовательность socket(), bind(), listen(), accept() (возможно, повторяя accept() для обслуживания более одного клиента), в то время как клиенту нужна только последовательность socket(), connect(). Также обратите внимание, что сервер не вызывает sendall()/recv() на сокете, который слушает, а на новом сокете, возвращённом accept().
Первые два примера поддерживают только IPv4.
# Программа эхо-сервера
import socket
HOST = '' # Символическое имя, обозначающее все доступные интерфейсы
PORT = 50007 # Произвольный непривилегированный порт
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)
# Программа эхо-клиента
import socket
HOST = 'daring.cwi.nl' # Удалённый хост
PORT = 50007 # Тот же порт, что и у сервера
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-трафик. Клиентская сторона попытается подключиться ко всем адресам, возвращённым в результате разрешения имён, и отправляет трафик на первый успешно подключённый.
# Программа эхо-сервера
import socket
import sys
HOST = None # Символическое имя, обозначающее все доступные интерфейсы
PORT = 50007 # Произвольный непривилегированный порт
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)
# Программа эхо-клиента
import socket
import sys
HOST = 'daring.cwi.nl' # Удалённый хост
PORT = 50007 # Тот же порт, что и у сервера
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))
Следующий пример показывает, как написать очень простой снифер сети с помощью сырых сокетов в Windows. Для изменения интерфейса пример требует прав администратора:
import socket
# общедоступный сетевой интерфейс
HOST = socket.gethostbyname(socket.gethostname())
# создать сырой сокет и привязать его к общедоступному интерфейсу
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))
# Включать IP-заголовки
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# принимать все пакеты
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
# принять пакет
print(s.recvfrom(65565))
# неразборчивый режим отключён
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
Следующий пример показывает, как использовать интерфейс сокетов для связи с сетью CAN по протоколу сырых сокетов. Чтобы вместо этого использовать 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-фреймов (см. 'struct can_frame' в <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])
# создать сырой сокет и привязать его к интерфейсу 'vcan0'
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 под названием Basic Socket Interface Extensions for IPv6.