socket — Интерфейс низкоуровневой сетевой работы
Исходный код: Lib/socket.py
Этот модуль предоставляет доступ к интерфейсу BSD socket. Он доступен на всех современных Unix-системах, Windows, MacOS и, вероятно, на дополнительных платформах.
Примечание
Некоторые особенности могут зависеть от платформы, так как вызовы направлены к операционной системе через API сокетов.
Доступность: не WASI.
Этот модуль не работает или недоступен в WebAssembly. См. Платформы WebAssembly для получения дополнительной информации.
Интерфейс Python представляет собой простое преобразование интерфейса системных вызовов и библиотек Unix для сокетов в объектно-ориентированный стиль Python: функция socket() возвращает объект сокет, методы которого реализуют различные системные вызовы сокета. Типы параметров несколько более высокого уровня, чем в C-интерфейсе: как и при read() и write() операциях с файлами Python, выделение буфера при приёме данных выполняется автоматически, а длина буфера при отправке данных подразумевается.
См. также
-
Modulesocketserver -
Классы, которые упрощают написание сетевых серверов.
-
Modulessl -
Обёртка TLS/SSL для объектов сокета.
Семейства сокетов
В зависимости от системы и параметров сборки, этот модуль поддерживает различные семейства сокетов.
Формат адреса, требуемый для конкретного объекта сокета, автоматически выбирается на основе семейства адресов, указанного при создании объекта сокета. Сетевые адреса представляются следующим образом:
-
Адрес сокета
AF_UNIX, привязанного к узлу файловой системы, представляется строкой, используя кодировку файловой системы и обработчик ошибок'surrogateescape'(см. PEP 383). Адрес в абстрактном пространстве имен Linux возвращается как объект, подобный байтам с начальным нулевым байтом; обратите внимание, что сокеты в этом пространстве имен могут взаимодействовать с обычными файловыми сокетами, поэтому программы, предназначенные для работы в 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.
- Для IPv4-адресов принимаются две специальные формы вместо адреса хоста:
-
Для семейства адресов
AF_INET6используется четвёрка(host, port, flowinfo, scope_id), где flowinfo и scope_id представляют членыsin6_flowinfoиsin6_scope_idвstruct sockaddr_in6в C. Для методов модуляsocket, flowinfo и scope_id могут быть опущены только для обратной совместимости. Однако следует учесть, что пропуск scope_id может вызвать проблемы при работе со скопированными IPv6-адресами.Изменено в версии 3.7: Для адресов мультикаста (с scope_id, имеющим значение) address не может содержать
%scope_id(илиzone id) часть. Эта информация избыточна и может быть безопасно опущена (рекомендуется). -
AF_NETLINKсокеты представлены парами(pid, groups). -
Только для Linux поддерживается TIPC с использованием семейства адресов
AF_TIPC. TIPC — это открытый протокол сетевой связи, не основанный на IP, предназначенный для использования в кластерных компьютерных средах. Адреса представлены кортежем, а поля зависят от типа адреса. Общий формат кортежа —(addr_type, v1, v2, v3 [, scope]), где:-
addr_type — одно из
TIPC_ADDR_NAMESEQ,TIPC_ADDR_NAME, илиTIPC_ADDR_ID. -
scope — одно из
TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPE, иTIPC_NODE_SCOPE. -
Если addr_type —
TIPC_ADDR_NAME, тогда v1 — тип сервера, v2 — идентификатор порта, а v3 должно быть 0.Если addr_type —
TIPC_ADDR_NAMESEQ, тогда v1 — тип сервера, v2 — меньший номер порта, а v3 — больший номер порта.Если addr_type —
TIPC_ADDR_ID, тогда v1 — узел, v2 — ссылка, а v3 должно быть установлено в 0.
-
addr_type — одно из
-
Кортеж
(interface, )используется для семейства адресовAF_CAN, где interface — строка, представляющая имя сетевого интерфейса, например,'can0'. Имя сетевого интерфейса''может быть использовано для получения пакетов со всех сетевых интерфейсов этого семейства.-
CAN_ISOTPпротокол требует кортеж(interface, rx_addr, tx_addr), где оба дополнительных параметра — целые беззнаковые числа с плавающей запятой, представляющие идентификатор CAN (стандартный или расширенный). -
CAN_J1939протокол требует кортеж(interface, name, pgn, addr), где дополнительные параметры — 64-битное беззнаковое целое число, представляющее имя ECU, 32-битное беззнаковое целое число, представляющее номер группы параметров (PGN), и 8-битное целое число, представляющее адрес.
-
-
Строка или кортеж
(id, unit)используется для протоколаSYSPROTO_CONTROLсемействаPF_SYSTEM. Строка — это имя ядра управления с динамически назначенным идентификатором. Кортеж может быть использован, если известны ID и номер блока ядра управления или используется зарегистрированный ID.Добавлена в версии 3.3.
-
AF_BLUETOOTHподдерживает следующие протоколы и форматы адресов:-
BTPROTO_L2CAPпринимает(bdaddr, psm), гдеbdaddr— Bluetooth-адрес в виде строки, аpsm— целое число. -
BTPROTO_RFCOMMпринимает(bdaddr, channel), гдеbdaddr— Bluetooth-адрес в виде строки, аchannel— целое число. -
BTPROTO_HCIпринимает(device_id,), гдеdevice_id— целое число или строка с Bluetooth-адресом интерфейса. (Это зависит от вашей ОС; NetBSD и DragonFlyBSD ожидают Bluetooth-адрес, а все остальные — целое число.)Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.
-
BTPROTO_SCOпринимаетbdaddr, гдеbdaddr— объектbytes, содержащий Bluetooth-адрес в строковом формате. (например,b'12:23:34:45:56:67') Этот протокол не поддерживается в FreeBSD.
-
-
AF_ALG— это интерфейс сокетов только для Linux, основанный на ядре шифрования. Алгоритмический сокет настраивается с кортежем от двух до четырёх элементов(type, name [, feat [, mask]]), где:-
type — тип алгоритма в виде строки, например,
aead,hash,skcipherилиrng. -
name — имя алгоритма и режим работы в виде строки, например,
sha256,hmac(sha256),cbc(aes)илиdrbg_nopr_ctr_aes256. - feat и mask — целые 32-битные числа без знака.
Доступность: Linux >= 2.6.38.
Некоторые типы алгоритмов требуют более новых ядер.
Добавлена в версии 3.6.
-
type — тип алгоритма в виде строки, например,
-
AF_VSOCKпозволяет обмениваться данными между виртуальными машинами и их хостами. Сокеты представлены кортежем(CID, port), где ID контекста или CID и порт — целые числа.Доступность: Linux >= 3.9
См. vsock(7)
Добавлена в версии 3.7.
-
AF_PACKET— это низкоуровневый интерфейс к сетевым устройствам. Адреса представлены кортежем(ifname, proto[, pkttype[, hatype[, addr]]]), где:- ifname — строка, определяющая имя устройства.
-
proto — номер Ethernet-протокола. Может быть
ETH_P_ALLдля захвата всех протоколов, одним из ETHERTYPE_* констант или любым другим номером Ethernet-протокола. -
pkttype — необязательное целое число, определяющее тип пакета:
-
PACKET_HOST(по умолчанию) — пакет, адресованный локальному хосту. -
PACKET_BROADCAST— пакет широковещательной передачи физического уровня. -
PACKET_MULTICAST— пакет, отправленный на физический многоадресную группу. -
PACKET_OTHERHOST— пакет для другого хоста, перехваченный драйвером устройства в режиме прослушивания. -
PACKET_OUTGOING— пакет, исходящий от локального хоста, который возвращается в сокет пакета.
-
- hatype — необязательное целое число, определяющее тип аппаратного адреса ARP.
- addr — необязательный объект типа bytes, определяющий аппаратный физический адрес, чья интерпретация зависит от устройства.
Доступность: Linux >= 2.2.
-
AF_QIPCRTR— это интерфейс сокетов только для Linux для взаимодействия с сервисами, выполняющимися на сопроцессорах в платформах Qualcomm. Семейство адресов представлено кортежем(node, port), где node и port — целые числа без знака.Доступность: Linux >= 4.7.
Добавлена в версии 3.8.
-
IPPROTO_UDPLITE— это вариант UDP, который позволяет указать, какая часть пакета покрыта контрольной суммой. Он добавляет два параметра сокета, которые можно изменить.self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)изменит, какая часть исходящих пакетов покрыта контрольной суммой, аself.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)отфильтрует пакеты, которые покрывают слишком малую часть данных. В обоих случаяхlengthдолжен быть вrange(8, 2**16, 8).Такой сокет должен быть построен с помощью
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)для IPv4 илиsocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)для IPv6.Доступность: Linux >= 2.6.20, FreeBSD >= 10.1
Добавлена в версии 3.9.
-
AF_HYPERV— это интерфейс сокетов, используемый только в Windows для связи с хостами и гостевыми системами Hyper-V. Семейство адресов представлено в виде кортежа(vm_id, service_id), гдеvm_idиservice_id— UUID-строки.vm_id— это идентификатор виртуальной машины или набор известных значений VMID, если целевой объект не является конкретной виртуальной машиной. Известные константы VMID, определённые вsocket, включают:HV_GUID_ZEROHV_GUID_BROADCAST-
HV_GUID_WILDCARD— Используется для привязки к себе и для приема подключений со всех разделов. -
HV_GUID_CHILDREN— Используется для привязки к себе и для приема подключений от дочерних разделов. -
HV_GUID_LOOPBACK— Используется как целевой адрес для соединения с самим собой. -
HV_GUID_PARENT— При использовании в качестве адреса привязки, принимает подключения от родительского раздела. При использовании в качестве целевого адреса подключается к родительскому разделу.
service_id— это идентификатор зарегистрированной службы.Добавлена в версии 3.12.
Если вы используете имя хоста в части host адреса сокета IPv4/v6, программа может демонстрировать недетерминированное поведение, так как Python использует первый адрес, возвращённый результатом разрешения DNS. Адрес сокета будет разрешен в фактический адрес IPv4/v6 по-разному, в зависимости от результатов разрешения DNS и/или конфигурации хоста. Для детерминированного поведения используйте числовой адрес в части host.
Все ошибки генерируют исключения. Могут быть сгенерированы стандартные исключения для неверных типов аргументов и недостатка памяти. Ошибки, связанные с семантикой сокетов или адресов, генерируют исключение OSError или одно из его подклассов.
Режим без блокировки поддерживается через setblocking(). Обобщение этого на основе таймаутов поддерживается через settimeout().
Содержание модуля
Модуль socket экспортирует следующие элементы.
Исключения
-
exception socket.error -
Устаревшее псевдоним для
OSError.
-
exception socket.herror -
Подкласс
OSError, это исключение генерируется для ошибок, связанных с адресами, т. е. для функций, которые используют h_errno в API C POSIX, включаяgethostbyname_ex()иgethostbyaddr(). Сопутствующее значение — пара(h_errno, string), представляющая ошибку, возвращённую вызовом библиотечной функции. h_errno — числовое значение, а string представляет описание h_errno, как возвращено функцией Chstrerror().Изменено в версии 3.3: Этот класс был преобразован в подкласс
OSError.
-
exception socket.gaierror -
Подкласс
OSError, это исключение генерируется для ошибок, связанных с адресами, при использованииgetaddrinfo()иgetnameinfo(). Сопутствующее значение — пара(error, string), представляющая ошибку, возвращённую вызовом библиотечной функции. string представляет описание error, как возвращено функцией Cgai_strerror(). Численное значение error соответствует одной из константEAI_*, определённых в этом модуле.Изменено в версии 3.3: Этот класс был преобразован в подкласс
OSError.
-
exception socket.timeout -
Устаревшее псевдоним для
TimeoutError.Подкласс
OSError, это исключение генерируется, когда таймаут наступает на сокете, для которого были включены таймауты с помощью предшествующего вызоваsettimeout()(или неявно черезsetdefaulttimeout()). Сопутствующее значение — строка, значение которой в настоящее время всегда равно “timed out”.Изменено в версии 3.3: Этот класс был преобразован в подкласс
OSError.Изменено в версии 3.10: Этот класс был преобразован в псевдоним для
TimeoutError.
Постоянные
Постоянные AF_* и SOCK_* теперь являются AddressFamily и SocketKind коллекциями IntEnum.
Добавлен в версии 3.4.
-
socket.AF_UNIX -
socket.AF_INET -
socket.AF_INET6 -
Эти постоянные величины представляют семейства адресов (и протоколов), используемые в качестве первого аргумента для
socket(). Если постояннаяAF_UNIXне определена, то этот протокол не поддерживается. Дополнительные постоянные величины могут быть доступны в зависимости от системы.
-
socket.AF_UNSPEC -
AF_UNSPECозначает, чтоgetaddrinfo()должен возвращать адреса сокетов для любого семейства адресов (IPv4, IPv6 или любого другого), которое может быть использовано.
-
socket.SOCK_STREAM -
socket.SOCK_DGRAM -
socket.SOCK_RAW -
socket.SOCK_RDM -
socket.SOCK_SEQPACKET -
Эти постоянные величины представляют типы сокетов, используемые в качестве второго аргумента для
socket(). Дополнительные постоянные величины могут быть доступны в зависимости от системы. (ТолькоSOCK_STREAMиSOCK_DGRAM, по-видимому, обычно полезны.)
-
socket.SOCK_CLOEXEC -
socket.SOCK_NONBLOCK -
Эти две постоянные величины, если определены, могут быть объединены с типами сокетов и позволяют устанавливать некоторые флаги атомарно (тем самым избегая потенциальных гонок и необходимости отдельных вызовов).
См. также
Обработка защищенных дескрипторов файлов для более подробного объяснения.
Доступность: Linux >= 2.6.27.
Добавлен в версии 3.2.
- SO_*
-
socket.SOMAXCONN - MSG_*
- SOL_*
- SCM_*
- IPPROTO_*
- IPPORT_*
- INADDR_*
- IP_*
- IPV6_*
- EAI_*
- AI_*
- NI_*
- TCP_*
-
Многие константы этих форм, документированные в документации 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.
-
socket.CAN_BCM - CAN_BCM_*
-
CAN_BCM в семействе протоколов CAN — это протокол менеджера широковещательной передачи (BCM). Постоянные величины менеджера широковещательной передачи, документированные в документации Linux, также определены в модуле socket.
Доступность: Linux >= 2.6.25.
Примечание
Флаг
CAN_BCM_CAN_FD_FRAMEдоступен только в Linux >= 4.8.Добавлен в версии 3.4.
-
socket.CAN_RAW_FD_FRAMES -
Включает поддержку CAN FD в сокете CAN_RAW. По умолчанию отключено. Это позволяет вашему приложению отправлять как кадры CAN, так и CAN FD; однако, при чтении из сокета вы должны принимать как кадры CAN, так и CAN FD.
Эта константа документирована в документации Linux.
Доступность: Linux >= 3.6.
Добавлен в версии 3.5.
-
socket.CAN_RAW_JOIN_FILTERS -
Присоединяет примененные фильтры CAN таким образом, что в пользовательское пространство передаются только кадры CAN, которые соответствуют всем заданным фильтрам CAN.
Эта константа документирована в документации Linux.
Доступность: Linux >= 4.1.
Добавлен в версии 3.9.
-
socket.CAN_ISOTP -
CAN_ISOTP в семействе протоколов CAN — это протокол ISO-TP (ISO 15765-2). Постоянные величины ISO-TP, документированные в документации Linux.
Доступность: Linux >= 2.6.25.
Добавлен в версии 3.7.
-
socket.CAN_J1939 -
CAN_J1939, в семействе протоколов CAN, — это протокол SAE J1939. Константы J1939, документированные в документации Linux.
Доступность: Linux >= 5.4.
Добавлена в версии 3.9.
-
socket.AF_DIVERT -
socket.PF_DIVERT -
Эти две константы, документированные в справочной странице FreeBSD divert(4), также определены в модуле socket.
Доступность: FreeBSD >= 14.0.
Добавлена в версии 3.12.
-
socket.AF_PACKET -
socket.PF_PACKET - PACKET_*
-
Многие константы этих форм, документированные в документации 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.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недоступно для NetBSD или DragonFlyBSD.HCI_TIME_STAMPиHCI_DATA_DIRнедоступны для FreeBSD, NetBSD или DragonFlyBSD.
-
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, эквивалентны Linux/DragonFlyBSD SO_PASSCRED, при этом LOCAL_CREDS отправляет данные учетных данных при первом чтении, LOCAL_CREDS_PERSISTENT — при каждом чтении, а SCM_CREDS2 — для последнего типа сообщения.
Добавлена в версии 3.11.
Доступность: FreeBSD.
-
socket.SO_INCOMING_CPU -
Константа для оптимизации локальности процессора, используемая совместно с
SO_REUSEPORT.Добавлена в версии 3.11.
Доступность: Linux >= 3.9
-
socket.AF_HYPERV -
socket.HV_PROTOCOL_RAW -
socket.HVSOCKET_CONNECT_TIMEOUT -
socket.HVSOCKET_CONNECT_TIMEOUT_MAX -
socket.HVSOCKET_CONNECTED_SUSPEND -
socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU -
socket.HV_GUID_ZERO -
socket.HV_GUID_WILDCARD -
socket.HV_GUID_BROADCAST -
socket.HV_GUID_CHILDREN -
socket.HV_GUID_LOOPBACK -
socket.HV_GUID_PARENT -
Константы для сокетов Windows Hyper-V для взаимодействия хост/гость.
Доступность: Windows.
Добавлена в версии 3.12.
-
socket.ETHERTYPE_ARP -
socket.ETHERTYPE_IP -
socket.ETHERTYPE_IPV6 -
socket.ETHERTYPE_VLAN -
Номер протокола IEEE 802.3. константы.
Доступность: Linux, FreeBSD, macOS.
Добавлен в версии 3.12.
-
socket.SHUT_RD -
socket.SHUT_WR -
socket.SHUT_RDWR -
Эти константы используются методом
shutdown()объектов сокета.Доступность: не WASI.
Функции
Создание сокетов
Следующие функции создают объекты сокетов.
-
class socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -
Создаёт новый сокет с заданной семейством адресов, типом сокета и номером протокола. Семейство адресов должно быть
AF_INET(по умолчанию),AF_INET6,AF_UNIX,AF_CAN,AF_PACKETилиAF_RDS. Тип сокета должен бытьSOCK_STREAM(по умолчанию),SOCK_DGRAM,SOCK_RAWили, возможно, одним из другихSOCK_констант. Номер протокола обычно равен нулю и может быть опущен или, в случае, если семейство адресов равноAF_CAN, протокол должен быть одним изCAN_RAW,CAN_BCM,CAN_ISOTPилиCAN_J1939.Если задан параметр fileno, значения family, type и proto автоматически определяются по указанному дескриптору файла. Автоматическое определение можно переопределить, вызвав функцию с явными аргументами family, type или proto. Это влияет только на то, как Python представляет, например, возвращаемое значение
socket.getpeername(), но не на фактический ресурс ОС. В отличие отsocket.fromfd(), fileno вернёт тот же сокет, а не дубликат. Это может помочь закрыть отсоединённый сокет с помощьюsocket.close().Новый созданный сокет является не наследуемым.
Вызывает событие аудита
socket.__new__с аргументамиself,family,type,protocol.Изменено в версии 3.3: Добавлена семейство адресов AF_CAN. Добавлена семейство адресов AF_RDS.
Изменено в версии 3.4: Добавлен протокол CAN_BCM.
Изменено в версии 3.4: Возвращаемый сокет теперь не наследуется.
Изменено в версии 3.7: Добавлен протокол CAN_ISOTP.
Изменено в версии 3.7: Когда флаги
SOCK_NONBLOCKилиSOCK_CLOEXECприменяются к type, они очищаются, иsocket.typeне будет их отражать. Они всё ещё передаются в системный вызовsocket(). Следовательно,sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK)по-прежнему создаст неблокирующий сокет на системах, которые поддерживают
SOCK_NONBLOCK, ноsock.typeбудет установлено вsocket.SOCK_STREAM.Изменено в версии 3.9: Добавлен протокол CAN_J1939.
Изменено в версии 3.10: Добавлен протокол IPPROTO_MPTCP.
-
socket.socketpair([family[, type[, proto]]]) -
Создаёт пару соединённых объектов сокетов с заданной семейством адресов, типом сокета и номером протокола. Семейство адресов, тип сокета и номер протокола такие же, как и для функции
socket()выше. По умолчанию семейство равноAF_UNIX, если оно определено в платформе; в противном случае, по умолчанию равноAF_INET.Созданные сокеты являются не наследуемыми.
Изменено в версии 3.2: Возвращаемые объекты сокетов теперь поддерживают весь API сокетов, а не подмножество.
Изменено в версии 3.4: Возвращаемые сокеты теперь не наследуются.
Изменено в версии 3.5: Добавлена поддержка Windows.
-
socket.create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False) -
Подключается к TCP-сервису, прослушивающему по адресу address (кортеж из 2 элементов
(host, port)), и возвращает объект сокета. Эта функция более высокого уровня, чемsocket.connect(): если host — имя хоста, а не числовое значение, оно будет пытаться разрешить его дляAF_INETиAF_INET6, а затем пытаться подключиться ко всем возможным адресам по очереди, пока подключение не будет установлено. Это позволяет легко создавать клиентов, совместимых как с IPv4, так и с IPv6.Передача необязательного параметра timeout установит тайм-аут для объекта сокета перед подключением. Если timeout не указан, используется глобальный тайм-аут по умолчанию, возвращаемый функцией
getdefaulttimeout().Если задан параметр source_address, он должен быть кортежем из 2 элементов
(host, port)для привязки сокета к адресу источника перед подключением. Если хост или порт равны '' или 0 соответственно, будет использоваться поведение по умолчанию операционной системы.При невозможности создания подключения возбуждается исключение. По умолчанию это исключение из последнего адреса в списке. Если all_errors равно
True, этоExceptionGroup, содержащее ошибки всех попыток.Изменено в версии 3.2: Добавлен параметр source_address.
Изменено в версии 3.11: Добавлен параметр all_errors.
-
socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False) -
Удобная функция, которая создаёт TCP-сокет, привязанный к address (кортеж из 2 элементов
(host, port)), и возвращает объект сокета.family должен быть либо
AF_INET, либоAF_INET6. backlog — размер очереди, передаваемый вsocket.listen(); если не указан, выбирается разумное значение по умолчанию. reuse_port определяет, следует ли установить опцию сокетаSO_REUSEPORT.Если dualstack_ipv6 равно true и платформа его поддерживает, сокет сможет принимать как IPv4, так и IPv6 подключения, иначе вызовет
ValueError. Большинство POSIX платформ и Windows должны поддерживать эту функциональность. Когда эта функциональность включена, адрес, возвращаемыйsocket.getpeername(), при подключении IPv4, будет IPv6-адресом, представленным как IPv4-адрес, отображаемый в IPv6. Если dualstack_ipv6 равно false, эта функциональность будет явно отключена на платформах, которые включают её по умолчанию (например, Linux). Этот параметр можно использовать в сочетании сhas_dualstack_ipv6():import socket addr = ("", 8080) # all interfaces, port 8080 if socket.has_dualstack_ipv6(): s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True) else: s = socket.create_server(addr)Примечание
На POSIX платформах опция сокета
SO_REUSEADDRустанавливается для того, чтобы немедленно повторно использовать предыдущие сокеты, которые были привязаны к тому же address и остались в состоянии TIME_WAIT.Добавлен в версии 3.8.
-
socket.has_dualstack_ipv6() -
Возвращает
Trueесли платформа поддерживает создание TCP-сокета, который может обрабатывать как IPv4, так и IPv6 подключения.Добавлен в версии 3.8.
-
socket.fromfd(fd, family, type, proto=0) -
Дублирует дескриптор файла fd (целое число, возвращаемое методом
fileno()объекта файла) и создает объект сокета из результата. Семейство адресов, тип сокета и номер протокола соответствуют функцииsocket()выше. Дескриптор файла должен ссылаться на сокет, но это не проверяется — последующие операции с объектом могут завершиться ошибкой, если дескриптор файла недействителен. Эта функция редко используется, но может пригодиться для получения или установки параметров сокета для сокета, переданного программе в качестве стандартного ввода или вывода (например, сервер, запущенный демоном inet Unix). Предполагается, что сокет находится в режиме блокировки.Новый созданный сокет не наследуется.
Изменено в версии 3.4: Возвращаемый сокет теперь не наследуется.
-
Создает сокет из данных, полученных из метода
socket.share(). Предполагается, что сокет находится в режиме блокировки.Доступность: Windows.
Добавлен в версии 3.3.
-
socket.SocketType -
Это объект типа Python, представляющий тип объекта сокета. Он совпадает с
type(socket(...)).
Другие функции
Модуль socket также предоставляет различные сетевые сервисы:
-
socket.close(fd) -
Закрыть дескриптор файла сокета. Аналогично
os.close(), но для сокетов. На некоторых платформах (особенно на Windows)os.close()не работает для дескрипторов файлов сокетов.Добавлена в версии 3.7.
-
socket.getaddrinfo(host, port, family=AF_UNSPEC, type=0, proto=0, flags=0) -
Эта функция оборачивает функцию C
getaddrinfoна уровне системы.Преобразует аргумент host/port в последовательность 5-кортежей, содержащих все необходимые аргументы для создания сокета, подключенного к указанной службе. host — это доменное имя, строковое представление адреса IPv4/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 будет строкой, представляющей каноническое имя host, еслиAI_CANONNAMEявляется частью аргумента flags; в противном случае canonname будет пустой строкой. sockaddr — это кортеж, описывающий адрес сокета, формат которого зависит от возвращённого family (кортеж из 2 элементов дляAF_INET, кортеж из 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, расширенный интерфейс. Возвращает кортеж из 3 элементов
(hostname, aliaslist, ipaddrlist), где hostname — основное имя хоста, aliaslist — список (возможно, пустой) альтернативных имён хоста для одного адреса, а ipaddrlist — список адресов IPv4 для одного интерфейса на одном хосте (часто, но не всегда, один адрес). Для поиска полного доменного имени используйте функциюgethostbyname_ex().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добавляется к части host, если sockaddr содержит значимый scope_id. Обычно это происходит для адресов multicast.Для получения более подробной информации о flags обратитесь к getnameinfo(3).
Вызывает событие аудита событие аудита
socket.getnameinfoс аргументомsockaddr.Доступность: не WASI.
-
socket.getprotobyname(protocolname) -
Преобразует имя интернет-протокола (например,
'icmp') в константу, подходящую для передачи в качестве (необязательного) третьего аргумента функцииsocket(). Это обычно требуется только для сокетов, открытых в режиме «raw» (SOCK_RAW); для обычных режимов сокетов корректный протокол выбирается автоматически, если протокол опущен или равен нулю.Доступность: не WASI.
-
socket.getservbyname(servicename[, protocolname]) -
Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если задано, должно быть
'tcp'или'udp', в противном случае будет соответствовать любой протокол.Вызывает событие аудита событие аудита
socket.getservbynameс аргументамиservicename,protocolname.Доступность: не WASI.
-
socket.getservbyport(port[, protocolname]) -
Преобразует номер порта интернет-службы и имя протокола в имя службы для этой службы. Необязательное имя протокола, если задано, должно быть
'tcp'или'udp', в противном случае будет соответствовать любой протокол.Вызывает событие аудита событие аудита
socket.getservbyportс аргументамиport,protocolname.Доступность: не WASI.
-
socket.ntohl(x) -
Преобразует 32-битные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это не операция; в противном случае выполняется операция перестановки 4 байтов.
-
socket.ntohs(x) -
Преобразует 16-битные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это не операция; в противном случае выполняется операция перестановки 2 байтов.
Изменено в версии 3.10: Вызывает
OverflowError, если x не помещается в 16-битное беззнаковое целое число.
-
socket.htonl(x) -
Преобразует 32-битные целые числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это не операция; в противном случае выполняется операция перестановки 4 байтов.
-
socket.htons(x) -
Преобразует 16-битные целые числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это не операция; в противном случае выполняется операция перестановки 2 байтов.
Изменено в версии 3.10: Вызывает
OverflowError, если x не помещается в 16-битное беззнаковое целое число.
-
socket.inet_aton(ip_string) -
Преобразует IPv4-адрес из строкового формата с точками (например, ‘123.45.67.89’) в 32-битный упакованный двоичный формат в виде объекта bytes длиной четыре символа. Это полезно при работе с программой, использующей стандартную библиотеку C и требующей объекты типа
in_addr, который является типом C для 32-битного упакованного двоичного данных, возвращаемых этой функцией.inet_aton()также принимает строки с менее чем тремя точками; см. страницу руководства Unix inet(3) для деталей.Если строка IPv4-адреса, переданная в эту функцию, недействительна, будет вызвано
OSError. Обратите внимание, что то, что именно является допустимым, зависит от реализации Cinet_aton().inet_aton()не поддерживает IPv6, и следует использоватьinet_pton()для поддержки IPv4/v6 dual stack.
-
socket.inet_ntoa(packed_ip) -
Преобразует 32-битный упакованный IPv4-адрес (объект bytes-like object длиной четыре байта) в его стандартное строковое представление с точками (например, ‘123.45.67.89’). Это полезно при работе с программой, использующей стандартную библиотеку C и требующей объекты типа
in_addr, который является типом C для 32-битных упакованных двоичных данных, которые функция принимает в качестве аргумента.Если последовательность байтов, переданная в эту функцию, не имеет длины ровно 4 байта, будет вызвано
OSError.inet_ntoa()не поддерживает IPv6, и следует использоватьinet_ntop()для поддержки IPv4/v6 dual stack.Изменено в версии 3.5: Теперь принимается изменяемый bytes-like object.
-
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, так и от реализации Cinet_pton().Доступность: Unix, Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
-
socket.inet_ntop(address_family, packed_ip) -
Преобразовать упакованный IP-адрес (объект bytes-like object определённой длины) в его стандартное представление, специфичное для семейства (например,
'7.10.0.5'или'5aef:2b::8').inet_ntop()полезен, когда библиотека или сетевой протокол возвращают объект типаin_addr(аналогичноinet_ntoa()) илиin6_addr.Поддерживаемые значения для address_family — это
AF_INETиAF_INET6. Если объект bytes packed_ip имеет неверную длину для указанного семейства адресов, будет поднято исключениеValueError. ИсключениеOSErrorподнимается при ошибках вызоваinet_ntop().Доступность: Unix, Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
Изменено в версии 3.5: Теперь принимается изменяемый объект bytes-like object.
-
socket.CMSG_LEN(length) -
Возвращает общую длину, без хвостового заполнения, элемента данных с дополнительными данными заданной длины. Это значение часто может использоваться как размер буфера для
recvmsg()для получения одного элемента дополнительных данных, но RFC 3542 требует, чтобы портативные приложения использовалиCMSG_SPACE()и, следовательно, включали место для заполнения, даже когда элемент будет последним в буфере. Поднимает исключениеOverflowError, если длина выходит за допустимый диапазон значений.Доступность: Unix, не WASI.
Большинство платформ Unix.
Добавлен в версии 3.3.
-
socket.CMSG_SPACE(length) -
Возвращает размер буфера, необходимый для
recvmsg()для получения элемента дополнительных данных с ассоциированными данными заданной длины, а также любым хвостовым заполнением. Необходимый размер буфера для получения нескольких элементов — это сумма значенийCMSG_SPACE()для длин их ассоциированных данных. Поднимает исключениеOverflowError, если длина выходит за допустимый диапазон значений.Обратите внимание, что некоторые системы могут поддерживать дополнительные данные без предоставления этой функции. Также обратите внимание, что установка размера буфера с использованием результатов этой функции может не точно ограничить количество дополнительных данных, которые могут быть получены, так как дополнительные данные могут поместиться в область заполнения.
Доступность: Unix, не WASI.
большинство платформ Unix.
Добавлен в версии 3.3.
-
socket.getdefaulttimeout() -
Возвращает значение таймаута по умолчанию в секундах (float) для новых объектов сокета. Значение
Noneуказывает, что новые объекты сокетов не имеют таймаута. При первом импорте модуля socket значение по умолчанию равноNone.
-
socket.setdefaulttimeout(timeout) -
Устанавливает значение таймаута по умолчанию в секундах (float) для новых объектов сокета. При первом импорте модуля socket значение по умолчанию равно
None. См.settimeout()для возможных значений и их значений.
-
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в этом примере. - UUID:
-
socket.if_nametoindex(if_name) -
Возвращает номер индекса сетевого интерфейса, соответствующий имени интерфейса.
OSError, если интерфейс с заданным именем не существует.Доступность: Unix, Windows, не WASI.
Добавлен в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
См. также
«Имя интерфейса» — это имя, как описано в
if_nameindex().
-
socket.if_indextoname(if_index) -
Возвращает имя сетевого интерфейса, соответствующее номеру индекса интерфейса.
OSError, если интерфейс с заданным индексом не существует.Доступность: Unix, Windows, не WASI.
Добавлен в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
См. также
«Имя интерфейса» — это имя, как описано в
if_nameindex().
-
socket.send_fds(sock, buffers, fds[, flags[, address]]) -
Отправляет список дескрипторов файлов fds через сокет
AF_UNIXsock. Параметр fds — это последовательность дескрипторов файлов. См.sendmsg()для документации этих параметров.Доступность: Unix, Windows, не WASI.
Платформы Unix, поддерживающие
sendmsg()и механизмSCM_RIGHTS.Добавлен в версии 3.9.
-
socket.recv_fds(sock, bufsize, maxfds[, flags]) -
Принимает до maxfds дескрипторов файлов от сокета
AF_UNIXsock. Возвращает(msg, list(fds), flags, addr). Обратитесь кrecvmsg()для документации этих параметров.Доступность: Unix, Windows, не WASI.
Платформы Unix, поддерживающие
sendmsg()и механизмSCM_RIGHTS.Добавлен в версии 3.9.
Примечание
Любые усеченные целые числа в конце списка дескрипторов файлов.
Объекты сокетов
Объекты сокетов имеют следующие методы. За исключением makefile(), они соответствуют системным вызовам Unix, применимым к сокетам.
Изменено в версии 3.2: Добавлена поддержка протокола менеджера контекста. Выход из менеджера контекста эквивалентен вызову close().
-
socket.accept() -
Принять подключение. Сокет должен быть привязан к адресу и ожидать подключений. Результатом является пара
(conn, address), где conn — новый объект сокета, пригодный для отправки и приема данных по соединению, а address — адрес, привязанный к сокету на другом конце соединения.Новый созданный сокет не может быть унаследован.
Изменено в версии 3.4: Сокет теперь не может быть унаследован.
Изменено в версии 3.5: Если системный вызов прерван, и обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо вызова исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.bind(address) -
Привязать сокет к address. Сокет не должен быть уже привязан. (Формат address зависит от семейства адресов — см. выше.)
Вызывает событие аудита аудита
socket.bindс аргументамиself,address.Доступность: не WASI.
-
socket.close() -
Пометить сокет закрытым. Базовый системный ресурс (например, дескриптор файла) также закрывается, когда все файловые объекты из
makefile()закрыты. После этого все последующие операции с объектом сокета завершатся ошибкой. Удаленный конец не получит больше данных (после очистки очереди данных).Сокеты автоматически закрываются при сборке мусора, но рекомендуется явно закрывать их
close(), или использовать операторwithвокруг них.Изменено в версии 3.6:
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() -
Возвращает время ожидания в секундах (float), связанное с операциями сокета, или
Noneесли время ожидания не установлено. Это отражает последний вызовsetblocking()илиsettimeout().
-
socket.ioctl(control, option) -
- Платформа:
-
Windows
Метод
ioctl()— ограниченный интерфейс к системному интерфейсу WSAIoctl. Для получения дополнительной информации обратитесь к документации Win32.На других платформах можно использовать общие функции
fcntl.fcntl()иfcntl.ioctl(); они принимают объект сокета в качестве первого аргумента.В настоящее время поддерживаются только следующие коды управления:
SIO_RCVALL,SIO_KEEPALIVE_VALS, иSIO_LOOPBACK_FAST_PATH.Изменено в версии 3.6:
SIO_LOOPBACK_FAST_PATHбыл добавлен.
-
socket.listen([backlog]) -
Разрешает серверу принимать подключения. Если задан backlog, он должен быть не меньше 0 (если он меньше, он устанавливается в 0); он определяет количество не принятых подключений, которые система позволит, прежде чем отклонить новые подключения. Если не указан, выбирается разумное значение по умолчанию.
Доступность: не WASI.
Изменено в версии 3.5: Параметр backlog теперь является необязательным.
-
socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None) -
Возвращает объект файла, связанный с сокетом. Точный возвращаемый тип зависит от аргументов, переданных в
makefile(). Эти аргументы интерпретируются так же, как и встроенной функциейopen(), за исключением того, что единственными поддерживаемыми значениями mode являются'r'(по умолчанию),'w','b', или комбинация этих значений.Сокет должен быть в режиме блокировки; он может иметь время ожидания, но внутренний буфер объекта файла может оказаться в несогласованном состоянии, если произойдет истечение времени ожидания.
Закрытие объекта файла, возвращённого
makefile(), не закроет исходный сокет, если все остальные объекты файлов не были закрыты иsocket.close()не был вызван для объекта сокета.Примечание
В Windows, файлоподобный объект, созданный
makefile(), нельзя использовать там, где ожидается объект файла с дескриптором файла, например, в качестве аргументов потокаsubprocess.Popen().
-
socket.recv(bufsize[, flags]) -
Получение данных из сокета. Возвращаемое значение — объект bytes, представляющий полученные данные. Максимальное количество данных, получаемых за раз, задается параметром bufsize. Возвращаемый пустой объект bytes указывает на то, что клиент отключился. Обратитесь к странице руководства Unix recv(2) для значения необязательного аргумента flags; он по умолчанию равен нулю.
Примечание
Для наилучшего соответствия реалиям аппаратного и сетевого обеспечения, значение bufsize должно быть относительно малой степенью двойки, например, 4096.
Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо вызова исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.recvfrom(bufsize[, flags]) -
Получение данных из сокета. Возвращаемое значение — пара
(bytes, address), где bytes — объект bytes, представляющий полученные данные, а address — адрес сокета, отправляющего данные. Обратитесь к странице руководства Unix recv(2) для значения необязательного аргумента flags; он по умолчанию равен нулю. (Формат address зависит от семейства адресов — см. выше.)Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо вызова исключения
InterruptedError(см. PEP 475 для обоснования).Изменено в версии 3.7: Для адресов мультивещания IPv6, первая часть address больше не содержит
%scope_idчасть. Для получения полного адреса IPv6 используйтеgetnameinfo().
-
socket.recvmsg(bufsize[, ancbufsize[, flags]]) -
Получить обычные данные (до bufsize байт) и дополнительные данные из сокета. Аргумент ancbufsize задаёт размер внутреннего буфера в байтах, используемого для получения дополнительных данных; по умолчанию он равен 0, что означает, что дополнительные данные не будут получены. Соответствующие размеры буферов для дополнительных данных можно рассчитать с помощью
CMSG_SPACE()илиCMSG_LEN(), и элементы, которые не помещаются в буфер, могут быть усечены или отброшены. Аргумент flags по умолчанию равен 0 и имеет то же значение, что и дляrecv().Возвращаемое значение — кортеж из 4 элементов:
(data, ancdata, msg_flags, address). Элемент data — объектbytes, содержащий полученные данные без дополнительных данных. Элемент ancdata — список нуля или более кортежей(cmsg_level, cmsg_type, cmsg_data), представляющих дополнительные данные (управляющие сообщения), полученные: cmsg_level и cmsg_type — целые числа, указывающие соответственно уровень протокола и тип протокола, а cmsg_data — объектbytes, содержащий связанные данные. Элемент msg_flags — побитовое ИЛИ различных флагов, указывающих условия полученного сообщения; см. документацию вашей системы для получения подробностей. Если принимающий сокет не подключён, address — адрес сокета отправителя, если доступен; в противном случае его значение не определено.На некоторых системах
sendmsg()иrecvmsg()могут использоваться для передачи дескрипторов файлов между процессами через сокетAF_UNIX. Когда эта функция используется (она часто ограничена для сокетовSOCK_STREAM),recvmsg()вернёт в дополнительных данных элементы вида(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds), где fds — объектbytes, представляющий новые дескрипторы файлов в виде двоичного массива типа int из C. Еслиrecvmsg()вызывает исключение после возвращения системного вызова, он сначала попытается закрыть все дескрипторы файлов, полученные с помощью этого механизма.Некоторые системы не указывают усечённую длину элементов дополнительных данных, которые были получены только частично. Если элемент, кажется, выходит за пределы конца буфера,
recvmsg()выдастRuntimeWarningи вернёт часть элемента, которая находится внутри предоставленного буфера, при условии, что он не был усечён до начала связанных данных.На системах, которые поддерживают механизм
SCM_RIGHTS, следующая функция получит до maxfds дескрипторов файлов, вернув данные сообщения и список, содержащий дескрипторы (при игнорировании таких нестандартных ситуаций, как получение не относящихся к делу управляющих сообщений). См. такжеsendmsg().import socket, array def recv_fds(sock, msglen, maxfds): fds = array.array("i") # Array of ints msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize)) for cmsg_level, cmsg_type, cmsg_data in ancdata: if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS: # Append data, ignoring any truncated integers at the end. fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) return msg, list(fds)Доступность: Unix.
Большинство платформ Unix.
Добавлена в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерван, а обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо повышения исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.recvmsg_into(buffers[, ancbufsize[, flags]]) -
Получить обычные данные и дополнительные данные из сокета, действуя как
recvmsg(), но разбросать данные без дополнительных данных по ряду буферов вместо возврата нового объекта bytes. Аргумент buffers должен быть итерируемым объектом, содержащим объекты, которые экспортируют записываемые буферы (например, объектыbytearray); они будут заполняться последовательными блоками данных без дополнительных данных, пока все данные не будут записаны или не закончатся буферы. Операционная система может установить ограничение (sysconf()значениеSC_IOV_MAX) на количество используемых буферов. Аргументы ancbufsize и flags имеют то же значение, что и дляrecvmsg().Возвращаемое значение — кортеж из 4 элементов:
(nbytes, ancdata, msg_flags, address), где nbytes — общее количество байт данных без дополнительных данных, записанных в буферы, а ancdata, msg_flags и address — такие же, как и дляrecvmsg().Пример:
>>> import socket >>> s1, s2 = socket.socketpair() >>> b1 = bytearray(b'----') >>> b2 = bytearray(b'0123456789') >>> b3 = bytearray(b'--------------') >>> s1.send(b'Mary had a little lamb') 22 >>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3]) (22, [], 0, None) >>> [b1, b2, b3] [bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]
Доступность: Unix.
Большинство платформ Unix.
Добавлена в версии 3.3.
-
socket.recvfrom_into(buffer[, nbytes[, flags]]) -
Получить данные из сокета, записав их в buffer вместо создания нового объекта bytestring. Возвращаемое значение — пара
(nbytes, address), где nbytes — количество полученных байтов, а address — адрес сокета, отправившего данные. См. страницу руководства Unix recv(2) для значения необязательного аргумента flags; он по умолчанию равен нулю. (Формат address зависит от семейства адресов — см. выше.)
-
socket.recv_into(buffer[, nbytes[, flags]]) -
Получить до nbytes байтов из сокета, сохранив данные в буфере вместо создания нового объекта bytestring. Если nbytes не указан (или равен 0), получит данные до размера, доступного в данном буфере. Возвращает количество полученных байтов. См. страницу руководства Unix recv(2) для значения необязательного аргумента flags; он по умолчанию равен нулю.
-
socket.send(bytes[, flags]) -
Отправить данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и для
recv()выше. Возвращает количество отправленных байтов. Приложения должны проверять, что все данные были отправлены; если переданы только некоторые данные, приложение должно попытаться передать оставшиеся данные. Для получения дополнительной информации по этому вопросу обратитесь к Руководство по программированию сокетов.Изменено в версии 3.5: Если системный вызов прерван, а обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо повышения исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendall(bytes[, flags]) -
Отправить данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и для
recv()выше. В отличие отsend(), этот метод продолжает отправлять данные из bytes, пока все данные не будут отправлены или не произойдёт ошибка.Noneвозвращается при успехе. При ошибке генерируется исключение, и нет возможности определить, сколько данных, если таковые имеются, было отправлено успешно.Изменено в версии 3.5: Таймаут сокета больше не сбрасывается каждый раз, когда данные отправляются успешно. Теперь таймаут сокета — это максимальное общее время для отправки всех данных.
Изменено в версии 3.5: Если системный вызов прерван, а обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо повышения исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendto(bytes, address) - socket.sendto(bytes, flags, address)
-
Отправить данные в сокет. Сокет не должен быть подключен к удалённому сокету, так как целевой сокет задаётся параметром address. Необязательный параметр flags имеет то же значение, что и для
recv()выше. Возвращает количество отправленных байтов. (Формат address зависит от семейства адресов — см. выше.)Вызывает событие аудита аудита
socket.sendtoс аргументамиself,address.Изменено в версии 3.5: Если системный вызов прерван, и обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов, а не вызывает исключение
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendmsg(buffers[, ancdata[, flags[, address]]]) -
Отправить обычные и вспомогательные данные в сокет, собрав не вспомогательные данные из серии буферов и объединив их в одно сообщение. Параметр buffers задаёт не вспомогательные данные как итерируемый набор байтовых объектов (например,
bytesобъекты); операционная система может установить ограничение (sysconf()значениеSC_IOV_MAX) на количество используемых буферов. Параметр ancdata задаёт вспомогательные данные (сообщения управления) как итерируемый набор нуля или более кортежей(cmsg_level, cmsg_type, cmsg_data), где cmsg_level и cmsg_type — целые числа, указывающие соответственно уровень протокола и тип, специфичный для протокола, а cmsg_data — байтовый объект, содержащий связанные данные. Обратите внимание, что некоторые системы (в частности, системы безCMSG_SPACE()) могут поддерживать отправку только одного управляющего сообщения за вызов. Параметр flags по умолчанию равен 0 и имеет то же значение, что и дляsend(). Если address указан и неNone, он устанавливает целевой адрес для сообщения. Возвращаемое значение — количество байтов не вспомогательных данных, отправленных.Следующая функция отправляет список дескрипторов файлов fds по сокету
AF_UNIX, на системах, поддерживающих механизмSCM_RIGHTS. См. такжеrecvmsg().import socket, array def send_fds(sock, msg, fds): return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])Доступность: Unix, не WASI.
Большинство платформ Unix.
Вызывает событие аудита аудита
socket.sendmsgс аргументамиself,address.Добавлен в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерван, и обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов, а не вызывает исключение
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]]) -
Специализированная версия
sendmsg()для сокетаAF_ALG. Устанавливает режим, IV, длину данных, связанных с AEAD, и флаги для сокетаAF_ALG.Доступность: Linux >= 2.6.38.
Добавлен в версии 3.6.
-
socket.sendfile(file, offset=0, count=None) -
Отправляет файл до достижения конца файла, используя высокопроизводительный
os.sendfileи возвращает общее количество отправленных байтов. file должен быть объектом файла, открытым в двоичном режиме. Еслиos.sendfileнедоступен (например, Windows) или file не является обычным файлом, будет использоватьсяsend(). offset указывает, с какой позиции начать чтение файла. Если указан, count — общее количество байтов для передачи по сравнению с отправкой файла до достижения конца файла. Положение файла обновляется при возврате или в случае ошибки, в этом случаеfile.tell()можно использовать для определения количества отправленных байтов. Сокет должен быть типаSOCK_STREAM. Неблокирующие сокеты не поддерживаются.Добавлен в версии 3.5.
-
socket.set_inheritable(inheritable) -
Установить флаг наследуемости дескриптора файла сокета или дескриптора сокета.
Добавлен в версии 3.4.
-
socket.setblocking(flag) -
Установить режим блокировки или неблокирующего режима сокета: если flag ложно, сокет устанавливается в неблокирующий режим, в противном случае в режим блокировки.
Этот метод является сокращением для определённых вызовов
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.
-
socket.setsockopt(level, optname, value: int)
- socket.setsockopt(level, optname, value: buffer)
- socket.setsockopt(level, optname, None, optlen: int)
-
Установите значение заданного параметра сокета (см. страницу руководства Unix setsockopt(2)). Необходимые символические константы определены в этом модуле (SO_* и др. <socket-unix-constants>). Значение может быть целым числом,
Noneили объектом-подобным байтам, представляющим буфер. В последнем случае вызывающая сторона должна гарантировать, что строка байтов содержит правильные биты (см. необязательный встроенный модульstructдля способа кодирования C-структур в строки байтов). Когда value установлено вNone, аргумент optlen обязателен. Он эквивалентен вызову функции Csetsockopt()сoptval=NULLиoptlen=optlen.Изменено в версии 3.5: Теперь принимается изменяемый объект-подобный байтам.
Изменено в версии 3.6: Добавлена форма setsockopt(level, optname, None, optlen: int).
Доступность: не WASI.
-
socket.shutdown(how) -
Отключить одну или обе половины соединения. Если how равен
SHUT_RD, дальнейшие приёмы запрещены. Если how равенSHUT_WR, дальнейшие отправки запрещены. Если how равенSHUT_RDWR, дальнейшие отправки и приёмы запрещены.Доступность: не WASI.
-
Создать дубликат сокета и подготовить его для совместного использования с целевым процессом. Целевой процесс должен быть указан с помощью process_id. Результирующий объект типа bytes может быть передан целевому процессу с помощью какого-либо механизма межпроцессного взаимодействия, и сокет может быть там воссоздан с помощью
fromshare(). После вызова этого метода закрытие сокета безопасно, поскольку операционная система уже продублировала его для целевого процесса.Доступность: Windows.
Добавлен в версии 3.3.
Обратите внимание, что нет методов read() или write(); используйте recv() и send() без аргумента flags вместо них.
Объекты сокетов также имеют эти (только для чтения) атрибуты, которые соответствуют значениям, заданным в конструктор socket.
-
socket.family -
Семейство сокетов.
-
socket.type -
Тип сокета.
-
socket.proto -
Протокол сокета.
Примечания о тайм-аутах сокетов
Объект сокета может быть в одном из трёх режимов: блокирующем, неблокирующем или режиме тайм-аута. Сокеты по умолчанию всегда создаются в блокирующем режиме, но это можно изменить, вызвав setdefaulttimeout().
- В блокирующем режиме операции блокируются до завершения или возврата ошибки системой (например, тайм-аут соединения).
- В неблокирующем режиме операции завершаются ошибкой (к сожалению, зависимой от системы), если они не могут быть завершены немедленно: функции из модуля
selectмогут быть использованы для определения времени и возможности чтения или записи сокета. - В режиме тайм-аута операции завершаются ошибкой, если они не могут быть завершены в течение заданного тайм-аута для сокета (они генерируют исключение
timeout) или если система возвращает ошибку.
Примечание
На уровне операционной системы сокеты в режиме тайм-аута внутренне устанавливаются в неблокирующий режим. Кроме того, блокирующие и режимы тайм-аута совместно используются между дескрипторами файлов и объектами сокетов, которые ссылаются на один и тот же сетевой конечный пункт. Этот деталь реализации может иметь видимые последствия, если, например, вы решите использовать fileno() сокета.
Тайм-ауты и метод connect
Операция connect() также подчиняется настройкам тайм-аута, и в общем рекомендуется вызывать settimeout() перед вызовом connect() или передать параметр тайм-аута в create_connection(). Однако системный сетевой стек также может вернуть ошибку тайм-аута соединения независимо от настроек тайм-аута Python-сокета.
Тайм-ауты и метод accept
Если getdefaulttimeout() не равен None, сокеты, возвращаемые методом accept(), наследуют этот тайм-аут. В противном случае поведение зависит от настроек сокета прослушивания:
- если сокет прослушивания находится в блокирующем режиме или в режиме тайм-аута, сокет, возвращаемый методом
accept(), находится в блокирующем режиме; - если сокет прослушивания находится в неблокирующем режиме, режим сокета, возвращённого методом
accept(), (блокирующий или неблокирующий) зависит от операционной системы. Для обеспечения кроссплатформенного поведения рекомендуется вручную переопределить это значение.
Пример
Ниже приведены четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который эхом возвращает все полученные данные (обслуживает только одного клиента), и клиент, использующий его. Обратите внимание, что сервер должен выполнить последовательность socket(), bind(), listen(), accept() (возможно, повторяя accept(), чтобы обслуживать более одного клиента), в то время как клиенту требуется только последовательность socket(), connect(). Также обратите внимание, что сервер не выполняет sendall()/recv() на сокете, на котором он прослушивает, а на новом сокете, возвращаемом accept().
Первые два примера поддерживают только IPv4.
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
# Echo client program
import socket
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Следующие два примера идентичны предыдущим двум, но поддерживают как IPv4, так и IPv6. Сторона сервера будет прослушивать первую доступную семейство адресов (он должен прослушивать оба). На большинстве систем с поддержкой IPv6, IPv6 будет иметь приоритет, и сервер может не принимать трафик IPv4. Сторона клиента будет пытаться подключиться ко всем адресам, возвращенным в результате разрешения имени, и отправлять трафик первому успешно подключенному.
# Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.send(data)
# Echo client program
import socket
import sys
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.connect(sa)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
with s:
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Следующий пример демонстрирует, как написать очень простой сниффер сети с сырыми сокетами в Windows. Пример требует прав администратора для модификации интерфейса:
import socket # the public network interface HOST = socket.gethostbyname(socket.gethostname()) # create a raw socket and bind it to the public interface s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) s.bind((HOST, 0)) # Include IP headers s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # receive all packets s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) # receive a packet print(s.recvfrom(65565)) # disabled promiscuous mode s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
Следующий пример показывает, как использовать интерфейс сокета для связи с сетью CAN, используя протокол сырого сокета. Чтобы использовать 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 frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)
can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)
def build_can_frame(can_id, data):
can_dlc = len(data)
data = data.ljust(8, b'\x00')
return struct.pack(can_frame_fmt, can_id, can_dlc, data)
def dissect_can_frame(frame):
can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
return (can_id, can_dlc, data[:can_dlc])
# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))
while True:
cf, addr = s.recvfrom(can_frame_size)
print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))
try:
s.send(cf)
except OSError:
print('Error sending CAN frame')
try:
s.send(build_can_frame(0x01, b'\x01\x02\x03'))
except OSError:
print('Error sending CAN frame')
Запуск примера несколько раз с слишком малым интервалом между запусками может привести к этой ошибке:
OSError: [Errno 98] Address already in use
Это происходит потому, что предыдущее выполнение оставило сокет в TIME_WAIT состоянии, и его нельзя немедленно повторно использовать.
Существует флаг socket, который необходимо установить, чтобы предотвратить это, socket.SO_REUSEADDR:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT))
Флаг SO_REUSEADDR сообщает ядру о повторном использовании локального сокета в TIME_WAIT состоянии без ожидания истечения его естественного таймаута.
См. также
Для ознакомления с программированием сокетов (на C) ознакомьтесь со следующими статьями:
- Вводный учебник по межпроцессной связи 4.3BSD, автором которого является Стюарт Сехрест
- Расширенный учебник по межпроцессной связи 4.3BSD, авторами которого являются Сэмюэл Дж. Леффлер и др.
обе находятся в руководстве для программистов UNIX, дополнительные документы 1 (разделы PS1:7 и PS1:8). Материалы справочной информации, специфичные для платформы, для различных системных вызовов, связанных с сокетами, также являются ценным источником информации о деталях семантики сокетов. Для Unix обратитесь к страницам руководства; для Windows см. спецификацию WinSock (или Winsock 2). Для API, готовых к IPv6, читатели могут обратиться к RFC 3493 с названием «Базовые расширения интерфейса сокетов для IPv6».
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/socket.html