socket — Низкоуровневый сетевой интерфейс
Исходный код: Lib/socket.py
Этот модуль предоставляет доступ к интерфейсу socket 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, начинающийся с нулевого байта; обратите внимание, что сокеты в этом пространстве имён могут взаимодействовать с обычными сокетами файловой системы, поэтому программам, предназначенным для работы в Linux, может потребоваться обрабатывать оба типа адресов. При передаче в качестве аргумента для обоих типов адресов можно использовать строку или объект, подобный bytes.Изменено в версии 3.3: Ранее предполагалось, что пути сокетов
AF_UNIXиспользуют кодировку UTF-8.Изменено в версии 3.5: Теперь принимаются записываемые объекты, подобные bytes.
-
Для семейства адресов
AF_INETиспользуется пара(host, port), где host — строка, представляющая имя узла в доменной нотации Интернета, например'daring.cwi.nl', или адрес IPv4, например'100.50.200.5', а port — целое число.- Для адресов IPv4 вместо адреса узла допускаются две специальные формы:
''обозначаетINADDR_ANY, которое используется для привязки ко всем интерфейсам, а строка'<broadcast>'обозначаетINADDR_BROADCAST. Такое поведение несовместимо с IPv6, поэтому, если вы планируете поддерживать IPv6 в своих программах на Python, лучше избегать этих форм.
- Для адресов IPv4 вместо адреса узла допускаются две специальные формы:
-
Для семейства адресов
AF_INET6используется кортеж из четырёх элементов(host, port, flowinfo, scope_id), где flowinfo и scope_id соответствуют членамsin6_flowinfoиsin6_scope_idвstruct sockaddr_in6на языке C. В методах модуляsocketаргументы flowinfo и scope_id можно опустить только для обратной совместимости. Однако обратите внимание, что отсутствие scope_id может вызвать проблемы при работе с IPv6-адресами с областью действия.Изменено в версии 3.7: Для многоадресных адресов (для которых имеет значение scope_id) address может не содержать часть
%scope_id(илиzone id). Эта информация избыточна и может быть безопасно опущена (рекомендуется). -
Сокеты
AF_NETLINKпредставлены парами(pid, groups). -
В Linux доступна поддержка TIPC с использованием семейства адресов
AF_TIPC. TIPC — это открытый сетевой протокол, не основанный на IP и предназначенный для использования в кластерных вычислительных средах. Адреса представлены кортежем, а его поля зависят от типа адреса. Общий вид кортежа:(addr_type, v1, v2, v3 [, scope]), где:-
addr_type — одно из значений
TIPC_ADDR_NAMESEQ,TIPC_ADDR_NAMEилиTIPC_ADDR_ID. -
scope — одно из значений
TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPEиTIPC_NODE_SCOPE. -
Если addr_type равен
TIPC_ADDR_NAME, то v1 — это тип сервера, v2 — идентификатор порта, а v3 должен быть равен 0.Если addr_type равен
TIPC_ADDR_NAMESEQ, то v1 — это тип сервера, v2 — нижний номер порта, а v3 — верхний номер порта.Если addr_type равен
TIPC_ADDR_ID, то v1 — это узел, v2 — ссылка, а v3 должен быть равен 0.
-
addr_type — одно из значений
-
Для семейства адресов
AF_CANиспользуется кортеж(interface, ), где interface — строка, представляющая имя сетевого интерфейса, например'can0'. Имя сетевого интерфейса''можно использовать для приёма пакетов со всех сетевых интерфейсов этого семейства.- Для протокола
CAN_ISOTPтребуется кортеж(interface, rx_addr, tx_addr), где оба дополнительных параметра являются беззнаковыми целыми числами типа long и представляют идентификатор CAN (стандартный или расширенный). - Для протокола
CAN_J1939требуется кортеж(interface, name, pgn, addr), где дополнительные параметры — это 64-разрядное беззнаковое целое число, представляющее имя ECU, 32-разрядное беззнаковое целое число, представляющее номер группы параметров (PGN), и 8-разрядное целое число, представляющее адрес.
- Для протокола
-
Для протокола
SYSPROTO_CONTROLсемействаPF_SYSTEMиспользуется строка или кортеж(id, unit). Строка — это имя элемента управления ядра с динамически назначаемым идентификатором. Кортеж можно использовать, если известны идентификатор и номер устройства элемента управления ядра или используется зарегистрированный идентификатор.Добавлено в версии 3.3.
-
AF_BLUETOOTHподдерживает следующие протоколы и форматы адресов:-
Для
BTPROTO_L2CAPпринимается(bdaddr, psm), гдеbdaddr— строка с адресом Bluetooth, аpsm— целое число. -
Для
BTPROTO_RFCOMMпринимается(bdaddr, channel), гдеbdaddr— строка с адресом Bluetooth, аchannel— целое число. -
Для
BTPROTO_HCIпринимается(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, если целевая система не является конкретной виртуальной машиной. Наsocketопределены следующие константы известных значений VMID:HV_GUID_ZEROHV_GUID_BROADCAST-
HV_GUID_WILDCARD— используется для привязки к самому себе и приёма соединений от всех разделов. -
HV_GUID_CHILDREN— используется для привязки к самому себе и приёма соединений от дочерних разделов. -
HV_GUID_LOOPBACK— используется как цель для самого себя. -
HV_GUID_PARENT— при использовании для привязки принимает соединения от родительского раздела. При использовании в качестве адреса назначения подключается к родительскому разделу.
service_id— это идентификатор зарегистрированной службы.Добавлено в версии 3.12.
Если в части host адреса сокета IPv4/IPv6 указано имя узла, программа может вести себя недетерминированно, поскольку Python использует первый адрес, возвращённый при разрешении DNS-имени. Преобразование адреса сокета в фактический адрес IPv4/IPv6 зависит от результатов разрешения DNS-имени и/или конфигурации узла. Для детерминированного поведения используйте числовой адрес в части host.
Все ошибки приводят к возникновению исключений. Могут возникать обычные исключения, связанные с неверными типами аргументов и нехваткой памяти. Ошибки, связанные с семантикой сокетов или адресов, вызывают OSError или один из его подклассов.
Неблокирующий режим поддерживается с помощью setblocking(). Обобщённый вариант этого режима, основанный на тайм-аутах, поддерживается с помощью settimeout().
Содержимое модуля
Модуль socket экспортирует следующие элементы.
Исключения
-
exception socket.error -
Устаревший псевдоним
OSError.
-
exception socket.herror -
Это исключение, являющееся подклассом
OSError, возникает при ошибках, связанных с адресами, то есть в функциях, использующих h_errno в POSIX C API, включаяgethostbyname_ex()иgethostbyaddr(). Сопутствующее значение — пара(h_errno, string), представляющая ошибку, возвращённую вызовом библиотечной функции. h_errno — числовое значение, а string содержит описание h_errno, возвращённое функцией 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_*
-
В модуле socket также определено множество констант этих форм, описанных в документации Unix по сокетам и/или протоколу IP. Обычно они используются в качестве аргументов методов
setsockopt()иgetsockopt()объектов сокетов. В большинстве случаев определены только те символы, которые указаны в заголовочных файлах Unix; для некоторых символов предусмотрены значения по умолчанию.Изменено в версии 3.6: Добавлены
SO_DOMAIN,SO_PROTOCOL,SO_PEERSEC,SO_PASSSEC,TCP_USER_TIMEOUT,TCP_CONGESTION.Изменено в версии 3.6.5: В Windows константы
TCP_FASTOPEN,TCP_KEEPCNTдоступны, если это поддерживается средой выполнения Windows.Изменено в версии 3.7: Добавлена
TCP_NOTSENT_LOWAT.В Windows константы
TCP_KEEPIDLE,TCP_KEEPINTVLдоступны, если это поддерживается средой выполнения Windows.Изменено в версии 3.10: Добавлена
IP_RECVTOS. ДобавленаTCP_KEEPALIVE. В MacOS эту константу можно использовать так же, какTCP_KEEPIDLEв Linux.Изменено в версии 3.11: Добавлена
TCP_CONNECTION_INFO. В MacOS эту константу можно использовать так же, какTCP_INFOв Linux и BSD.Изменено в версии 3.12: Добавлены
SO_RTABLEиSO_USER_COOKIE. В OpenBSD и FreeBSD соответственно эти константы можно использовать так же, какSO_MARKв Linux. Также добавлены отсутствовавшие параметры сокетов TCP из Linux:TCP_MD5SIG,TCP_THIN_LINEAR_TIMEOUTS,TCP_THIN_DUPACK,TCP_REPAIR,TCP_REPAIR_QUEUE,TCP_QUEUE_SEQ,TCP_REPAIR_OPTIONS,TCP_TIMESTAMP,TCP_CC_INFO,TCP_SAVE_SYN,TCP_SAVED_SYN,TCP_REPAIR_WINDOW,TCP_FASTOPEN_CONNECT,TCP_ULP,TCP_MD5SIG_EXT,TCP_FASTOPEN_KEY,TCP_FASTOPEN_NO_COOKIE,TCP_ZEROCOPY_RECEIVE,TCP_INQ,TCP_TX_DELAY. ДобавленыIP_PKTINFO,IP_UNBLOCK_SOURCE,IP_BLOCK_SOURCE,IP_ADD_SOURCE_MEMBERSHIP,IP_DROP_SOURCE_MEMBERSHIP.
-
socket.AF_CAN -
socket.PF_CAN - SOL_CAN_*
- CAN_*
-
В модуле socket также определено множество констант этих форм, описанных в документации Linux.
Доступность: 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; однако при чтении из сокета необходимо принимать оба типа кадров.
Эта константа описана в документации Linux.
Доступность: Linux >= 3.6.
Добавлено в версии 3.5.
-
socket.CAN_RAW_JOIN_FILTERS -
Объединяет применённые фильтры CAN так, чтобы в пространство пользователя передавались только кадры CAN, соответствующие всем заданным фильтрам CAN.
Эта константа описана в документации Linux.
Доступность: Linux >= 4.1.
Добавлено в версии 3.9.
-
socket.CAN_ISOTP -
CAN_ISOTP в семействе протоколов CAN — это протокол ISO-TP (ISO 15765-2). Константы ISO-TP описаны в документации Linux.
Доступность: Linux >= 2.6.25.
Добавлено в версии 3.7.
-
socket.CAN_J1939 -
CAN_J1939 в семействе протоколов CAN — это протокол SAE J1939. Константы J1939 описаны в документации Linux.
Доступность: Linux >= 5.4.
Добавлено в версии 3.9.
-
socket.AF_DIVERT -
socket.PF_DIVERT -
Эти две константы, описанные в справочной странице FreeBSD divert(4), также определены в модуле socket.
Доступность: FreeBSD >= 14.0.
Добавлено в версии 3.12.
-
socket.AF_PACKET -
socket.PF_PACKET - PACKET_*
-
В модуле socket также определено множество констант этих форм, описанных в документации Linux.
Доступность: Linux >= 2.2.
-
socket.ETH_P_ALL -
ETH_P_ALLможно использовать в конструктореsocketв качестве proto для семействаAF_PACKET, чтобы захватывать все пакеты независимо от протокола.Дополнительную информацию см. на справочной странице packet(7).
Доступность: Linux.
Добавлено в версии 3.12.
-
socket.AF_RDS -
socket.PF_RDS -
socket.SOL_RDS - RDS_*
-
В модуле socket также определено множество констант этих форм, описанных в документации Linux.
Доступность: Linux >= 2.6.30.
Добавлено в версии 3.3.
-
socket.SIO_RCVALL -
socket.SIO_KEEPALIVE_VALS -
socket.SIO_LOOPBACK_FAST_PATH - RCVALL_*
-
Константы для WSAIoctl() в Windows. Они используются в качестве аргументов метода
ioctl()объектов сокетов.Изменено в версии 3.6: Добавлена
SIO_LOOPBACK_FAST_PATH.
- TIPC_*
-
Константы, связанные с TIPC и соответствующие константам, экспортируемым C API сокетов. Дополнительную информацию см. в документации TIPC.
-
socket.AF_ALG -
socket.SOL_ALG - ALG_*
-
Константы для криптографии ядра Linux.
Доступность: Linux >= 2.6.38.
Добавлено в версии 3.6.
-
socket.AF_VSOCK -
socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID - VMADDR*
- SO_VM*
-
Константы для связи между хостом и гостевой системой в Linux.
Доступность: Linux >= 4.8.
Добавлено в версии 3.7.
-
socket.AF_LINK -
Доступность: BSD, macOS.
Добавлено в версии 3.4.
-
socket.has_ipv6 -
Эта константа содержит логическое значение, указывающее, поддерживается ли IPv6 на данной платформе.
-
socket.BDADDR_ANY -
socket.BDADDR_LOCAL -
Это строковые константы, содержащие адреса Bluetooth со специальным значением. Например,
BDADDR_ANYможно использовать для обозначения любого адреса при указании привязки сокета с помощьюBTPROTO_RFCOMM.
-
socket.HCI_FILTER -
socket.HCI_TIME_STAMP -
socket.HCI_DATA_DIR -
Используются с
BTPROTO_HCI.HCI_FILTERнедоступна в 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; они эквивалентны SO_PASSCRED в Linux/DragonFlyBSD. LOCAL_CREDS отправляет учётные данные при первом чтении, а LOCAL_CREDS_PERSISTENT — при каждом чтении; в последнем случае для типа сообщения необходимо использовать SCM_CREDS2.
Добавлено в версии 3.11.
Доступность: FreeBSD.
-
socket.SO_INCOMING_CPU -
Константа для оптимизации локальности процессора; используется совместно с
SO_REUSEPORT.Добавлено в версии 3.11.
Доступность: Linux >= 3.9
-
socket.AF_HYPERV -
socket.HV_PROTOCOL_RAW -
socket.HVSOCKET_CONNECT_TIMEOUT -
socket.HVSOCKET_CONNECT_TIMEOUT_MAX -
socket.HVSOCKET_CONNECTED_SUSPEND -
socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU -
socket.HV_GUID_ZERO -
socket.HV_GUID_WILDCARD -
socket.HV_GUID_BROADCAST -
socket.HV_GUID_CHILDREN -
socket.HV_GUID_LOOPBACK -
socket.HV_GUID_PARENT -
Константы для сокетов Windows Hyper-V, обеспечивающих связь между хостом и гостевой системой.
Доступность: Windows.
Добавлено в версии 3.12.
-
socket.ETHERTYPE_ARP -
socket.ETHERTYPE_IP -
socket.ETHERTYPE_IPV6 -
socket.ETHERTYPE_VLAN -
Константы — номера протоколов IEEE 802.3.
Доступность: Linux, FreeBSD, macOS.
Добавлено в версии 3.12.
-
socket.SHUT_RD -
socket.SHUT_WR -
socket.SHUT_RDWR -
Эти константы используются методом
shutdown()объектов сокетов.Доступность: недоступно в WASI.
Функции
Создание сокетов
Следующие функции создают объекты сокетов.
-
class socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -
Создаёт новый сокет с заданными семейством адресов, типом сокета и номером протокола. Семейство адресов должно быть
AF_INET(по умолчанию),AF_INET6,AF_UNIX,AF_CAN,AF_PACKETилиAF_RDS. Тип сокета должен бытьSOCK_STREAM(по умолчанию),SOCK_DGRAM,SOCK_RAWили, возможно, одной из других константSOCK_. Обычно номер протокола равен нулю, и его можно не указывать. Если же семейством адресов являетсяAF_CAN, протоколом должен быть один изCAN_RAW,CAN_BCM,CAN_ISOTPилиCAN_J1939.Если указан fileno, значения family, type и proto автоматически определяются по заданному файловому дескриптору. Автоматическое определение можно переопределить, вызвав функцию с явными аргументами family, type или proto. Это влияет только на то, как Python представляет, например, возвращаемое значение
socket.getpeername(), но не на фактический ресурс ОС. В отличие отsocket.fromfd(), fileno вернёт тот же сокет, а не его дубликат. Это может помочь закрыть отсоединённый сокет с помощьюsocket.close().Созданный сокет является ненаследуемым.
Вызывает событие аудита
socket.__new__с аргументамиself,family,type,protocol.Изменено в версии 3.3: Добавлено семейство AF_CAN. Добавлено семейство AF_RDS.
Изменено в версии 3.4: Добавлен протокол CAN_BCM.
Изменено в версии 3.4: Возвращаемый сокет теперь является ненаследуемым.
Изменено в версии 3.7: Добавлен протокол CAN_ISOTP.
Изменено в версии 3.7: Если к type применяются битовые флаги
SOCK_NONBLOCKилиSOCK_CLOEXEC, они сбрасываются, иsocket.typeих не отражает. При этом они всё равно передаются нижележащему системному вызовуsocket(). Поэтомуsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK)по-прежнему создаст неблокирующий сокет в ОС, поддерживающих
SOCK_NONBLOCK, ноsock.typeбудет установлено вsocket.SOCK_STREAM.Изменено в версии 3.9: Добавлен протокол CAN_J1939.
Изменено в версии 3.10: Добавлен протокол IPPROTO_MPTCP.
-
socket.socketpair([family[, type[, proto]]]) -
Создаёт пару соединённых объектов сокетов с заданными семейством адресов, типом сокета и номером протокола. Семейство адресов, тип сокета и номер протокола задаются так же, как для описанной выше функции
socket(). По умолчанию используется семействоAF_UNIX, если оно определено на платформе; в противном случае по умолчанию используетсяAF_INET.Созданные сокеты являются ненаследуемыми.
Изменено в версии 3.2: Возвращаемые объекты сокетов теперь поддерживают весь API сокетов, а не только его часть.
Изменено в версии 3.4: Возвращаемые сокеты теперь являются ненаследуемыми.
Изменено в версии 3.5: Добавлена поддержка Windows.
-
socket.create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False) -
Подключается к TCP-службе, прослушивающей интернет-адрес address (кортеж из двух элементов
(host, port)), и возвращает объект сокета. Это функция более высокого уровня, чемsocket.connect(): если host — нечисловое имя узла, функция попытается разрешить его для обоих семействAF_INETиAF_INET6, а затем по очереди подключиться ко всем возможным адресам, пока соединение не будет установлено. Это упрощает написание клиентов, совместимых как с IPv4, так и с IPv6.Передача необязательного параметра timeout задаёт тайм-аут для экземпляра сокета перед попыткой подключения. Если timeout не указан, используется глобальное значение тайм-аута по умолчанию, возвращаемое функцией
getdefaulttimeout().Если указан, source_address должен быть кортежем из двух элементов
(host, port), к которому сокет привязывается как к адресу источника перед подключением. Если значение host или port равно ‘’ или 0 соответственно, используется поведение ОС по умолчанию.Если установить соединение не удаётся, возникает исключение. По умолчанию это исключение, возникшее при попытке подключения к последнему адресу в списке. Если all_errors равно
True, возникаетExceptionGroup, содержащая ошибки всех попыток.Изменено в версии 3.2: Добавлен параметр source_address.
Изменено в версии 3.11: Добавлен параметр all_errors.
-
socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False) -
Вспомогательная функция, которая создаёт TCP-сокет, привязанный к адресу address (кортежу из двух элементов
(host, port)), и возвращает объект сокета.family должен быть равен
AF_INETилиAF_INET6. backlog — размер очереди, передаваемый функцииsocket.listen(); если он не указан, выбирается разумное значение по умолчанию. Параметр reuse_port определяет, следует ли устанавливать параметр сокетаSO_REUSEPORT.Если dualstack_ipv6 имеет значение true и платформа поддерживает эту возможность, сокет сможет принимать как соединения 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в базовый API C.Аргументы family, type и proto можно указать необязательно, чтобы задать параметры и ограничить список возвращаемых адресов. Чтобы не ограничивать результаты, передайте значения по умолчанию (
AF_UNSPEC, 0 и 0 соответственно). Подробности см. в примечании ниже.Аргумент flags может быть одной или несколькими константами
AI_*и влияет на способ вычисления и возврата результатов. Например,AI_NUMERICHOSTотключает разрешение доменных имён и вызывает ошибку, если host является доменным именем.Функция возвращает список кортежей из 5 элементов следующей структуры:
(family, type, proto, canonname, sockaddr)В этих кортежах family, type и proto — целые числа, предназначенные для передачи функции
socket(). canonname будет строкой, представляющей каноническое имя узла host, еслиAI_CANONNAMEвходит в аргумент flags; в противном случае canonname будет пустой строкой. sockaddr — это кортеж с адресом сокета, формат которого зависит от возвращённого значения family (кортеж из 2 элементов(address, port)дляAF_INET, кортеж из 4 элементов(address, port, flowinfo, scope_id)для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()не поддерживает разрешение имён 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 к части host добавляется
%scope_id, если sockaddr содержит значимое значение scope_id. Обычно это происходит для адресов многоадресной рассылки.Дополнительные сведения об аргументе flags см. в getnameinfo(3).
Вызывает событие аудита
socket.getnameinfoс аргументомsockaddr.Доступность: недоступно в WASI.
-
socket.getprotobyname(protocolname) -
Преобразует имя интернет-протокола (например,
'icmp') в константу, подходящую для передачи в качестве необязательного третьего аргумента функцииsocket(). Обычно это требуется только для сокетов, открытых в «сыром» режиме (SOCK_RAW); для обычных режимов сокетов правильный протокол выбирается автоматически, если он не указан или равен нулю.Доступность: недоступно в WASI.
-
socket.getservbyname(servicename[, protocolname]) -
Преобразует имя интернет-службы и имя протокола в номер порта этой службы. Необязательное имя протокола, если оно указано, должно быть
'tcp'или'udp'; в противном случае подходит любой протокол.Вызывает событие аудита
socket.getservbynameс аргументамиservicename,protocolname.Доступность: недоступно в WASI.
-
socket.getservbyport(port[, protocolname]) -
Преобразует номер интернет-порта и имя протокола в имя службы, использующей этот порт. Необязательное имя протокола, если оно указано, должно быть
'tcp'или'udp'; в противном случае подходит любой протокол.Вызывает событие аудита
socket.getservbyportс аргументамиport,protocolname.Доступность: недоступно в WASI.
-
socket.ntohl(x) -
Преобразует положительные 32-разрядные целые числа из сетевого порядка байтов в порядок байтов узла. На компьютерах, где порядок байтов узла совпадает с сетевым порядком байтов, функция ничего не делает; в противном случае она меняет местами байты в 4-байтовом значении.
-
socket.ntohs(x) -
Преобразует положительные 16-разрядные целые числа из сетевого порядка байтов в порядок байтов узла. На компьютерах, где порядок байтов узла совпадает с сетевым порядком байтов, функция ничего не делает; в противном случае она меняет местами байты в 2-байтовом значении.
Изменено в версии 3.10: вызывает
OverflowError, если значение x не помещается в беззнаковое 16-разрядное целое число.
-
socket.htonl(x) -
Преобразует положительные 32-разрядные целые числа из порядка байтов узла в сетевой порядок байтов. На компьютерах, где порядок байтов узла совпадает с сетевым порядком байтов, функция ничего не делает; в противном случае она меняет местами байты в 4-байтовом значении.
-
socket.htons(x) -
Преобразует положительные 16-разрядные целые числа из порядка байтов узла в сетевой порядок байтов. На компьютерах, где порядок байтов узла совпадает с сетевым порядком байтов, функция ничего не делает; в противном случае она меняет местами байты в 2-байтовом значении.
Изменено в версии 3.10: вызывает
OverflowError, если значение x не помещается в беззнаковое 16-разрядное целое число.
-
socket.inet_aton(ip_string) -
Преобразует адрес IPv4 из строкового формата с точками (например, ‘123.45.67.89’) в упакованный двоичный формат длиной 32 бита — объект bytes из четырёх символов. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа
in_addr— типа C для упакованных 32-разрядных двоичных данных, возвращаемых этой функцией.inet_aton()также принимает строки, содержащие менее трёх точек; подробности см. на странице руководства Unix inet(3).Если переданная этой функции строка адреса IPv4 недопустима, будет вызвано исключение
OSError. Обратите внимание, что конкретный набор допустимых значений зависит от базовой реализации Cinet_aton().inet_aton()не поддерживает IPv6; для поддержки IPv4/v6 в двойном стеке следует использоватьinet_pton().
-
socket.inet_ntoa(packed_ip) -
Преобразует упакованный 32-разрядный адрес IPv4 (четырёхбайтовый объект, подобный bytes) в его стандартное строковое представление с точками (например, ‘123.45.67.89’). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа
in_addr— типа C для упакованных 32-разрядных двоичных данных, принимаемых этой функцией в качестве аргумента.Если переданная этой функции последовательность байтов имеет длину, отличную от 4 байт, будет вызвано исключение
OSError.inet_ntoa()не поддерживает IPv6; для поддержки IPv4/v6 в двойном стеке следует использоватьinet_ntop().Изменено в версии 3.5: теперь принимаются записываемые объекты, подобные bytes.
-
socket.inet_pton(address_family, ip_string) -
Преобразует IP-адрес из строкового формата, специфичного для семейства адресов, в упакованный двоичный формат.
inet_pton()полезна, когда библиотеке или сетевому протоколу требуется объект типаin_addr(аналогичныйinet_aton()) илиin6_addr.В настоящее время допустимыми значениями address_family являются
AF_INETиAF_INET6. Если строка IP-адреса ip_string недопустима, будет вызвано исключениеOSError. Обратите внимание, что конкретный набор допустимых значений зависит как от значения address_family, так и от базовой реализацииinet_pton().Доступность: Unix, Windows.
Изменено в версии 3.4: добавлена поддержка Windows
-
socket.inet_ntop(address_family, packed_ip) -
Преобразует упакованный IP-адрес (объект подобный bytes некоторой длины) в стандартное строковое представление, специфичное для семейства адресов (например,
'7.10.0.5'или'5aef:2b::8').inet_ntop()полезна, когда библиотека или сетевой протокол возвращает объект типаin_addr(аналогичныйinet_ntoa()) илиin6_addr.В настоящее время допустимыми значениями address_family являются
AF_INETиAF_INET6. Если объект bytes packed_ip имеет длину, не соответствующую указанному семейству адресов, будет вызвано исключениеValueError. При ошибках вызоваinet_ntop()вызывается исключениеOSError.Доступность: Unix, Windows.
Изменено в версии 3.4: добавлена поддержка Windows
Изменено в версии 3.5: теперь принимаются записываемые объекты, подобные bytes.
-
socket.CMSG_LEN(length) -
Возвращает полную длину элемента вспомогательных данных с данными указанной длины length, не включая завершающее заполнение. Это значение часто можно использовать как размер буфера для
recvmsg(), чтобы получить один элемент вспомогательных данных, однако RFC 3542 требует, чтобы переносимые приложения использовалиCMSG_SPACE()и, таким образом, выделяли место для заполнения, даже если элемент будет последним в буфере. ВызываетOverflowError, если length выходит за допустимый диапазон значений.Доступность: Unix, недоступно в Emscripten и WASI.
Большинство платформ Unix.
Добавлено в версии 3.3.
-
socket.CMSG_SPACE(length) -
Возвращает размер буфера, необходимый функции
recvmsg()для получения элемента вспомогательных данных с данными указанной длины length, включая любое завершающее заполнение. Размер буфера, необходимый для получения нескольких элементов, равен сумме значенийCMSG_SPACE()для длин соответствующих данных. ВызываетOverflowError, если length выходит за допустимый диапазон значений.Обратите внимание, что некоторые системы могут поддерживать вспомогательные данные, не предоставляя эту функцию. Также обратите внимание, что установка размера буфера с использованием результата этой функции может не обеспечивать точное ограничение объёма получаемых вспомогательных данных, поскольку дополнительная информация может поместиться в области заполнения.
Доступность: Unix, недоступно в Emscripten и WASI.
Большинство платформ Unix.
Добавлено в версии 3.3.
-
socket.getdefaulttimeout() -
Возвращает время ожидания по умолчанию в секундах (число с плавающей точкой) для новых объектов сокетов. Значение
Noneозначает, что у новых объектов сокетов нет времени ожидания. При первом импорте модуля socket значение по умолчанию равноNone.
-
socket.setdefaulttimeout(timeout) -
Задаёт время ожидания по умолчанию в секундах (число с плавающей точкой) для новых объектов сокетов. При первом импорте модуля socket значение по умолчанию равно
None. Возможные значения и их значения см. вsettimeout().
-
socket.sethostname(name) -
Задаёт компьютеру имя узла name. Если у вас недостаточно прав, будет вызвано исключение
OSError.Вызывает событие аудита
socket.sethostnameс аргументомname.Доступность: Unix.
Добавлено в версии 3.3.
-
socket.if_nameindex() -
Возвращает список кортежей со сведениями о сетевых интерфейсах (индекс — целое число, имя — строка). Если системный вызов завершается с ошибкой, вызывается
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: Теперь при возникновении ошибки во время вызова базовой функции
close()вызывается исключениеOSError.Примечание
close()освобождает ресурс, связанный с подключением, но не обязательно сразу закрывает само подключение. Чтобы закрыть подключение без задержки, вызовитеshutdown()передclose().
-
socket.connect(address) -
Подключиться к удалённому сокету по адресу address. (Формат address зависит от семейства адресов — см. выше.)
Если подключение прервано сигналом, метод ожидает его завершения или, при истечении времени ожидания, вызывает исключение
TimeoutError, если обработчик сигнала не вызывает исключение, а сокет работает в блокирующем режиме или для него задано время ожидания. Для неблокирующих сокетов метод вызывает исключениеInterruptedError, если подключение прервано сигналом (либо вызывает исключение, возникшее в обработчике сигнала).Вызывает событие аудита
socket.connectс аргументамиself,address.Изменено в версии 3.5: Теперь метод ожидает завершения подключения вместо того, чтобы вызывать исключение
InterruptedError, если подключение прервано сигналом, обработчик сигнала не вызывает исключение, а сокет работает в блокирующем режиме или для него задано время ожидания (обоснование см. в PEP 475).Доступность: не WASI.
-
socket.connect_ex(address) -
Как
connect(address), но возвращает индикатор ошибки вместо вызова исключения при ошибках, возвращённых вызовомconnect()на уровне C (другие проблемы, например «узел не найден», по-прежнему могут вызывать исключения). Индикатор ошибки равен0, если операция выполнена успешно; в противном случае он равен значению переменнойerrno. Это полезно, например, для поддержки асинхронных подключений.Вызывает событие аудита
socket.connectс аргументамиself,address.Доступность: не WASI.
-
socket.detach() -
Перевести объект сокета в закрытое состояние, не закрывая при этом базовый файловый дескриптор. Файловый дескриптор возвращается и может быть повторно использован для других целей.
Добавлено в версии 3.2.
-
socket.dup() -
Создать дубликат сокета.
Созданный сокет является ненаследуемым.
Изменено в версии 3.4: Теперь сокет является ненаследуемым.
Доступность: не WASI.
-
socket.fileno() -
Вернуть файловый дескриптор сокета (небольшое целое число) или -1 в случае ошибки. Это полезно вместе с
select.select().В Windows небольшое целое число, возвращаемое этим методом, нельзя использовать там, где можно использовать файловый дескриптор (например, в
os.fdopen()). В Unix такого ограничения нет.
-
socket.get_inheritable() -
Получить флаг наследования файлового дескриптора или дескриптора сокета:
True, если сокет может наследоваться дочерними процессами, иFalse, если не может.Добавлено в версии 3.4.
-
socket.getpeername() -
Вернуть адрес удалённой стороны, к которой подключён сокет. Это полезно, например, для определения номера порта удалённого сокета IPv4/IPv6. (Формат возвращаемого адреса зависит от семейства адресов — см. выше.) В некоторых системах эта функция не поддерживается.
-
socket.getsockname() -
Вернуть собственный адрес сокета. Это полезно, например, для определения номера порта сокета IPv4/IPv6. (Формат возвращаемого адреса зависит от семейства адресов — см. выше.)
-
socket.getsockopt(level, optname[, buflen]) -
Вернуть значение указанного параметра сокета (см. страницу руководства Unix getsockopt(2)). Необходимые символьные константы (SO_* и т. д.) определены в этом модуле. Если buflen не указан, предполагается, что параметр является целочисленным, и функция возвращает его целочисленное значение. Если buflen указан, он задаёт максимальный размер буфера для получения параметра, и этот буфер возвращается в виде объекта bytes. Вызывающий код должен самостоятельно декодировать содержимое буфера (способ декодирования структур C, закодированных в виде байтовых строк, см. в необязательном встроенном модуле
struct).Доступность: не WASI.
-
socket.getblocking() -
Вернуть
True, если сокет работает в блокирующем режиме, иFalse, если в неблокирующем.Эквивалентно проверке
socket.gettimeout() != 0.Добавлено в версии 3.7.
-
socket.gettimeout() -
Вернуть время ожидания в секундах (число с плавающей точкой), связанное с операциями сокета, или
None, если время ожидания не задано. Это значение отражает последний вызовsetblocking()илиsettimeout().
-
socket.ioctl(control, option) -
- Платформа:
-
Windows
Метод
ioctl()предоставляет ограниченный интерфейс к системному интерфейсу WSAIoctl. Дополнительные сведения см. в документации Win32.На других платформах можно использовать универсальные функции
fcntl.fcntl()иfcntl.ioctl(); они принимают объект сокета в качестве первого аргумента.В настоящее время поддерживаются только следующие управляющие коды:
SIO_RCVALL,SIO_KEEPALIVE_VALSиSIO_LOOPBACK_FAST_PATH.Изменено в версии 3.6: Добавлен
SIO_LOOPBACK_FAST_PATH.
-
socket.listen([backlog]) -
Разрешить серверу принимать подключения. Если указан параметр backlog, он должен быть не меньше 0 (если он меньше, его значение устанавливается равным 0); он задаёт число неподтверждённых подключений, которое система допускает до отказа в новых подключениях. Если параметр не указан, выбирается разумное значение по умолчанию.
Доступность: не WASI.
Изменено в версии 3.5: Параметр backlog теперь необязателен.
-
socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None) -
Вернуть файловый объект, связанный с сокетом. Точный тип возвращаемого объекта зависит от аргументов, переданных в
makefile(). Эти аргументы интерпретируются так же, как и встроенной функциейopen(), за исключением того, что поддерживаются только следующие значения mode:'r'(по умолчанию),'w','b'или их комбинация.Сокет должен работать в блокирующем режиме; для него можно задать время ожидания, но при его истечении внутренний буфер файлового объекта может перейти в несогласованное состояние.
Закрытие файлового объекта, возвращённого
makefile(), не закроет исходный сокет, пока не будут закрыты все остальные файловые объекты и для объекта сокета не будет вызванsocket.close().Примечание
В Windows файловый объект, созданный с помощью
makefile(), нельзя использовать там, где ожидается файловый объект с файловым дескриптором, например в аргументах потоков функцииsubprocess.Popen().
-
socket.recv(bufsize[, flags]) -
Получить данные из сокета. Возвращаемое значение — объект bytes, представляющий полученные данные. Максимальный объём данных, получаемых за один раз, задаётся параметром bufsize. Пустой объект bytes означает, что клиент отключился. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию оно равно нулю.
Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение
InterruptedError(обоснование см. в PEP 475).
-
socket.recvfrom(bufsize[, flags]) -
Получить данные из сокета. Возвращаемое значение — пара
(bytes, address), где bytes — объект bytes, представляющий полученные данные, а address — адрес сокета, отправившего данные. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию оно равно нулю. (Формат address зависит от семейства адресов — см. выше.)Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение
InterruptedError(обоснование см. в PEP 475).Изменено в версии 3.7: Для группового IPv6-адреса первый элемент address больше не содержит часть
%scope_id. Чтобы получить полный IPv6-адрес, используйтеgetnameinfo().
-
socket.recvmsg(bufsize[, ancbufsize[, flags]]) -
Получить из сокета обычные данные (до bufsize байт) и вспомогательные данные. Аргумент ancbufsize задаёт размер в байтах внутреннего буфера, используемого для получения вспомогательных данных; по умолчанию он равен 0, то есть вспомогательные данные не будут получены. Подходящие размеры буфера для вспомогательных данных можно вычислить с помощью
CMSG_SPACE()илиCMSG_LEN(); элементы, не помещающиеся в буфер, могут быть усечены или отброшены. Аргумент flags по умолчанию равен 0 и имеет то же значение, что и дляrecv().Возвращаемое значение — кортеж из 4 элементов:
(data, ancdata, msg_flags, address). Элемент data — объектbytes, содержащий полученные данные, не являющиеся вспомогательными. Элемент ancdata — список из нуля или более кортежей(cmsg_level, cmsg_type, cmsg_data), представляющих полученные вспомогательные данные (управляющие сообщения): cmsg_level и cmsg_type — целые числа, задающие соответственно уровень протокола и тип, специфичный для протокола, а cmsg_data — объектbytes, содержащий связанные данные. Элемент msg_flags — результат побитового ИЛИ различных флагов, указывающих на условия получения сообщения; подробности см. в документации к вашей системе. Если принимающий сокет не подключён, значение address — адрес отправляющего сокета, если он доступен; в противном случае оно не определено.В некоторых системах с помощью
sendmsg()иrecvmsg()можно передавать файловые дескрипторы между процессами через сокетAF_UNIX. При использовании этого механизма (часто он ограничен сокетамиSOCK_STREAM)recvmsg()возвращает во вспомогательных данных элементы вида(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds), где fds — объектbytes, представляющий новые файловые дескрипторы в виде двоичного массива элементов собственного типа C int. Если после возврата системного вызоваrecvmsg()вызывает исключение, метод сначала попытается закрыть все файловые дескрипторы, полученные этим способом.Некоторые системы не сообщают длину усечённых вспомогательных данных, полученных лишь частично. Если кажется, что элемент выходит за пределы буфера,
recvmsg()выдаст предупреждениеRuntimeWarningи вернёт ту часть элемента, которая помещается в буфер, если она не была усечена до начала связанных с ней данных.В системах, поддерживающих механизм
SCM_RIGHTS, следующая функция получит до maxfds файловых дескрипторов и вернёт данные сообщения и список с дескрипторами (игнорируя при этом неожиданные ситуации, например получение несвязанных управляющих сообщений). См. такжеsendmsg().import socket, array def recv_fds(sock, msglen, maxfds): fds = array.array("i") # Array of ints msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize)) for cmsg_level, cmsg_type, cmsg_data in ancdata: if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS: # Append data, ignoring any truncated integers at the end. fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) return msg, list(fds)Доступность: Unix.
Большинство платформ Unix.
Добавлено в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение
InterruptedError(обоснование см. в PEP 475).
-
socket.recvmsg_into(buffers[, ancbufsize[, flags]]) -
Получить из сокета обычные и вспомогательные данные, как это делает
recvmsg(), но распределить обычные данные по нескольким буферам вместо возврата нового объекта bytes. Аргумент buffers должен быть итерируемым объектом, содержащим объекты, предоставляющие доступные для записи буферы (например, объектыbytearray); в них последовательно записываются фрагменты обычных данных, пока все данные не будут записаны или не закончатся буферы. Операционная система может ограничивать количество используемых буферов (значениеsysconf()SC_IOV_MAX). Аргументы ancbufsize и flags имеют то же значение, что и дляrecvmsg().Возвращаемое значение — кортеж из 4 элементов:
(nbytes, ancdata, msg_flags, address), где nbytes — общее количество байтов обычных данных, записанных в буферы, а ancdata, msg_flags и address имеют то же значение, что и дляrecvmsg().Пример:
>>> import socket >>> s1, s2 = socket.socketpair() >>> b1 = bytearray(b'----') >>> b2 = bytearray(b'0123456789') >>> b3 = bytearray(b'--------------') >>> s1.send(b'Mary had a little lamb') 22 >>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3]) (22, [], 0, None) >>> [b1, b2, b3] [bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]
Доступность: Unix.
Большинство платформ Unix.
Добавлено в версии 3.3.
-
socket.recvfrom_into(buffer[, nbytes[, flags]]) -
Получить данные из сокета, записав их в buffer вместо создания новой байтовой строки. Возвращаемое значение — пара
(nbytes, address), где nbytes — количество полученных байтов, а address — адрес сокета, отправившего данные. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию оно равно нулю. (Формат address зависит от семейства адресов — см. выше.)
-
socket.recv_into(buffer[, nbytes[, flags]]) -
Получить из сокета до nbytes байтов, сохранив данные в буфере вместо создания новой байтовой строки. Если nbytes не указан (или равен 0), получить данные в объёме, доступном в заданном буфере. Возвращает количество полученных байтов. Значение необязательного аргумента flags описано на странице руководства Unix recv(2); по умолчанию оно равно нулю.
-
socket.send(bytes[, flags]) -
Отправить данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и у описанного выше метода
recv(). Возвращает количество отправленных байтов. Приложение отвечает за проверку того, что отправлены все данные; если передана только их часть, приложение должно попытаться отправить оставшиеся данные. Дополнительные сведения см. в руководстве Практическое руководство по программированию сокетов.Изменено в версии 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 (например, объектов
bytes); операционная система может установить ограничение (sysconf()со значениемSC_IOV_MAX) на количество используемых буферов. Аргумент ancdata задаёт вспомогательные данные (управляющие сообщения) как итерируемый объект из нуля или более кортежей(cmsg_level, cmsg_type, cmsg_data), где cmsg_level и cmsg_type — целые числа, задающие соответственно уровень протокола и тип, специфичный для протокола, а cmsg_data — объект, подобный bytes, содержащий связанные данные. Обратите внимание, что некоторые системы (в частности, системы безCMSG_SPACE()) могут поддерживать отправку только одного управляющего сообщения за вызов. По умолчанию аргумент flags равен 0 и имеет то же значение, что и дляsend(). Если указан аргумент address и он не равенNone, он задаёт адрес назначения сообщения. Возвращаемое значение — число отправленных байтов обычных данных.Следующая функция отправляет список файловых дескрипторов fds через сокет
AF_UNIXв системах, поддерживающих механизмSCM_RIGHTS. См. такжеrecvmsg().import socket, array def send_fds(sock, msg, fds): return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])Доступность: Unix, кроме WASI.
Большинство платформ Unix.
Вызывает событие аудита
socket.sendmsgс аргументамиself,address.Добавлено в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключение, метод теперь повторяет системный вызов вместо вызова исключения
InterruptedError(обоснование см. в PEP 475).
-
socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]]) -
Специализированная версия
sendmsg()для сокетаAF_ALG. Задаёт режим, IV, длину связанных данных AEAD и флаги для сокетаAF_ALG.Доступность: Linux >= 2.6.38.
Добавлено в версии 3.6.
-
socket.sendfile(file, offset=0, count=None) -
Отправляет файл до достижения EOF, используя высокопроизводительную функцию
os.sendfile, и возвращает общее число отправленных байтов. file должен быть обычным файловым объектом, открытым в двоичном режиме. Еслиos.sendfileнедоступна (например, в Windows) или file не является обычным файлом, вместо неё будет использованsend(). Аргумент offset указывает, с какого места начать чтение файла. Если задан аргумент count, он определяет общее количество передаваемых байтов, вместо отправки файла до достижения EOF. При возврате позиция в файле обновляется; она также обновляется в случае ошибки, и тогда с помощьюfile.tell()можно определить число отправленных байтов. Сокет должен иметь типSOCK_STREAM. Неблокирующие сокеты не поддерживаются.Добавлено в версии 3.5.
-
socket.set_inheritable(inheritable) -
Устанавливает флаг наследования файлового дескриптора или дескриптора сокета.
Добавлено в версии 3.4.
-
socket.setblocking(flag) -
Устанавливает для сокета блокирующий или неблокирующий режим: если flag имеет значение false, сокет переводится в неблокирующий режим, в противном случае — в блокирующий.
Этот метод является сокращённой записью для некоторых вызовов
settimeout():-
sock.setblocking(True)эквивалентноsock.settimeout(None) -
sock.setblocking(False)эквивалентноsock.settimeout(0.0)
Изменено в версии 3.7: Метод больше не применяет флаг
SOCK_NONBLOCKкsocket.type. -
-
socket.settimeout(value) -
Устанавливает тайм-аут для блокирующих операций с сокетом. Аргумент value может быть неотрицательным числом с плавающей точкой, задающим секунды, или
None. Если задано ненулевое значение, последующие операции с сокетом вызовут исключениеtimeout, если до завершения операции истечёт указанный период тайм-аута value. Если задан ноль, сокет переводится в неблокирующий режим. Если заданоNone, сокет переводится в блокирующий режим.Дополнительные сведения см. в примечаниях о тайм-аутах сокетов.
Изменено в версии 3.7: Метод больше не переключает флаг
SOCK_NONBLOCKуsocket.type.
-
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или объект, подобный bytes, представляющий буфер. В последнем случае вызывающий код должен убедиться, что байтовая строка содержит нужные биты (способ кодирования структур C в байтовые строки см. в необязательном встроенном модулеstruct). Если для value заданоNone, требуется аргумент optlen. Это эквивалентно вызову функции Csetsockopt()сoptval=NULLиoptlen=optlen.Изменено в версии 3.5: Теперь принимаются доступные для записи объекты, подобные bytes.
Изменено в версии 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 Programmer’s Manual, Supplementary Documents 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.12/library/socket.html