socket — Низкоуровневый интерфейс сетевого взаимодействия
Исходный код: Lib/socket.py
Этот модуль предоставляет доступ к интерфейсу сокетов BSD. Он доступен на всех современных Unix-системах, Windows, MacOS и, вероятно, на дополнительных платформах.
Примечание
Некоторые особенности поведения могут зависеть от платформы, поскольку вызовы выполняются к системным API сокетов операционной системы.
Доступность: отсутствует в Emscripten и WASI.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Дополнительную информацию см. в разделе о платформах WebAssembly.
Интерфейс Python представляет собой простое преобразование интерфейса системных вызовов и библиотек сокетов Unix в объектно-ориентированный стиль Python: функция socket() возвращает объект сокета, методы которого реализуют различные системные вызовы сокетов. Типы параметров несколько более высокого уровня, чем в C-интерфейсе: как и при read() и write() операциях с файлами Python, выделение буфера при приёме данных выполняется автоматически, а длина буфера при отправке подразумевается.
См. также
-
Modulesocketserver -
Классы, упрощающие создание сетевых серверов.
-
Modulessl -
Обёртка TLS/SSL для объектов сокета.
Семейства сокетов
В зависимости от системы и параметров сборки, этот модуль поддерживает различные семейства сокетов.
Формат адреса, требуемый конкретным объектом сокета, автоматически выбирается на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представлены следующим образом:
-
Адрес сокета
AF_UNIX, привязанного к узлу файловой системы, представляется в виде строки, используя кодировку файловой системы и'surrogateescape'обработчик ошибок (см. PEP 383). Адрес в абстрактном пространстве имён Linux возвращается как объект типа bytes-like с начальным нулевым байтом; обратите внимание, что сокеты в этом пространстве имён могут взаимодействовать с обычными сокетами файловой системы, поэтому программам, предназначенным для работы на Linux, может потребоваться обработать оба типа адресов. Для передачи адреса в качестве аргумента можно использовать как строку, так и объект типа bytes-like.Изменено в версии 3.3: Ранее предполагалось, что пути сокетов
AF_UNIXиспользуют кодировку UTF-8.Изменено в версии 3.5: Теперь принимается объект типа writable bytes-like.
-
Пара
(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. Для методов модуляsocketflowinfo и scope_id могут быть опущены только для обратной совместимости. Однако следует учитывать, что пропуск scope_id может вызвать проблемы при работе со скопированными IPv6-адресами.Изменено в версии 3.7: Для адресов мультикаста (с осмысленным scope_id) address может не содержать
%scope_id(илиzone id). Эта информация избыточна и может быть безопасно опущена (рекомендуется). -
AF_NETLINKсокеты представлены как пары(pid, groups). -
Поддержка TIPC только для Linux доступна с использованием семейства адресов
AF_TIPC. TIPC — это открытый протокол сетевого взаимодействия, не основанный на IP, предназначенный для использования в кластерных вычислительных средах. Адреса представляются кортежем, и поля зависят от типа адреса. Общий формат кортежа —(addr_type, v1, v2, v3 [, scope]), где:-
addr_type — один из
TIPC_ADDR_NAMESEQ,TIPC_ADDR_NAME, илиTIPC_ADDR_ID. -
scope — один из
TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPE, иTIPC_NODE_SCOPE. -
Если addr_type —
TIPC_ADDR_NAME, то v1 — тип сервера, v2 — идентификатор порта, а v3 должно быть 0.Если addr_type —
TIPC_ADDR_NAMESEQ, то v1 — тип сервера, v2 — меньший номер порта, а v3 — больший номер порта.Если addr_type —
TIPC_ADDR_ID, то v1 — узел, v2 — ссылка, а v3 должно быть 0.
-
addr_type — один из
-
Кортеж
(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. Строка — имя ядра управления с динамически назначенным идентификатором. Кортеж может использоваться, если известны идентификатор и номер устройства ядра управления или используется зарегистрированный идентификатор.Добавлена в версии 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)где идентификатор контекста или 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 в POSIX C API, включаяgethostbyname_ex()иgethostbyaddr(). Сопутствующее значение — пара(h_errno, string), представляющая ошибку, возвращённую вызовом библиотеки. h_errno — числовое значение, а string представляет описание h_errno, как возвращается функциейhstrerror()C.Изменено в версии 3.3: Этот класс был преобразован в подкласс
OSError.
-
exception socket.gaierror -
Подкласс
OSError, это исключение генерируется для ошибок, связанных с адресами, при использованииgetaddrinfo()иgetnameinfo(). Сопутствующее значение — пара(error, string), представляющая ошибку, возвращённую вызовом библиотеки. string представляет описание error, как возвращается функциейgai_strerror()C. Числовое значение error будет соответствовать одной изEAI_*констант, определённых в этом модуле.Изменено в версии 3.3: Этот класс был преобразован в подкласс
OSError.
-
exception socket.timeout -
Устаревшее псевдоним для
TimeoutError.Подкласс
OSError, это исключение генерируется, когда таймаут происходит на сокете, у которого были включены таймауты через предыдущий вызовsettimeout()(или неявно черезsetdefaulttimeout()). Сопутствующее значение — строка, значение которой в настоящее время всегда равно “timed out”.Изменено в версии 3.3: Этот класс был преобразован в подкласс
OSError.Изменено в версии 3.10: Этот класс был преобразован в псевдоним для
TimeoutError.
Постоянные значения
Постоянные значения AF_* и SOCK_* теперь представляют собой коллекции AddressFamily и SocketKind IntEnum.
Добавлен в версии 3.4.
-
socket.AF_UNIX -
socket.AF_INET -
socket.AF_INET6 -
Эти постоянные значения представляют семейства адресов (и протоколов), используемые в качестве первого аргумента для
socket(). Если постоянное значениеAF_UNIXне определено, то этот протокол не поддерживается. В зависимости от системы могут быть доступны и другие постоянные значения.
-
socket.AF_UNSPEC -
AF_UNSPECозначает, чтоgetaddrinfo()должен возвращать адреса сокетов для любого семейства адресов (IPv4, IPv6 или любого другого), которое может быть использовано.
-
socket.SOCK_STREAM -
socket.SOCK_DGRAM -
socket.SOCK_RAW -
socket.SOCK_RDM -
socket.SOCK_SEQPACKET -
Эти постоянные значения представляют типы сокетов, используемые в качестве второго аргумента для
socket(). В зависимости от системы могут быть доступны и другие постоянные значения. (ТолькоSOCK_STREAMиSOCK_DGRAMкажутся общеполезными.)
-
socket.SOCK_CLOEXEC -
socket.SOCK_NONBLOCK -
Эти два постоянных значения, если определены, могут быть объединены с типами сокетов и позволяют установить некоторые флаги атомарно (чтобы избежать возможных гонок и необходимости отдельных вызовов).
См. также
Обработка защищённых дескрипторов файлов для более подробного объяснения.
Доступность: Linux >= 2.6.27.
Добавлен в версии 3.2.
- SO_*
-
socket.SOMAXCONN - MSG_*
- SOL_*
- SCM_*
- IPPROTO_*
- IPPORT_*
- INADDR_*
- IP_*
- IPV6_*
- EAI_*
- AI_*
- NI_*
- TCP_*
-
Многие постоянные значения этих форм, описанные в документации 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.
-
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-сервису, слушающему на интернет-адресе (кортеж 2-х элементов
(host, port)), и возвращает объект сокета. Эта функция более высокого уровня, чемsocket.connect(): если host — это имя хоста, а не числовое значение, оно попытается разрешить его как дляAF_INET, так и дляAF_INET6, а затем попытается подключиться ко всем возможным адресам по очереди до тех пор, пока подключение не будет успешным. Это упрощает написание клиентов, совместимых как с IPv4, так и с IPv6.Передача необязательного параметра timeout установит таймаут для объекта сокета перед попыткой подключения. Если timeout не указан, используется глобальный параметр таймаута по умолчанию, возвращаемый
getdefaulttimeout().Если указан source_address, он должен быть кортежем 2-х элементов
(host, port)для привязки сокета к своему исходному адресу перед подключением. Если host или port равны ‘’ или 0 соответственно, будет использовано поведение по умолчанию ОС.При невозможности создания соединения генерируется исключение. По умолчанию это исключение из последнего адреса в списке. Если all_errors
True, это группа исключенийExceptionGroup, содержащая ошибки всех попыток.Изменено в версии 3.2: Добавлен параметр source_address.
Изменено в версии 3.11: Добавлен параметр all_errors.
-
socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False) -
Удобная функция, которая создаёт TCP-сокет, привязанный к адресу address (кортеж 2-х элементов
(host, port)), и возвращает объект сокета.family должен быть либо
AF_INET, либоAF_INET6. backlog — размер очереди, переданный вsocket.listen(); если не указан, выбирается разумное значение по умолчанию. reuse_port определяет, следует ли установить параметрSO_REUSEPORTсокета.Если dualstack_ipv6 истинно и платформа поддерживает это, сокет сможет принимать как IPv4, так и IPv6 подключения, иначе будет генерироваться
ValueError. Большинство POSIX платформ и Windows должны поддерживать эту функциональность. Когда эта функциональность включена, адрес, возвращаемыйsocket.getpeername()при подключении IPv4, будет IPv6-адресом, представленным как IPv4-адрес, сопоставленный с IPv6. Если dualstack_ipv6 ложно, эта функциональность будет явно отключена на платформах, которые по умолчанию её включают (например, 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()выше. Дескриптор файла должен ссылаться на сокет, но это не проверяется — последующие операции с объектом могут завершиться ошибкой, если дескриптор файла недействителен. Эта функция редко используется, но может использоваться для получения или установки параметров сокета на сокет, переданный программе в качестве стандартного ввода или вывода (например, сервер, запущенный демоном Unix inet). Предполагается, что сокет находится в режиме блокировки.Новый созданный сокет не наследуется.
Изменено в версии 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=0, type=0, proto=0, flags=0) -
Преобразует аргументы host/port в последовательность 5-кортежей, содержащих все необходимые аргументы для создания сокета, подключенного к указанной службе. host — это доменное имя, строковое представление IPv4/v6 адреса или
None. port — это строковое имя службы, например'http', числовой номер порта илиNone. ПередавNoneв качестве значений host и port, вы можете передатьNULLв подлежащий C API.Аргументы family, type и proto можно указать, чтобы сузить список возвращаемых адресов. Передача нуля в качестве значения каждого из этих аргументов выбирает весь диапазон результатов. Аргумент 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().Возбуждает событие аудита аудита
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 без изменений. Если name пустое или равно'0.0.0.0', возвращается имя хоста изgethostname().
-
socket.gethostbyname(hostname) -
Преобразует имя хоста в формат IPv4-адреса. IPv4-адрес возвращается в виде строки, например
'100.50.200.5'. Если имя хоста само по себе является IPv4-адресом, оно возвращается без изменений. См.gethostbyname_ex()для более полного интерфейса.gethostbyname()не поддерживает разрешение имён IPv6, и вместо него следует использоватьgetaddrinfo()для поддержки IPv4/v6 двойной стековой архитектуры.Возбуждает событие аудита аудита
socket.gethostbynameс аргументомhostname.Доступность: не WASI.
-
socket.gethostbyname_ex(hostname) -
Преобразует имя хоста в формат IPv4-адреса, расширенный интерфейс. Возвращает кортеж из 3 элементов
(hostname, aliaslist, ipaddrlist), где hostname — основное имя хоста, aliaslist — (возможно, пустой) список альтернативных имён хоста для того же адреса, а ipaddrlist — список IPv4-адресов для того же интерфейса на том же хосте (часто, но не всегда, единственный адрес). Для поиска полного доменного имени используйте функциюgetfqdn().gethostbyname_ex()не поддерживает разрешение имён IPv6, и вместо него следует использоватьgetaddrinfo()для поддержки IPv4/v6 двойной стековой архитектуры.Возбуждает событие аудита аудита
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. Обычно это происходит для мультикастовых адресов.Дополнительную информацию об flags вы можете найти в getnameinfo(3).
Возбуждает событие аудита аудита
socket.getnameinfoс аргументомsockaddr.Доступность: не WASI.
-
socket.getprotobyname(protocolname) -
Преобразует имя интернет-протокола (например,
'icmp') в константу, подходящую для передачи в качестве (необязательного) третьего аргумента функцииsocket(). Это обычно необходимо только для сокетов, открытых в режиме «сырой» (SOCK_RAW); для обычных режимов сокетов соответствующий протокол выбирается автоматически, если протокол опущен или равен нулю.Доступность: не WASI.
-
socket.getservbyname(servicename[, protocolname]) -
Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если указано, должно быть
'tcp'или'udp', в противном случае будет соответствовать любой протокол.Вызывает событие аудита
socket.getservbynameс аргументамиservicename,protocolname.Доступность: не WASI.
-
socket.getservbyport(port[, protocolname]) -
Преобразует номер интернет-порта и имя протокола в имя службы для этой службы. Необязательное имя протокола, если указано, должно быть
'tcp'или'udp', в противном случае будет соответствовать любой протокол.Вызывает событие аудита
socket.getservbyportс аргументамиport,protocolname.Доступность: не WASI.
-
socket.ntohl(x) -
Преобразует 32-битные целые положительные числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это пустая операция; в противном случае выполняется операция перестановки 4 байт.
-
socket.ntohs(x) -
Преобразует 16-битные целые положительные числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это пустая операция; в противном случае выполняется операция перестановки 2 байт.
Изменено в версии 3.10: Вызывает
OverflowError, если x не помещается в 16-битное целое без знака.
-
socket.htonl(x) -
Преобразует 32-битные целые положительные числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это пустая операция; в противном случае выполняется операция перестановки 4 байт.
-
socket.htons(x) -
Преобразует 16-битные целые положительные числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это пустая операция; в противном случае выполняется операция перестановки 2 байт.
Изменено в версии 3.10: Вызывает
OverflowError, если x не помещается в 16-битное целое без знака.
-
socket.inet_aton(ip_string) -
Преобразует IPv4-адрес из строкового формата с точками (например, «123.45.67.89») в 32-битный упакованный двоичный формат в виде объекта bytes длиной четыре символа. Это полезно при общении с программой, использующей стандартную библиотеку C, и нуждающейся в объектах типа
in_addr, что является типом C для 32-битного упакованного двоичного представления, возвращаемого этой функцией.inet_aton()также принимает строки с менее чем тремя точками; см. страницу руководства Unix inet(3) для получения подробностей.Если строка IPv4-адреса, переданная в эту функцию, некорректна, будет вызвано исключение
OSError. Обратите внимание, что точное определение допустимости зависит от реализации Cinet_aton().inet_aton()не поддерживает IPv6, иinet_pton()следует использовать вместо этого для поддержки стека IPv4/v6.
-
socket.inet_ntoa(packed_ip) -
Преобразует 32-битный упакованный IPv4-адрес (объект bytes длиной четыре байта) в стандартное строковое представление с точками (например, «123.45.67.89»). Это полезно при общении с программой, использующей стандартную библиотеку C и нуждающейся в объектах типа
in_addr, что является типом C для 32-битных упакованных двоичных данных, которые функция принимает в качестве аргумента.Если последовательность байтов, переданная в эту функцию, не имеет ровно 4 байта в длину, будет вызвана ошибка
OSError.inet_ntoa()не поддерживает IPv6, иinet_ntop()следует использовать вместо этого для поддержки стека IPv4/v6.Изменено в версии 3.5: Теперь принимается изменяемый объект bytes-подобный объект.
-
socket.inet_pton(address_family, ip_string) -
Преобразует IP-адрес из семейно-специфичного строкового формата в упакованный двоичный формат.
inet_pton()полезно, когда библиотека или сетевой протокол требуют объект типаin_addr(аналогичноinet_aton()) илиin6_addr.Поддерживаемые значения для address_family в настоящее время
AF_INETиAF_INET6. Если строка IP-адреса ip_string некорректна, будет вызванаOSError. Обратите внимание, что точное определение допустимости зависит как от значения address_family, так и от реализацииinet_pton().Доступность: Unix, Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
-
socket.inet_ntop(address_family, packed_ip) -
Преобразует упакованный IP-адрес (объект bytes некоторой длины) в стандартное семейно-специфичное строковое представление (например,
'7.10.0.5'или'5aef:2b::8').inet_ntop()полезно, когда библиотека или сетевой протокол возвращает объект типаin_addr(аналогичноinet_ntoa()) илиin6_addr.Поддерживаемые значения для address_family в настоящее время
AF_INETиAF_INET6. Если объект bytes packed_ip не имеет правильной длины для указанного семейства адресов, будет вызванаValueError.OSErrorвызывается при ошибках из вызоваinet_ntop().Доступность: Unix, Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
Изменено в версии 3.5: Теперь принимается изменяемый объект bytes-подобный объект.
-
socket.CMSG_LEN(length) -
Возвращает общую длину, без хвостового заполнения, элемента вспомогательных данных с ассоциированными данными заданной длины. Это значение часто может быть использовано в качестве размера буфера для
recvmsg()для приема одного элемента вспомогательных данных, но RFC 3542 требует от портативных приложений использоватьCMSG_SPACE()и, следовательно, включать место для заполнения, даже когда элемент будет последним в буфере. ВызываетOverflowError, если length выходит за допустимый диапазон значений.Доступность: Unix, не Emscripten, не WASI.
Большинство платформ Unix.
Добавлена в версии 3.3.
-
socket.CMSG_SPACE(length) -
Возвращает размер буфера, необходимый для
recvmsg()для получения элемента данных дополнительной информации с ассоциированными данными заданной длины, а также любым конечным заполнением. Необходимый размер буфера для получения нескольких элементов — сумма значенийCMSG_SPACE()для длин их ассоциированных данных. ВозбуждаетOverflowError, если длина выходит за допустимый диапазон значений.Обратите внимание, что некоторые системы могут поддерживать данные дополнительной информации без предоставления этой функции. Также обратите внимание, что установка размера буфера с помощью результатов этой функции может не точно ограничивать количество данных дополнительной информации, которые могут быть получены, так как дополнительные данные могут поместиться в области заполнения.
Доступность: Unix, не Emscripten, не 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.
Добавлена в версии 3.3.
-
socket.if_nameindex() -
Возвращает список кортежей с информацией о сетевом интерфейсе (индекс int, имя строки).
OSError, если системный вызов завершился ошибкой.Доступность: Unix, Windows, не Emscripten, не 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, не Emscripten, не WASI.
Добавлена в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
См. также
«Имя интерфейса» — это имя, как описано в
if_nameindex().
-
socket.if_indextoname(if_index) -
Возвращает имя сетевого интерфейса, соответствующее номеру индекса интерфейса.
OSError, если интерфейс с заданным индексом не существует.Доступность: Unix, Windows, не Emscripten, не WASI.
Добавлена в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
См. также
«Имя интерфейса» — это имя, как описано в
if_nameindex().
-
socket.send_fds(sock, buffers, fds[, flags[, address]]) -
Отправляет список дескрипторов файлов fds по сокету
AF_UNIXsock. Параметр fds — последовательность дескрипторов файлов. Обратитесь кsendmsg()для документации этих параметров.Доступность: Unix, Windows, не Emscripten, не 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, не Emscripten, не 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), но возвращает индикатор ошибки вместо генерирования исключения для ошибок, возвращаемых вызовом C-уровняconnect()(другие проблемы, такие как «хост не найден», всё ещё могут генерировать исключения). Индикатор ошибки —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) -
- Платформа:
-
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(), но разбросать данные, не относящиеся к дополнительным, по ряду буферов вместо возврата нового объекта байтов. Аргумент buffers должен быть итерируемым объектом, экспортирующим записываемые буферы (например, объектыbytearray); эти буферы будут заполняться последовательными кусками данных, не относящихся к дополнительным, до тех пор, пока все они не будут записаны или больше нет буферов. Операционная система может установить ограничение (значениеsysconf()SC_IOV_MAX) на количество используемых буферов. Аргументы ancbufsize и flags имеют то же значение, что и дляrecvmsg().Возвращаемое значение — кортеж из 4 элементов:
(nbytes, ancdata, msg_flags, address), где nbytes — общее количество байтов данных, не относящихся к дополнительным, записанных в буферы, а ancdata, msg_flags и address такие же, как и дляrecvmsg().Пример:
>>> import socket >>> s1, s2 = socket.socketpair() >>> b1 = bytearray(b'----') >>> b2 = bytearray(b'0123456789') >>> b3 = bytearray(b'--------------') >>> s1.send(b'Mary had a little lamb') 22 >>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3]) (22, [], 0, None) >>> [b1, b2, b3] [bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]
Доступность: Unix.
Большинство платформ Unix.
Добавлена в версии 3.3.
-
socket.recvfrom_into(buffer[, nbytes[, flags]]) -
Получить данные из сокета, записав их в buffer вместо создания новой строки байтов. Возвращаемое значение — пара
(nbytes, address), где nbytes — количество полученных байтов, а address — адрес сокета, отправляющего данные. См. страницу руководства Unix recv(2) для значения необязательного аргумента flags; он по умолчанию равен нулю. (Формат address зависит от семейства адресов — см. выше.)
-
socket.recv_into(buffer[, nbytes[, flags]]) -
Получить до nbytes байтов из сокета, сохранив данные в буфер, а не создавая новую строку байтов. Если 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) -
Отправляет файл до достижения 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 ложно, сокет устанавливается в режим неблокировки, в противном случае — в режим блокировки.
Этот метод — сокращение для определенных вызовов
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). Для IPv6-совместимых API читатели могут обратиться к RFC 3493 с названием «Расширения базового интерфейса сокетов для IPv6».
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/socket.html