socket – Низкоуровневый сетевой интерфейс
Исходный код: 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 с областью действия.Изменено в версии 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), где оба дополнительных параметра – это беззнаковые длинные целые, представляющие идентификатор CAN (стандартный или расширенный).Протокол
CAN_J1939требует кортеж(interface, name, pgn, addr), где дополнительные параметры – это 64-битное беззнаковое целое, представляющее имя ЭБУ, 32-битное беззнаковое целое, представляющее номер группы параметров (PGN), и 8-битное целое, представляющее адрес.
Строка или кортеж
(id, unit)используются для протоколаSYSPROTO_CONTROLсемействаPF_SYSTEM. Строка – это имя элемента управления ядра с динамически назначаемым идентификатором. Кортеж может использоваться, если известны идентификатор и номер устройства элемента управления ядра или используется зарегистрированный идентификатор.Добавлено в версии 3.3.
AF_BLUETOOTHподдерживает следующие протоколы и форматы адресов:BTPROTO_L2CAPпринимает кортеж(bdaddr, psm[, cid[, bdaddr_type]]), где:bdaddr– это строка, задающая Bluetooth-адрес.psm– это целое число, задающее мультиплексор протокола/сервиса.cid– это необязательное целое число, задающее идентификатор канала. Если не указано, по умолчанию равно нулю.bdaddr_type– это необязательное целое число, задающее тип адреса; одно изBDADDR_BREDR(по умолчанию),BDADDR_LE_PUBLIC,BDADDR_LE_RANDOM.
Изменено в версии 3.14: Добавлены поля
cidиbdaddr_type.BTPROTO_RFCOMMпринимает(bdaddr, channel), гдеbdaddr– это Bluetooth-адрес в виде строки, аchannel– целое число.BTPROTO_HCIпринимает формат, зависящий от операционной системы.В Linux он принимает целое число
device_idили кортеж(device_id, [channel]), гдеdevice_idзадаёт номер Bluetooth-устройства, аchannel– необязательное целое число, задающее канал HCI (по умолчаниюHCI_CHANNEL_RAW).В FreeBSD, NetBSD и DragonFly BSD он принимает
bdaddr, гдеbdaddr– это Bluetooth-адрес в виде строки.
Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.
Изменено в версии 3.13.3: Добавлена поддержка FreeBSD.
Изменено в версии 3.14: Добавлено поле
channel. Теперь принимаетсяdevice_id, не упакованный в кортеж.BTPROTO_SCOпринимаетbdaddr, гдеbdaddr– это Bluetooth-адрес в виде строки или объектbytes. (например,'12:23:34:45:56:67'илиb'12:23:34:45:56:67')Изменено в версии 3.14: Добавлена поддержка FreeBSD.
AF_ALG– это интерфейс на основе сокетов для криптографии ядра, доступный только в Linux. Сокет алгоритма настраивается с помощью кортежа из двух-четырех элементов(type, name [, feat [, mask]]), где:type – это тип алгоритма в виде строки, например
aead,hash,skcipherилиrng.name – это имя алгоритма и режим работы в виде строки, например
sha256,hmac(sha256),cbc(aes)илиdrbg_nopr_ctr_aes256.feat и mask – это беззнаковые 32-битные целые числа.
Доступность: Linux >= 2.6.38.
Некоторые типы алгоритмов требуют более новых версий ядра.
Добавлено в версии 3.6.
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 - необязательный байтоподобный объект, задающий физический аппаратный адрес; его интерпретация зависит от устройства.
Доступность: 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_BROADCASTHV_GUID_WILDCARD– используется для привязки к себе и приёма соединений от всех разделов.HV_GUID_CHILDREN– используется для привязки к себе и приёма соединений от дочерних разделов.HV_GUID_LOOPBACK– используется как цель для самой себя.HV_GUID_PARENT– при использовании для привязки принимает соединения от родительского раздела. При использовании в качестве целевого адреса подключается к родительскому разделу.
service_id– это идентификатор службы зарегистрированной службы.Добавлено в версии 3.12.
Если в части host адреса сокета IPv4/v6 используется имя хоста, программа может вести себя недетерминированно: Python берёт первый адрес, возвращённый DNS-разрешением. Адрес сокета будет разрешаться в фактический IPv4/v6-адрес по-разному в зависимости от результатов DNS-разрешения и/или конфигурации хоста. Для детерминированного поведения используйте числовой адрес в части host.
Все ошибки вызывают исключения. Могут возникать обычные исключения для недопустимых типов аргументов и нехватки памяти. Ошибки, связанные с семантикой сокетов или адресов, вызывают OSError или одно из его подклассов.
Неблокирующий режим поддерживается через setblocking(). Обобщение этого режима на основе тайм-аутов поддерживается через settimeout().
Module contentsСодержимое модуля
Модуль socket экспортирует следующие элементы.
ExceptionsИсключения
- exception socket.herror¶
Это исключение, подкласс
OSError, возбуждается для ошибок, связанных с адресами, то есть для функций, использующих h_errno в POSIX C API, включаяgethostbyname_ex()иgethostbyaddr(). Сопутствующее значение – пара(h_errno, string), представляющая ошибку, возвращённую библиотечным вызовом. h_errno – числовое значение, а string представляет описание h_errno, возвращаемое функцией Chstrerror().Изменено в версии 3.3: Этот класс стал подклассом
OSError.
- exception socket.gaierror¶
Подкласс
OSError, это исключение возбуждается при ошибках, связанных с адресами, функциямиgetaddrinfo()иgetnameinfo(). Сопровождающее значение – пара(error, string), представляющая ошибку, возвращённую библиотечным вызовом. string содержит описание error, возвращённое C-функциейgai_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: Добавлена поддержка
TCP_FASTOPEN,TCP_KEEPCNTна платформах Windows при наличии.Изменено в версии 3.7: добавлен
TCP_NOTSENT_LOWAT.Добавлена поддержка
TCP_KEEPIDLE,TCP_KEEPINTVLна платформах Windows при наличии.Изменено в версии 3.10: добавлен
IP_RECVTOS. ДобавленTCP_KEEPALIVE. На MacOS эту константу можно использовать так же, какTCP_KEEPIDLEиспользуется на Linux.Изменено в версии 3.11: добавлен
TCP_CONNECTION_INFO. На MacOS эту константу можно использовать так же, какTCP_INFOиспользуется на Linux и BSD.Изменено в версии 3.12: добавлены
SO_RTABLEиSO_USER_COOKIE. На OpenBSD и FreeBSD соответственно эти константы можно использовать так же, какSO_MARKиспользуется на Linux. Также добавлены отсутствовавшие опции TCP-сокетов из Linux:TCP_MD5SIG,TCP_THIN_LINEAR_TIMEOUTS,TCP_THIN_DUPACK,TCP_REPAIR,TCP_REPAIR_QUEUE,TCP_QUEUE_SEQ,TCP_REPAIR_OPTIONS,TCP_TIMESTAMP,TCP_CC_INFO,TCP_SAVE_SYN,TCP_SAVED_SYN,TCP_REPAIR_WINDOW,TCP_FASTOPEN_CONNECT,TCP_ULP,TCP_MD5SIG_EXT,TCP_FASTOPEN_KEY,TCP_FASTOPEN_NO_COOKIE,TCP_ZEROCOPY_RECEIVE,TCP_INQ,TCP_TX_DELAY. ДобавленыIP_PKTINFO,IP_UNBLOCK_SOURCE,IP_BLOCK_SOURCE,IP_ADD_SOURCE_MEMBERSHIP,IP_DROP_SOURCE_MEMBERSHIP.Изменено в версии 3.13: добавлен
SO_BINDTOIFINDEX. На Linux эту константу можно использовать так же, какSO_BINDTODEVICE, но с индексом сетевого интерфейса вместо его имени.Изменено в версии 3.14: добавлены отсутствовавшие
IP_FREEBIND,IP_RECVERR,IPV6_RECVERR,IP_RECVTTLиIP_RECVORIGDSTADDRна Linux.Изменено в версии 3.14: добавлена поддержка
TCP_QUICKACKна платформах Windows при наличии.Изменено в версии 3.15: добавлен
IPV6_HDRINCL.
- socket.AF_CAN¶
- socket.PF_CAN¶
- SOL_CAN_*
- CAN_*
Многие константы этих форм, описанные в документации Linux, также определены в модуле socket.
Доступность: Linux >= 2.6.25, NetBSD >= 8.
Добавлено в версии 3.3.
Изменено в версии 3.11: добавлена поддержка NetBSD.
Изменено в версии 3.14: восстановлен отсутствовавший
CAN_RAW_ERR_FILTERна Linux.
- 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-кадры; однако при чтении из сокета необходимо принимать оба типа кадров.
Эта константа описана в документации 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_*
Многие константы такой формы, описанные в документации 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_*
Константы для WSAIoctl() в Windows. Эти константы используются в качестве аргументов метода
ioctl()объектов сокетов.Изменено в версии 3.6:
SIO_LOOPBACK_FAST_PATHдобавлен.
- TIPC_*
Константы, связанные с TIPC, соответствующие тем, что экспортируются через сокетный API языка C. См. документацию TIPC для получения дополнительной информации.
- socket.AF_ALG¶
- socket.SOL_ALG¶
- ALG_*
Константы для криптографии ядра Linux.
Доступность: Linux >= 2.6.38.
Добавлено в версии 3.6.
- socket.AF_VSOCK¶
- socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID¶
- VMADDR*
- SO_VM*
Константы для взаимодействия между хостом и гостевой системой в Linux.
Доступность: Linux >= 4.8.
Добавлено в версии 3.7.
- socket.AF_LINK¶
Доступность: BSD, macOS.
Добавлено в версии 3.4.
- socket.has_ipv6¶
Эта константа содержит булево значение, которое указывает, поддерживается ли IPv6 на этой платформе.
- socket.AF_BLUETOOTH¶
- socket.BTPROTO_L2CAP¶
- socket.BTPROTO_RFCOMM¶
- socket.BTPROTO_HCI¶
- socket.BTPROTO_SCO¶
Целочисленные константы для использования с Bluetooth-адресами.
- socket.BDADDR_ANY¶
- socket.BDADDR_LOCAL¶
Это строковые константы, содержащие адреса Bluetooth со специальным значением. Например,
BDADDR_ANYможно использовать для указания любого адреса при задании связывающего сокета с помощьюBTPROTO_RFCOMM.
- socket.BDADDR_BREDR¶
- socket.BDADDR_LE_PUBLIC¶
- socket.BDADDR_LE_RANDOM¶
Эти константы описывают тип адреса Bluetooth при привязке или подключении сокета
BTPROTO_L2CAP.Доступность: Linux, FreeBSD
Добавлено в версии 3.14.
- socket.SOL_RFCOMM¶
- socket.SOL_L2CAP¶
- socket.SOL_HCI¶
- socket.SOL_SCO¶
- socket.SOL_BLUETOOTH¶
Используется в аргументе level методов
setsockopt()иgetsockopt()объектов Bluetooth-сокетов.SOL_BLUETOOTHдоступен только в Linux. Другие константы доступны, если поддерживается соответствующий протокол.
- SO_L2CAP_*
- socket.L2CAP_LM¶
- L2CAP_LM_*
- SO_RFCOMM_*
- RFCOMM_LM_*
- SO_SCO_*
- SO_BTH_*
- BT_*
Используется в аргументах имени опции и значения методов
setsockopt()иgetsockopt()объектов Bluetooth-сокетов.BT_*иL2CAP_LMдоступны только в Linux.SO_BTH_*доступны только в Windows. Другие константы могут быть доступны в Linux и на различных BSD-платформах.Добавлено в версии 3.14.
- socket.HCI_FILTER¶
- socket.HCI_TIME_STAMP¶
- socket.HCI_DATA_DIR¶
- socket.SO_HCI_EVT_FILTER¶
- socket.SO_HCI_PKT_FILTER¶
Имена опций для использования с
BTPROTO_HCI. Доступность и формат значений опций зависят от платформы.Изменено в версии 3.14: Добавлены
SO_HCI_EVT_FILTERиSO_HCI_PKT_FILTERв NetBSD и DragonFly BSD. ДобавленHCI_DATA_DIRв FreeBSD, NetBSD и DragonFly BSD.
- socket.HCI_DEV_NONE¶
Значение
device_id, используемое для создания HCI-сокета, который не привязан к конкретному Bluetooth-адаптеру.Доступность: Linux
Добавлено в версии 3.14.
- socket.HCI_CHANNEL_RAW¶
- socket.HCI_CHANNEL_USER¶
- socket.HCI_CHANNEL_MONITOR¶
- socket.HCI_CHANNEL_CONTROL¶
- socket.HCI_CHANNEL_LOGGING¶
Возможные значения для поля
channelв адресеBTPROTO_HCI.Доступность: Linux
Добавлено в версии 3.14.
- socket.AF_QIPCRTR¶
Константа для протокола маршрутизатора IPC от Qualcomm, используемого для связи с удалёнными процессорами, предоставляющими сервисы.
Поддержка: Linux >= 4.7.
- socket.SCM_CREDS2¶
- socket.LOCAL_CREDS¶
- socket.LOCAL_CREDS_PERSISTENT¶
LOCAL_CREDS и LOCAL_CREDS_PERSISTENT можно использовать с сокетами SOCK_DGRAM и SOCK_STREAM, что эквивалентно SO_PASSCRED в Linux/DragonFlyBSD. LOCAL_CREDS отправляет учётные данные при первом чтении, а LOCAL_CREDS_PERSISTENT – при каждом чтении. Для последнего в качестве типа сообщения необходимо использовать SCM_CREDS2.
Добавлено в версии 3.11.
Доступность: FreeBSD.
- socket.SO_INCOMING_CPU¶
Константа для оптимизации локальности CPU, используемая совместно с
SO_REUSEPORT.Добавлено в версии 3.11.
Доступность: Linux >= 3.9
- socket.SO_REUSEPORT_LB¶
Константа, позволяющая выполнять привязки к дублирующимся адресам и портам с балансировкой нагрузки.
Добавлено в версии 3.14.
Доступность: FreeBSD >= 12.0
- socket.AF_HYPERV¶
- socket.HV_PROTOCOL_RAW¶
- socket.HVSOCKET_CONNECT_TIMEOUT¶
- socket.HVSOCKET_CONNECT_TIMEOUT_MAX¶
- socket.HVSOCKET_CONNECTED_SUSPEND¶
- socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU¶
- socket.HV_GUID_ZERO¶
- socket.HV_GUID_WILDCARD¶
- socket.HV_GUID_BROADCAST¶
- socket.HV_GUID_CHILDREN¶
- socket.HV_GUID_LOOPBACK¶
- socket.HV_GUID_PARENT¶
Константы для сокетов Windows Hyper-V для связи между хостом и гостевой системой.
Доступность: Windows.
Добавлено в версии 3.12.
- socket.ETHERTYPE_ARP¶
- socket.ETHERTYPE_IP¶
- socket.ETHERTYPE_IPV6¶
- socket.ETHERTYPE_VLAN¶
Номер протокола IEEE 802.3. константы.
Доступность: Linux, FreeBSD, macOS.
Добавлено в версии 3.12.
- socket.SHUT_RD¶
- socket.SHUT_WR¶
- socket.SHUT_RDWR¶
Эти константы используются методом
shutdown()объектов сокетов.Доступность: не WASI.
FunctionsФункции
Creating socketsСоздание сокетов
Следующие функции создают объекты сокетов.
- 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(). Поэтому,pythonsock = 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 (кортеж из двух элементов
(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-отображённый IPv6-адрес. Если dualstack_ipv6 равен false, эта функциональность будет явно отключена на платформах, где она включена по умолчанию (например, Linux). Этот параметр можно использовать вместе сhas_dualstack_ipv6():pythonimport 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.
- socket.SocketType¶
Это объект типа Python, представляющий тип объекта сокета. Он совпадает с
type(socket(...)).
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 и флагов, с которыми был скомпилирован Python, и предназначен для передачи методуsocket.connect().sockaddr может быть одним из следующих:
(address, port)2-кортеж дляAF_INET(address, port, flowinfo, scope_id)4-кортеж дляAF_INET6, если Python был скомпилирован с--enable-ipv6(по умолчанию)2-кортеж, содержащий сырые данные для
AF_INET6, если Python был скомпилирован с--disable-ipv6
Примечание
Если предполагается использовать результаты из
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 не включён):python>>> 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-адреса, расширенный интерфейс. Возвращает 3-кортеж
(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)¶
Возвращает 3-кортеж
(hostname, aliaslist, ipaddrlist), где hostname – основное имя хоста, отвечающее на заданный ip_address, aliaslist – (возможно пустой) список альтернативных имён хоста для того же адреса, а ipaddrlist – список IPv4/v6-адресов для того же интерфейса на том же хосте (скорее всего, содержащий только один адрес). Для получения полного доменного имени используйте функциюgetfqdn().gethostbyaddr()поддерживает как IPv4, так и IPv6.Вызывает событие аудита
socket.gethostbyaddrс аргументомip_address.Доступность: не WASI.
- socket.getnameinfo(sockaddr, flags)¶
Преобразует адрес сокета sockaddr в 2-кортеж
(host, port). В зависимости от настроек flags результат может содержать полное доменное имя или числовое представление адреса в host. Аналогично, port может содержать строковое имя порта или числовой номер порта.Для IPv6-адресов
%scope_idдобавляется к части хоста, если sockaddr содержит значимый scope_id. Обычно это происходит для многоадресных адресов.Для получения дополнительной информации о flags можно обратиться к getnameinfo(3).
Вызывает событие аудита
socket.getnameinfoс аргументомsockaddr.Доступность: не WASI.
- socket.getprotobyname(protocolname)¶
Преобразует имя интернет-протокола (например,
'icmp') в константу, подходящую для передачи в качестве (необязательного) третьего аргумента функцииsocket(). Обычно это требуется только для сокетов, открытых в «сыром» режиме (SOCK_RAW); для обычных режимов сокетов правильный протокол выбирается автоматически, если протокол опущен или равен нулю.Доступность: не WASI.
- socket.getservbyname(servicename[, protocolname])¶
Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если указано, должно быть
'tcp'или'udp'; в противном случае подойдёт любой протокол.Вызывает аудируемое событие
socket.getservbynameс аргументамиservicename,protocolname.Доступность: не WASI.
- socket.getservbyport(port[, protocolname])¶
Преобразует номер порта и имя протокола в имя службы для этой службы. Необязательное имя протокола, если указано, должно быть
'tcp'или'udp', в противном случае будет соответствовать любой протокол.Вызывает аудируемое событие
socket.getservbyportс аргументамиport,protocolname.Доступность: не WASI.
- socket.ntohl(x)¶
Преобразует 32-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это пустая операция; в противном случае выполняется операция перестановки 4 байтов.
- socket.ntohs(x)¶
Преобразует 16-битные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это пустая операция; в противном случае выполняется операция перестановки 2 байтов.
Изменено в версии 3.10: Возбуждает
OverflowError, если x не помещается в 16-битное беззнаковое целое.
- socket.htonl(x)¶
Преобразует 32-битные положительные целые числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это пустая операция; в противном случае выполняется операция перестановки 4 байтов.
- socket.htons(x)¶
Преобразует 16-битные положительные целые числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это пустая операция; в противном случае выполняется операция перестановки 2 байтов.
Изменено в версии 3.10: Возбуждает
OverflowError, если x не помещается в 16-битное беззнаковое целое.
- socket.inet_aton(ip_string)¶
Преобразует IPv4-адрес из точечно-десятичного строкового формата (например, ‘123.45.67.89’) в 32-битный упакованный двоичный формат в виде байтового объекта длиной четыре символа. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа
in_addr, который является типом C для 32-битных упакованных двоичных данных, возвращаемых этой функцией.inet_aton()также принимает строки с менее чем тремя точками; подробнее см. на странице руководства Unix inet(3).Если переданная этой функции строка IPv4-адреса недопустима, будет возбуждено
OSError. Обратите внимание, что точное определение допустимости зависит от базовой реализации C функцииinet_aton().inet_aton()не поддерживает IPv6, и вместо него следует использоватьinet_pton()для поддержки двойного стека IPv4/v6.
- socket.inet_ntoa(packed_ip)¶
Преобразует 32-битный упакованный IPv4-адрес (байтоподобный объект длиной четыре байта) в его стандартное строковое представление в точечно-десятичной записи (например, ‘123.45.67.89’). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа
in_addr, который является типом C для 32-битных упакованных двоичных данных, принимаемых этой функцией в качестве аргумента.Если переданная этой функции последовательность байтов имеет длину не ровно 4 байта, будет возбуждено
OSError.inet_ntoa()не поддерживает IPv6, и вместо него следует использоватьinet_ntop()для поддержки двойного стека IPv4/v6.Изменено в версии 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-адрес (байтоподобный объект некоторой длины) в его стандартное строковое представление, специфичное для семейства адресов (например,
'7.10.0.5'или'5aef:2b::8').inet_ntop()полезен, когда библиотека или сетевой протокол возвращает объект типаin_addr(похожий наinet_ntoa()) илиin6_addr.Поддерживаемые значения для address_family в настоящее время:
AF_INETиAF_INET6. Если байтовый объект 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()для приёма элемента дополнительных данных с данными заданной длины, вместе с конечным выравниванием. Объём буфера, необходимый для приёма нескольких элементов, равен сумме значенийCMSG_SPACE()для длин их данных. ВызываетOverflowError, если длина выходит за допустимый диапазон значений.Обратите внимание, что некоторые системы могут поддерживать дополнительные данные, не предоставляя эту функцию. Кроме того, установка размера буфера с помощью результатов этой функции может не точно ограничивать объём дополнительных данных, который может быть получен, поскольку дополнительные данные могут поместиться в область выравнивания.
Доступность: Unix, не WASI.
большинство Unix-платформ.
Добавлено в версии 3.3.
- socket.getdefaulttimeout()¶
Возвращает тайм-аут по умолчанию в секундах (число с плавающей точкой) для новых объектов сокетов. Значение
Noneозначает, что новые объекты сокетов не имеют тайм-аута. При первом импорте модуля socket значение по умолчанию равноNone.
- socket.setdefaulttimeout(timeout)¶
Устанавливает тайм-аут по умолчанию в секундах (вещественное число) для новых объектов сокетов. При первом импорте модуля socket значение по умолчанию равно
None. См.settimeout()для возможных значений и их значений.Изменено в версии 3.15: Принимает любое вещественное число, а не только целое или число с плавающей точкой.
- socket.sethostname(name)¶
Устанавливает имя узла машины в name. Это вызовет
OSError, если у вас недостаточно прав.Вызывает событие аудита
socket.sethostnameс аргументомname.Доступность: Unix, не Android.
Добавлено в версии 3.3.
- socket.if_nameindex()¶
Возвращает список кортежей информации о сетевых интерфейсах (индекс int, имя string).
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Объекты сокетов
Объекты сокетов имеют следующие методы. За исключением
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: Теперь
OSErrorвозбуждается, если возникает ошибка при выполнении нижележащего вызоваclose().Примечание
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. Задача раскодирования содержимого буфера возлагается на вызывающую сторону (см. опциональный встроенный модуль
structдля способа декодирования C-структур, закодированных как байтовые строки).Доступность: не WASI.
- socket.getblocking()¶
Возвращает
True, если сокет находится в блокирующем режиме, иFalse, если в неблокирующем.Это эквивалентно проверке
socket.gettimeout() != 0.Добавлено в версии 3.7.
- socket.gettimeout()¶
Возвращает тайм-аут в секундах (число с плавающей запятой), связанный с операциями сокета, или
None, если тайм-аут не установлен. Это отражает последний вызовsetblocking()илиsettimeout().
- socket.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.
- 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 означает, что клиент отключился. См. страницу руководства Unix recv(2) для описания необязательного аргумента flags; по умолчанию он равен нулю.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов, а не вызывает исключение
InterruptedError(см. PEP 475 для обоснования).
- socket.recvfrom(bufsize[, flags])¶
Получает данные из сокета. Возвращаемое значение – пара
(bytes, address)где bytes – объект bytes, представляющий полученные данные, а address – адрес сокета, отправившего данные. За описанием необязательного аргумента flags обращайтесь к странице руководства Unix recv(2); по умолчанию он равен нулю. Формат address зависит от семейства адресов – см. Socket families.Изменено в версии 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, представляющий новые файловые дескрипторы в виде двоичного массива нативного C-типа int. Еслиrecvmsg()вызывает исключение после возврата системного вызова, он сначала попытается закрыть все файловые дескрипторы, полученные через этот механизм.В некоторых системах не указывается усечённая длина элементов вспомогательных данных, которые были получены лишь частично. Если элемент выходит за границы буфера,
recvmsg()выдаётRuntimeWarningи возвращает ту его часть, которая находится внутри буфера, при условии, что она не была усечена до начала связанных с ним данных.В системах, поддерживающих механизм
SCM_RIGHTS, следующая функция будет получать до maxfds файловых дескрипторов, возвращая данные сообщения и список, содержащий дескрипторы (игнорируя непредвиденные ситуации, такие как получение несвязанных управляющих сообщений). См. такжеsendmsg().pythonimport 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 с обоснованием).
- 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().Пример:
python>>> 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 families.
- socket.recv_into(buffer[, nbytes[, flags]])¶
Получает до nbytes байт из сокета, сохраняя данные в буфер вместо создания новой строки байтов. Если nbytes не указан (или равен 0), принимает данные объёмом до размера, доступного в данном буфере. Возвращает количество полученных байт. За описанием необязательного аргумента flags обращайтесь к странице руководства Unix recv(2); по умолчанию он равен нулю.
- socket.send(bytes[, flags])¶
Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и для
recv(). Возвращает количество отправленных байт. Приложения должны проверять, что все данные были отправлены; если были переданы только некоторые данные, приложение должно попытаться доставить оставшиеся. Дополнительную информацию по этой теме см. в Socket Programming 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 families.Вызывает аудируемое событие
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().pythonimport 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.
Changed in version 3.5: If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising an
InterruptedErrorexception (see PEP 475 for the rationale).
- 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 истёк до завершения операции. Если задан ноль, сокет переводится в неблокирующий режим. Если заданоNone, сокет переводится в блокирующий режим.За дополнительной информацией обратитесь к заметкам о тайм-аутах сокетов.
Изменено в версии 3.7: Метод больше не переключает флаг
SOCK_NONBLOCKнаsocket.type.Изменено в версии 3.15: Принимает любое вещественное число, а не только целое или с плавающей запятой.
- socket.setsockopt(level, optname, value: int | Buffer)¶
- socket.setsockopt(level, optname, None, optlen: int)
Устанавливает значение указанной опции сокета (см. справочную страницу Unix setsockopt(2)). Необходимые символические константы определены в этом модуле (SO_* и т.д. <socket-unix-constants>). Значением может быть целое число,
Noneили байтоподобный объект, представляющий собой буфер. В последнем случае вызывающий должен убедиться, что байтовая строка содержит правильные биты (см. опциональный встроенный модульstructдля способа кодирования C-структур как байтовых строк). Когда value установлен вNone, требуется аргумент optlen. Это эквивалентно вызову C-функцииsetsockopt()с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. Полученный байтовый объект затем можно передать целевому процессу с помощью какой-либо формы межпроцессного взаимодействия, и сокет может быть воссоздан там с помощью
fromshare(). После вызова этого метода можно безопасно закрыть сокет, поскольку операционная система уже продублировала его для целевого процесса.Доступность: Windows.
Добавлено в версии 3.3.
Обратите внимание, что нет методов read() или write(); вместо них используйте recv() и send() без аргумента flags.
Объекты сокетов также имеют следующие (только для чтения) атрибуты, соответствующие значениям, переданным конструктору socket.
- socket.family¶
Семейство сокета.
- socket.type¶
Тип сокета.
- socket.proto¶
Протокол сокета.
Notes on socket timeoutsПримечания по тайм-аутам сокетов
Объект сокета может находиться в одном из трёх режимов: блокирующем, неблокирующем или с тайм-аутом. По умолчанию сокеты всегда создаются в блокирующем режиме, но это можно изменить, вызвав setdefaulttimeout().
В блокирующем режиме операции блокируются до завершения или до тех пор, пока система не вернёт ошибку (например, истекло время соединения).
В неблокирующем режиме операции завершаются неудачей (с ошибкой, которая, к сожалению, зависит от системы), если их нельзя выполнить немедленно: функции из модуля
selectможно использовать, чтобы узнать, когда и доступен ли сокет для чтения или записи.В режиме с тайм-аутом операции завершаются неудачей, если их не удалось выполнить за указанный для сокета тайм-аут (при этом возбуждается исключение
timeout) или если система вернула ошибку.
Примечание
На уровне операционной системы сокеты в режиме с тайм-аутом внутри переводятся в неблокирующий режим. Кроме того, режимы блокировки и тайм-аута являются общими для файловых дескрипторов и объектов сокетов, относящихся к одной и той же сетевой конечной точке. Эта деталь реализации может иметь видимые последствия, если, например, вы решите использовать fileno() сокета.
Тайм-ауты и метод connect
Операция connect() также подчиняется настройке тайм-аута, и в общем случае рекомендуется вызывать settimeout() перед вызовом connect() или передавать параметр тайм-аута в create_connection(). Однако системный сетевой стек может вернуть собственную ошибку тайм-аута соединения независимо от настройки тайм-аута сокета в Python.
Тайм-ауты и метод accept
Если 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 с протоколом менеджера широковещательной рассылки, откройте сокет с помощью:
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, автор Stuart Sechrest
Продвинутое руководство по межпроцессному взаимодействию в 4.3BSD, авторы Samuel J. Leffler и др.
оба в UNIX Programmer’s Manual, Supplementary Documents 1 (разделы PS1:7 и PS1:8). Платформозависимые справочные материалы для различных системных вызовов, связанных с сокетами, также являются ценным источником информации о деталях семантики сокетов. Для Unix обратитесь к man-страницам; для Windows – к спецификации WinSock (или Winsock 2). Для API, поддерживающих IPv6, читатели могут обратиться к RFC 3493, озаглавленному «Basic Socket Interface Extensions for IPv6».