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 возвращается как объект типа байт с начальным нулевым байтом; обратите внимание, что сокеты в этом пространстве имён могут взаимодействовать с обычными сокетами файловой системы, поэтому программам, предназначенным для работы в Linux, может потребоваться обрабатывать оба типа адресов. Строка или объект типа байт могут использоваться для обоих типов адресов при их передаче в качестве аргумента.Изменено в версии 3.3: Ранее предполагалось, что пути сокетов
AF_UNIXиспользуют кодировку UTF-8.Изменено в версии 3.5: Теперь принимается записываемый объект типа байт.
-
Пара
(host, port)используется для семейства адресовAF_INET, где host — строка, представляющая либо имя хоста в формате доменного имени интернета, например,'daring.cwi.nl', либо IPv4-адрес, например,'100.50.200.5', а port — целое число.- Для IPv4-адресов принимаются две специальные формы вместо адреса хоста:
''представляетINADDR_ANY, что используется для привязки ко всем интерфейсам, а строка'<broadcast>'представляетINADDR_BROADCAST. Это поведение несовместимо с IPv6, поэтому следует избегать его, если вы планируете поддерживать IPv6 в своих программах Python.
- Для IPv4-адресов принимаются две специальные формы вместо адреса хоста:
-
Для семейства адресов
AF_INET6используется четырёхэлементный кортеж(host, port, flowinfo, scope_id), где flowinfo и scope_id представляют членыsin6_flowinfoиsin6_scope_idвstruct sockaddr_in6в C. Для методов модуля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), где оба дополнительных параметра — целые числа без знака типа unsigned long, представляющие идентификатор 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.
-
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.
Если вы используете имя хоста в части 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.
-
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_PACKET -
socket.PF_PACKET - PACKET_*
-
Многие константы этих форм, описанные в документации Linux, также определены в модуле socket.
Доступность: Linux >= 2.2.
-
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
Функции
Создание сокетов
Следующие функции создают объекты сокетов.
-
class socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -
Создаёт новый сокет с заданной семейством адресов, типом сокета и номером протокола. Семейство адресов должно быть
AF_INET(по умолчанию),AF_INET6,AF_UNIX,AF_CAN,AF_PACKETилиAF_RDS. Тип сокета должен бытьSOCK_STREAM(по умолчанию),SOCK_DGRAM,SOCK_RAWили, возможно, одно из другихSOCK_констант. Номер протокола обычно равен нулю и может быть опущен, или в случае, когда семейство адресов —AF_CAN, протокол должен быть одним изCAN_RAW,CAN_BCM,CAN_ISOTPилиCAN_J1939.Если указан параметр fileno, значения для family, type и proto автоматически определяются по указанному дескриптору файла. Автоматическое определение можно переопределить, вызвав функцию с явными аргументами family, type или proto. Это влияет только на то, как Python представляет, например, возвращаемое значение
socket.getpeername(), но не на фактические системные ресурсы. В отличие отsocket.fromfd(), fileno вернёт тот же сокет, а не дубликат. Это может помочь закрыть отсоединённый сокет с помощьюsocket.close().Новый созданный сокет является непередаваемым.
Вызывает событие аудита
socket.__new__с аргументамиself,family,type,protocol.Изменено в версии 3.3: Была добавлена семейство AF_CAN. Была добавлена семейство AF_RDS.
Изменено в версии 3.4: Был добавлен протокол CAN_BCM.
Изменено в версии 3.4: Возвращаемый сокет теперь непередаваемый.
Изменено в версии 3.7: Был добавлен протокол CAN_ISOTP.
Изменено в версии 3.7: При применении флагов
SOCK_NONBLOCKилиSOCK_CLOEXECк type они очищаются, иsocket.typeне будет их отражать. Они всё ещё передаются в системныйsocket()вызов. Поэтому,sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK)по-прежнему создаст неблокирующий сокет на ОС, которые поддерживают
SOCK_NONBLOCK, ноsock.typeбудет установлено в значениеsocket.SOCK_STREAM.Изменено в версии 3.9: Был добавлен протокол CAN_J1939.
Изменено в версии 3.10: Был добавлен протокол IPPROTO_MPTCP.
-
socket.socketpair([family[, type[, proto]]]) -
Создаёт пару соединённых объектов сокета с заданным семейством адресов, типом сокета и номером протокола. Семейство адресов, тип сокета и номер протокола — такие же, как и для функции
socket()выше. По умолчанию семейством являетсяAF_UNIX, если он определён в платформе; в противном случае по умолчанию —AF_INET.Созданные сокеты являются непередаваемыми.
Изменено в версии 3.2: Возвращаемые объекты сокета теперь поддерживают весь API сокетов, а не только подмножество.
Изменено в версии 3.4: Возвращаемые сокеты теперь непередаваемы.
Изменено в версии 3.5: Добавлена поддержка Windows.
-
socket.create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False) -
Подключается к TCP-сервису, прослушивающему по адресу address (кортеж из 2 элементов
(host, port)), и возвращает объект сокета. Эта функция более высокого уровня, чемsocket.connect(): если host — это имя хоста, а не число, она попытается разрешить его как дляAF_INET, так и дляAF_INET6, а затем попытается подключиться ко всем возможным адресам по очереди, пока не произойдёт успешное подключение. Это упрощает создание клиентов, совместимых с IPv4 и IPv6.Передача необязательного параметра timeout установит таймаут для экземпляра сокета перед попыткой подключения. Если timeout не указан, используется глобальный таймаут по умолчанию, возвращаемый функцией
getdefaulttimeout().Если указан параметр source_address, он должен быть кортежем из 2 элементов
(host, port)для привязки сокета к адресу источника перед подключением. Если хост или порт равны '' или 0 соответственно, будет использовано поведение по умолчанию ОС.При невозможности создания соединения возникает исключение. По умолчанию — исключение от последнего адреса в списке. Если all_errors равно
True, этоExceptionGroup, содержащий ошибки всех попыток.Изменено в версии 3.2: Добавлен параметр source_address.
Изменено в версии 3.11: Добавлен параметр all_errors.
-
socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False) -
Удобная функция, которая создаёт TCP-сокет, привязанный к адресу address (кортеж из 2 элементов
(host, port)), и возвращает объект сокета.family должен быть либо
AF_INET, либоAF_INET6. backlog — размер очереди, передаваемый вsocket.listen(); если не указан, выбирается разумное значение по умолчанию. reuse_port определяет, нужно ли установитьSO_REUSEPORTпараметр сокета.Если dualstack_ipv6 имеет значение true и платформа поддерживает эту возможность, сокет сможет принимать как IPv4, так и IPv6 подключения, иначе будет выброшено
ValueError. Большинство POSIX платформ и Windows должны поддерживать эту функциональность. Когда эта функциональность включена, адрес, возвращаемыйsocket.getpeername()при подключении IPv4, будет адресом IPv6, представленным как IPv4-отображённый IPv6 адрес. Если dualstack_ipv6 имеет значение false, эта функция явно отключит эту функциональность на платформах, которые включают её по умолчанию (например, Linux). Этот параметр можно использовать совместно сhas_dualstack_ipv6():import socket addr = ("", 8080) # all interfaces, port 8080 if socket.has_dualstack_ipv6(): s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True) else: s = socket.create_server(addr)Примечание
На POSIX платформах
SO_REUSEADDRпараметр сокета устанавливается для немедленного повторного использования предыдущих сокетов, которые были привязаны к тому же адресу и остались в состоянии 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, и для поддержки IPv4/v6-двойного стека следует использоватьgetaddrinfo().Вызывает событие аудита
socket.gethostbynameс аргументомhostname.Доступность: не WASI.
-
socket.gethostbyname_ex(hostname) -
Преобразует имя хоста в формат IPv4-адреса, расширенный интерфейс. Возвращает 3-кортеж
(hostname, aliaslist, ipaddrlist), где hostname — основное имя хоста, aliaslist — (возможно, пустой) список альтернативных имён хоста для одного и того же адреса, а ipaddrlist — список IPv4-адресов для одного и того же интерфейса на том же хосте (часто, но не всегда, один адрес). Для поиска полного доменного имени используйте функциюgetfqdn().gethostbyname_ex()не поддерживает разрешение имён IPv6, и для поддержки IPv4/v6-двойного стека следует использоватьgetaddrinfo().Вызывает событие аудита
socket.gethostbynameс аргументомhostname.Доступность: не WASI.
-
socket.gethostname() -
Возвращает строку, содержащую имя хоста машины, на которой в данный момент выполняется интерпретатор Python.
Вызывает событие аудита
socket.gethostnameбез аргументов.Примечание:
gethostname()не всегда возвращает полное доменное имя; для этого используйтеgetfqdn().Доступность: не WASI.
-
socket.gethostbyaddr(ip_address) -
Возвращает 3-кортеж
(hostname, aliaslist, ipaddrlist), где hostname — основное имя хоста, отвечающего на указанный ip_address, aliaslist — (возможно, пустой) список альтернативных имён хоста для одного и того же адреса, а ipaddrlist — список IPv4/v6-адресов для одного и того же интерфейса на одном и том же хосте (вероятно, содержащий только один адрес). Для поиска полного доменного имени используйте функциюgetfqdn().gethostbyaddr()поддерживает как IPv4, так и IPv6.Вызывает событие аудита
socket.gethostbyaddrс аргументомip_address.Доступность: не WASI.
-
socket.getnameinfo(sockaddr, flags) -
Преобразует адрес сокета sockaddr в 2-кортеж
(host, port). В зависимости от настроек flags, результат может содержать полное доменное имя или числовое представление адреса в host. Аналогично, port может содержать строку имени порта или числовой номер порта.Для IPv6-адресов
%scope_idдобавляется к части хоста, если sockaddr содержит осмысленный scope_id. Обычно это происходит для мультиадресных адресов.Дополнительную информацию об flags можно найти в getnameinfo(3).
Вызывает событие аудита
socket.getnameinfoс аргументомsockaddr.Доступность: не WASI.
-
socket.getprotobyname(protocolname) -
Преобразует имя интернет-протокола (например,
'icmp') в константу, подходящую для передачи в качестве (необязательного) третьего аргумента функцииsocket(). Это обычно необходимо только для сокетов, открытых в режиме «raw» (SOCK_RAW); для обычных режимов сокетов правильный протокол выбирается автоматически, если протокол опущен или равен нулю.Доступность: не WASI.
-
socket.getservbyname(servicename[, protocolname]) -
Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если указано, должно быть
'tcp'или'udp', в противном случае соответствует любому протоколу.Возбуждает событие аудита
socket.getservbynameс аргументамиservicename,protocolname.Доступность: не WASI.
-
socket.getservbyport(port[, protocolname]) -
Преобразует номер порта интернет-службы и имя протокола в имя службы этой службы. Необязательное имя протокола, если указано, должно быть
'tcp'или'udp', в противном случае соответствует любому протоколу.Возбуждает событие аудита
socket.getservbyportс аргументамиport,protocolname.Доступность: не WASI.
-
socket.ntohl(x) -
Преобразует 32-битные целые положительные числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком, это ничего не делает; в противном случае выполняется операция перестановки 4 байтов.
-
socket.ntohs(x) -
Преобразует 16-битные целые положительные числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком, это ничего не делает; в противном случае выполняется операция перестановки 2 байтов.
Изменено в версии 3.10: Возбуждает
OverflowError, если x не помещается в 16-битное беззнаковое целое число.
-
socket.htonl(x) -
Преобразует 32-битные целые положительные числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком, это ничего не делает; в противном случае выполняется операция перестановки 4 байтов.
-
socket.htons(x) -
Преобразует 16-битные целые положительные числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком, это ничего не делает; в противном случае выполняется операция перестановки 2 байтов.
Изменено в версии 3.10: Возбуждает
OverflowError, если x не помещается в 16-битное беззнаковое целое число.
-
socket.inet_aton(ip_string) -
Преобразует IPv4-адрес из строкового формата с точками (например, ‘123.45.67.89’) в 32-битный упакованный двоичный формат в виде объекта типа bytes длиной четыре символа. Это полезно при общении с программой, использующей стандартную библиотеку C и требующей объекты типа
in_addr, который является типом C для 32-битного упакованного двоичного данных, возвращаемого этой функцией.inet_aton()также принимает строки с менее чем тремя точками; см. страницу руководства Unix inet(3) для подробностей.Если строка IPv4-адреса, переданная в эту функцию, некорректна, будет возбуждено исключение
OSError. Обратите внимание, что точное определение правильного формата зависит от реализации Cinet_aton().inet_aton()не поддерживает IPv6, и для поддержки 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.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() -
Возвращает значение таймаута по умолчанию в секундах (число с плавающей точкой) для новых объектов сокета. Значение
Noneуказывает, что у новых объектов сокета нет таймаута. При первом импорте модуля socket значение по умолчанию —None.
-
socket.setdefaulttimeout(timeout) -
Устанавливает значение таймаута по умолчанию в секундах (число с плавающей точкой) для новых объектов сокета. При первом импорте модуля socket значение по умолчанию —
None. См.settimeout()для возможных значений и их значений.
-
socket.sethostname(name) -
Устанавливает имя хоста машины на name. Это вызовет
OSError, если у вас недостаточно прав.Вызывает событие аудита аудита
socket.sethostnameс аргументомname.Доступность: Unix.
Введено в версии 3.3.
-
socket.if_nameindex() -
Возвращает список кортежей с информацией о сетевом интерфейсе (индекс int, имя string).
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) -
Привязывает сокет к адресу. Сокет не должен быть уже привязан. (Формат адреса зависит от семейства адресов — см. выше.)
Вызывает событие аудита аудита
socket.bindс аргументамиself,address.Доступность: не WASI.
-
socket.close() -
Помечает сокет закрытым. Базовый системный ресурс (например, дескриптор файла) также закрывается, когда все объекты файлов из
makefile()закрываются. После этого все последующие операции с объектом сокета завершатся ошибкой. Дальнейшие данные не будут получены удалённым концом (после того, как буферизованные данные будут переданы).Сокеты автоматически закрываются при сборке мусора, но рекомендуется явно закрывать их, или использовать оператор
withвокруг них.Изменено в версии 3.6:
OSErrorтеперь генерируется, если произошла ошибка при выполнении базового вызоваclose().Примечание
close()освобождает ресурс, связанный с подключением, но не обязательно сразу закрывает подключение. Если вам нужно закрыть подключение в разумные сроки, вызовитеshutdown()передclose().
-
socket.connect(address) -
Подключается к удалённому сокету по адресу address. (Формат адреса зависит от семейства адресов — см. выше.)
Если подключение прерывается сигналом, метод ожидает завершения подключения или генерирует
TimeoutErrorпри истечении времени ожидания, если обработчик сигнала не сгенерировал исключение, и сокет блокирующий или имеет таймаут. Для неблокирующих сокетов метод генерирует исключениеInterruptedError, если подключение прерывается сигналом (или если обработчик сигнала сгенерировал исключение).Вызывает событие аудита аудита
socket.connectс аргументамиself,address.Изменено в версии 3.5: Метод теперь ожидает завершения подключения вместо генерации исключения
InterruptedError, если подключение прерывается сигналом, обработчик сигнала не генерирует исключение, и сокет блокирующий или имеет таймаут (см. PEP 475 для обоснования).Доступность: не WASI.
-
socket.connect_ex(address) -
Подобно
connect(address), но возвращает индикатор ошибки вместо генерации исключения для ошибок, возвращаемых системным вызовом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. Обратитесь к странице руководства Unix recv(2) для значения необязательного аргумента flags; по умолчанию он равен нулю.
Примечание
Для наилучшего соответствия аппаратным и сетевым реалиям значение bufsize должно быть относительно малой степенью 2, например, 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, представляющий новые дескрипторы файлов как двоичный массив родного 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 — адрес сокета, отправляющего данные. См. страницу руководства 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 зависит от семейства адресов — см. выше.)Вызывает событие аудита auditing event
socket.sendtoс аргументамиself,address.Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключения, метод теперь повторно пытается выполнить системный вызов вместо поднятия исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendmsg(buffers[, ancdata[, flags[, address]]]) -
Отправка нормальных и дополнительных данных в сокет, собирая не-дополнительные данные из ряда буферов и конкатенируя их в единое сообщение. Аргумент buffers определяет не-дополнительные данные как итерируемый объект bytes-like objects (например,
bytesобъекты); операционная система может установить ограничение (sysconf()значениеSC_IOV_MAX) на количество используемых буферов. Аргумент ancdata определяет дополнительные данные (управляющие сообщения) как итерируемый объект из нуля или более кортежей(cmsg_level, cmsg_type, cmsg_data), где cmsg_level и cmsg_type являются целыми числами, определяющими уровень протокола и тип, специфичный для протокола соответственно, а cmsg_data — это bytes-like object, содержащий связанные данные. Обратите внимание, что некоторые системы (в частности, системы без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 платформ.
Вызывает событие аудита auditing event
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) -
Установить флаг inheritable flag для дескриптора файла сокета или дескриптора сокета.
Введено в версии 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 обязателен. Он эквивалентен вызову функцииsetsockopt()C сoptval=NULLиoptlen=optlen.Изменено в версии 3.5: Теперь принимается изменяемый объект-подобный байтам.
Изменено в версии 3.6: Добавлен вид setsocckopt(level, optname, None, optlen: int).
Доступность: не WASI.
-
socket.shutdown(how) -
Закрывает одну или обе половины соединения. Если how равно
SHUT_RD, дальнейшие приёмы запрещены. Если how равноSHUT_WR, дальнейшие отправки запрещены. Если how равноSHUT_RDWR, дальнейшие отправки и приёмы запрещены.Доступность: не WASI.
-
Дублирует сокет и подготавливает его для совместного использования с целевым процессом. Целевой процесс должен быть предоставлен с process_id. Результирующий объект bytes затем может быть передан целевому процессу с использованием некоторой формы межпроцессного взаимодействия, и сокет может быть там воссоздан с помощью
fromshare(). После вызова этого метода можно безопасно закрыть сокет, так как операционная система уже продублировала его для целевого процесса.Доступность: Windows.
Введено в версии 3.3.
Обратите внимание, что нет методов read() или write(); используйте recv() и send() без аргумента flags вместо этого.
Объекты сокета также имеют эти (только для чтения) атрибуты, которые соответствуют значениям, заданным конструктору socket.
-
socket.family -
Семейство сокета.
-
socket.type -
Тип сокета.
-
socket.proto -
Протокол сокета.
Примечания по таймаутам сокетов
Объект сокета может находиться в одном из трёх режимов: блокирующем, неблокирующем или режиме таймаута. Сокеты по умолчанию всегда создаются в блокирующем режиме, но это можно изменить, вызвав setdefaulttimeout().
- В блокирующем режиме операции блокируются, пока не будут завершены или система не вернёт ошибку (например, истечение времени ожидания соединения).
- В неблокирующем режиме операции терпят неудачу (с ошибкой, которая к сожалению зависит от системы), если они не могут быть завершены немедленно: функции из модуля
selectможно использовать, чтобы узнать, когда и доступен ли сокет для чтения или записи. - В режиме таймаута операции терпят неудачу, если они не могут быть завершены в течение заданного для сокета таймаута (они вызывают исключение
timeout) или если система возвращает ошибку.
Примечание
На уровне операционной системы сокеты в режиме таймаута внутренне устанавливаются в неблокирующем режиме. Кроме того, блокирующие и режимы таймаута совместно используются между дескрипторами файлов и объектами сокетов, которые ссылаются на один и тот же сетевой конечный пункт. Эта реализация детали может иметь видимые последствия, если, например, вы решите использовать fileno() сокета.
Таймауты и метод connect
Операция connect() также подчиняется настройке таймаута, и в целом рекомендуется вызывать settimeout() перед вызовом connect() или передать параметр таймаута в create_connection(). Однако системный сетевой стек также может возвращать ошибку таймаута соединения независимо от любой настройки таймаута сокета Python.
Таймауты и метод accept
Если getdefaulttimeout() не равно None, сокеты, возвращаемые методом accept(), наследуют этот таймаут. В противном случае поведение зависит от настроек сокета прослушивания:
- если сокет прослушивания находится в блокирующем режиме или в режиме таймаута, сокет, возвращаемый методом
accept(), находится в блокирующем режиме; - если сокет прослушивания находится в неблокирующем режиме, находится ли сокет, возвращаемый методом
accept(), в блокирующем или неблокирующем режиме, зависит от операционной системы. Если вы хотите обеспечить кроссплатформенное поведение, рекомендуется вручную переопределить эту настройку.
Пример
Ниже приведены четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который эхом возвращает все полученные данные (обслуживающий только одного клиента), и клиент, использующий его. Обратите внимание, что сервер должен выполнить последовательность socket(), bind(), listen(), accept() (возможно, повторяя accept() для обслуживания более одного клиента), в то время как клиенту достаточно последовательности socket(), connect(). Также обратите внимание, что сервер не выполняет sendall()/recv() на сокете, который он слушает, а на новом сокете, возвращённом методом accept().
Первые два примера поддерживают только IPv4.
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
# Echo client program
import socket
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Следующие два примера идентичны двум предыдущим, но поддерживают как IPv4, так и IPv6. Сторона сервера будет слушать первую доступную семейство адресов (вместо этого он должен слушать оба). На большинстве систем с поддержкой IPv6, IPv6 будет иметь приоритет, и сервер может не принимать IPv4 трафик. Клиентская сторона будет пытаться подключиться ко всем адресам, полученным в результате разрешения имени, и отправит трафик первому успешно подключившемуся.
# Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.send(data)
# Echo client program
import socket
import sys
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.connect(sa)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
with s:
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Следующий пример показывает, как написать очень простой сниффер сети с использованием сырых сокетов в Windows. Пример требует прав администратора для изменения интерфейса:
import socket # the public network interface HOST = socket.gethostbyname(socket.gethostname()) # create a raw socket and bind it to the public interface s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) s.bind((HOST, 0)) # Include IP headers s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # receive all packets s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) # receive a packet print(s.recvfrom(65565)) # disabled promiscuous mode s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
Следующий пример показывает, как использовать сокет-интерфейс для связи с сетью CAN, используя протокол сырых сокетов. Чтобы использовать CAN с протоколом менеджера широковещательной передачи, откройте сокет с:
socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
После привязки (CAN_RAW) или подключения (CAN_BCM) сокета, вы можете использовать операции socket.send() и socket.recv() (и их аналоги) на объекте сокета как обычно.
Этот последний пример может потребовать специальных привилегий:
import socket
import struct
# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)
can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)
def build_can_frame(can_id, data):
can_dlc = len(data)
data = data.ljust(8, b'\x00')
return struct.pack(can_frame_fmt, can_id, can_dlc, data)
def dissect_can_frame(frame):
can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
return (can_id, can_dlc, data[:can_dlc])
# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))
while True:
cf, addr = s.recvfrom(can_frame_size)
print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))
try:
s.send(cf)
except OSError:
print('Error sending CAN frame')
try:
s.send(build_can_frame(0x01, b'\x01\x02\x03'))
except OSError:
print('Error sending CAN frame')
Запуск примера несколько раз с слишком коротким интервалом между выполнениями может привести к этой ошибке:
OSError: [Errno 98] Address already in use
Это происходит потому, что предыдущее выполнение оставило сокет в состоянии TIME_WAIT, и его нельзя немедленно повторно использовать.
Существует флаг socket для установки, чтобы предотвратить это, socket.SO_REUSEADDR:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT))
Флаг SO_REUSEADDR сообщает ядру о повторном использовании локального сокета в состоянии TIME_WAIT, без ожидания истечения его естественного таймаута.
См. также
Для введения в программирование с использованием сокетов (на C), см. следующие статьи:
- Вводный учебник по межпроцессной связи 4.3BSD, автором Стюарта Сехреста
- Расширенный учебник по межпроцессной связи 4.3BSD, авторами Сэмюелем Дж. Леффлером и др,
оба в руководстве программиста UNIX, дополнительные документы 1 (разделы PS1:7 и PS1:8). Платформенно-специфическая справочная информация по различным системным вызовам, связанным с сокетами, также является ценным источником информации о деталях семантики сокетов. Для Unix, обратитесь к руководству; для Windows, см. спецификацию WinSock (или Winsock 2). Для API с поддержкой IPv6, читатели могут обратиться к RFC 3493 с названием Базовые расширения интерфейса сокетов для IPv6.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/socket.html