socket — Интерфейс низкого уровня для сетевых соединений
Исходный код: Lib/socket.py
Этот модуль предоставляет доступ к интерфейсу BSD socket. Он доступен на всех современных Unix-системах, Windows, macOS и, вероятно, на других платформах.
Примечание
Некоторые особенности могут зависеть от платформы, так как вызовы выполняются к API сокетов операционной системы.
Интерфейс Python представляет собой прямое преобразование интерфейса системных вызовов и библиотек Unix для сокетов в объектно-ориентированный стиль Python: функция socket() возвращает объект socket, методы которого реализуют различные системные вызовы сокетов. Типы параметров несколько более высокого уровня, чем в C-интерфейсе: как и при операциях read() и write() с файлами Python, выделение буфера при приёме данных происходит автоматически, а длина буфера при отправке подразумевается.
См. также
-
Modulesocketserver -
Классы, упрощающие создание сетевых серверов.
-
Modulessl -
Обёртка TLS/SSL для объектов socket.
Семейства сокетов
В зависимости от системы и параметров сборки, этот модуль поддерживает различные семейства сокетов.
Формат адреса, требуемый конкретным объектом сокета, автоматически выбирается на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представляются следующим образом:
-
Адрес сокета
AF_UNIX, привязанного к узлу файловой системы, представляется строкой, используя кодировку файловой системы и обработчик ошибок'surrogateescape'(см. PEP 383). Адрес в абстрактном пространстве имён Linux возвращается как объект типа bytes-like с начальным нулевым байтом; обратите внимание, что сокеты в этом пространстве имен могут взаимодействовать с обычными сокетами файловой системы, поэтому программы, предназначенные для работы в Linux, могут потребоваться для обработки обоих типов адресов. Для передачи адреса в качестве аргумента можно использовать строку или объект типа bytes-like.Изменено в версии 3.3: Ранее предполагалось, что пути сокетов
AF_UNIXиспользуют кодировку UTF-8.Изменено в версии 3.5: Теперь принимается изменяемый объект типа bytes-like.
-
Для семейства адресов
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, scopeid), где flowinfo и scopeid представляют членыsin6_flowinfoиsin6_scope_idвstruct sockaddr_in6на C. Для методов модуляsocket, flowinfo и scopeid могут быть опущены только для обратной совместимости. Однако следует учитывать, что пропуск scopeid может привести к проблемам при манипулировании адресами IPv6 с областью действия.Изменено в версии 3.7: Для мультикаст-адресов (где scopeid имеет смысл) часть address может не содержать
%scope(илиzone id) . Эта информация избыточна и может быть безопасно опущена (рекомендуется). -
AF_NETLINKсокеты представляются парами(pid, groups). -
Только для Linux доступна поддержка TIPC с использованием семейства адресов
AF_TIPC. TIPC — это открытый протокол сети, не основанный на IP, разработанный для использования в кластеризованных вычислительных средах. Адреса представляются кортежем, а поля зависят от типа адреса. Общий формат кортежа —(addr_type, v1, v2, v3 [, scope]), где:-
addr_type — это одно из значений
TIPC_ADDR_NAMESEQ,TIPC_ADDR_NAME, илиTIPC_ADDR_ID. -
scope — это одно из значений
TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPE, иTIPC_NODE_SCOPE. -
Если addr_type — это
TIPC_ADDR_NAME, то v1 — тип сервера, v2 — идентификатор порта, а v3 должно быть равно 0.Если addr_type — это
TIPC_ADDR_NAMESEQ, то v1 — тип сервера, v2 — нижний номер порта, а v3 — верхний номер порта.Если addr_type — это
TIPC_ADDR_ID, то v1 — узел, v2 — ссылка, а v3 должно быть установлено в 0.
-
addr_type — это одно из значений
-
Кортеж
(interface, )используется для семейства адресовAF_CAN, где interface — строка, представляющая имя сетевого интерфейса, например,'can0'. Имя сетевого интерфейса''может использоваться для получения пакетов со всех сетевых интерфейсов этого семейства.-
Протокол
CAN_ISOTPтребует кортеж(interface, rx_addr, tx_addr), где оба дополнительных параметра — целые числа без знака, представляющие идентификатор CAN (стандартный или расширенный).
-
Протокол
-
Строка или кортеж
(id, unit)используется для протоколаSYSPROTO_CONTROLсемействаPF_SYSTEM. Строка — это имя системного управления ядра с динамически назначенным ID. Кортеж может быть использован, если известны ID и номер устройства системного управления ядра или используется зарегистрированный ID.Новое в версии 3.3.
-
AF_BLUETOOTHподдерживает следующие протоколы и форматы адресов:-
BTPROTO_L2CAPпринимает(bdaddr, psm), гдеbdaddr— адрес Bluetooth в виде строки, аpsm— целое число. -
BTPROTO_RFCOMMпринимает(bdaddr, channel), гдеbdaddr— адрес Bluetooth в виде строки, аchannel— целое число. -
BTPROTO_HCIпринимает(device_id,), гдеdevice_id— это либо целое число, либо строка с адресом Bluetooth интерфейса. (Это зависит от вашей ОС; NetBSD и DragonFlyBSD ожидают адрес Bluetooth, а все остальные — целое число.)Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.
-
BTPROTO_SCOпринимаетbdaddr, гдеbdaddr—bytesобъект, содержащий адрес Bluetooth в формате строки. (например,b'12:23:34:45:56:67') Этот протокол не поддерживается в FreeBSD.
-
-
AF_ALG— это интерфейс сокетов, доступный только для Linux, основанный на ядре для криптографии. Алгоритмический сокет настраивается с кортежем из двух до четырёх элементов(type, name [, feat [, mask]]), где:-
type — тип алгоритма в виде строки, например,
aead,hash,skcipherилиrng. -
name — имя алгоритма и режим работы в виде строки, например,
sha256,hmac(sha256),cbc(aes)илиdrbg_nopr_ctr_aes256. - feat и mask — целые 32-битные числа без знака.
Доступность: Linux 2.6.38, некоторые типы алгоритмов требуют более новых ядер.
Новое в версии 3.6.
-
type — тип алгоритма в виде строки, например,
-
AF_VSOCKпозволяет обмениваться данными между виртуальными машинами и их хостами. Сокеты представлены кортежем(CID, port), где идентификатор контекста или CID и порт — целые числа.Доступность: Linux >= 4.8 QEMU >= 2.8 ESX >= 4.0 ESX Workstation >= 6.5.
Новое в версии 3.7.
-
AF_PACKET— это низкоуровневый интерфейс, непосредственно взаимодействующий с сетевыми устройствами. Пакеты представлены кортежем(ifname, proto[, pkttype[, hatype[, addr]]]), где:- ifname — строка, определяющая имя устройства.
- proto — целое число в сетевом порядке байтов, определяющее номер протокола Ethernet.
-
pkttype — необязательное целое число, определяющее тип пакета:
-
PACKET_HOST(по умолчанию) — пакет, адресованный локальному хосту. -
PACKET_BROADCAST— пакет физического уровня широковещательной рассылки. -
PACKET_MULTIHOST— пакет, отправленный на физический уровень мультиадресной рассылки. -
PACKET_OTHERHOST— пакет другому хосту, перехваченный драйвером устройства в режиме прослушивания. -
PACKET_OUTGOING— пакет, исходящий от локального хоста, который циклически отправляется в сокет пакета.
-
- hatype — необязательное целое число, определяющее тип аппаратного адреса ARP.
- addr — необязательный объект типа bytes-like, определяющий физический аппаратный адрес, чья интерпретация зависит от устройства.
-
AF_QIPCRTR— это интерфейс сокетов, доступный только для Linux, предназначенный для взаимодействия с сервисами, работающими на сопроцессорах в платформах Qualcomm. Семейство адресов представляется кортежем(node, port), где node и port — неотрицательные целые числа.Новое в версии 3.8.
Если вы используете имя хоста в части host адреса сокета IPv4/v6, программа может демонстрировать недетерминированное поведение, так как Python использует первый адрес, возвращённый результатом разрешения DNS. Адрес сокета будет разрешён в фактический IPv4/v6 адрес по-разному, в зависимости от результатов разрешения DNS и/или конфигурации хоста. Для детерминированного поведения используйте числовой адрес в части host.
Все ошибки генерируют исключения. Могут быть вызваны обычные исключения для некорректных типов аргументов и ситуаций с недостатком памяти; начиная с Python 3.3, ошибки, связанные с семантикой сокетов или адресов, генерируют OSError или один из его подклассов (ранее они генерировали socket.error).
Режим без блокировки поддерживается через 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 -
Подкласс
OSError, это исключение генерируется при истечении таймаута на сокете, для которого были включены таймауты с помощью предыдущего вызоваsettimeout()(или неявно черезsetdefaulttimeout()). Сопровождающее значение — строка, значение которой в настоящее время всегда «таймаут истек».Изменено в версии 3.3: Этот класс был преобразован в подкласс
OSError.
Постоянные
Константы AF_* и SOCK_* теперь являются AddressFamily и SocketKind коллекциями IntEnum.
Введено в версии 3.4.
-
socket.AF_UNIX -
socket.AF_INET -
socket.AF_INET6 -
Эти константы представляют семейства адресов (и протоколов), используемые в качестве первого аргумента для
socket(). Если константаAF_UNIXне определена, то этот протокол не поддерживается. Дополнительные константы могут быть доступны в зависимости от системы.
-
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 поддерживает.
-
socket.AF_CAN -
socket.PF_CAN -
SOL_CAN_* -
CAN_* -
Многие константы таких форм, описанные в документации Linux, также определены в модуле socket.
Доступность: Linux >= 2.6.25.
Введено в версии 3.3.
-
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_ISOTP -
CAN_ISOTP в семействе протоколов CAN — это протокол ISO-TP (ISO 15765-2). Константы ISO-TP, описанные в документации Linux.
Доступность: Linux >= 2.6.25.
Введено в версии 3.7.
-
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, OSX.
Введено в версии 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.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.Если указан 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.
-
socket.socketpair([family[, type[, proto]]]) -
Создаёт пару соединённых объектов сокетов с заданным семейством адресов, типом сокета и номером протокола. Семейство адресов, тип сокета и номер протокола такие же, как и для функции
socket()выше. По умолчанию семейство —AF_UNIX, если определено в платформе; в противном случае —AF_INET.Созданные сокеты являются не наследуемыми.
Изменено в версии 3.2: Возвращаемые объекты сокетов теперь поддерживают весь API сокетов, а не его подмножество.
Изменено в версии 3.4: Возвращаемые сокеты теперь не наследуются.
Изменено в версии 3.5: Добавлена поддержка Windows.
-
socket.create_connection(address[, timeout[, source_address]]) -
Устанавливает соединение с TCP-сервисом, прослушивающим на указанном адресе (кортеж из 2-х элементов
(host, port)), и возвращает объект сокета. Эта функция более высокого уровня, чемsocket.connect(): если host — не числовой имя хоста, он будет пытаться разрешить его как дляAF_INET, так и дляAF_INET6, а затем попытается подключиться ко всем возможным адресам по очереди, пока не получится подключиться. Это облегчает создание клиентов, совместимых как с IPv4, так и с IPv6.Передача необязательного параметра timeout установит таймаут на объекте сокета перед попыткой подключения. Если timeout не указан, используется глобальное значение таймаута по умолчанию, возвращаемое
getdefaulttimeout().Если указан source_address, он должен быть кортежем из 2-х элементов
(host, port)для привязки сокета к нему как к адресу источника перед подключением. Если host или port равны '' или 0 соответственно, будет использоваться поведение по умолчанию операционной системы.Изменено в версии 3.2: Добавлен source_address.
-
socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False) -
Удобная функция, которая создаёт TCP-сокет, привязанный к адресу (кортеж из 2-х элементов
(host, port)), и возвращает объект сокета.family должен быть либо
AF_INET, либоAF_INET6. backlog — размер очереди, передаваемый вsocket.listen(); если не указан, используется разумное значение по умолчанию. reuse_port определяет, нужно ли устанавливатьSO_REUSEPORTопцию сокета.Если dualstack_ipv6 истинно и платформа его поддерживает, сокет сможет принимать как IPv4, так и IPv6 подключения, в противном случае будет поднято исключение
ValueError. Большинство POSIX-платформ и Windows должны поддерживать эту функциональность. Когда эта функциональность включена, адрес, возвращаемыйsocket.getpeername()при подключении IPv4, будет IPv6-адресом, представленным как IPv4-отображаемый IPv6 адрес. Если dualstack_ipv6 ложно, это отключит эту функциональность на платформах, которые включают её по умолчанию (например, Linux). Этот параметр можно использовать совместно сhas_dualstack_ipv6():import socket addr = ("", 8080) # all interfaces, port 8080 if socket.has_dualstack_ipv6(): s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True) else: s = socket.create_server(addr)Примечание
На POSIX-платформах устанавливается
SO_REUSEADDRопция сокета, чтобы немедленно повторно использовать предыдущие сокеты, привязанные к тому же адресу и находящиеся в состоянии 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) [(<AddressFamily.AF_INET6: 10>, <SocketType.SOCK_STREAM: 1>, 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)), (<AddressFamily.AF_INET: 2>, <SocketType.SOCK_STREAM: 1>, 6, '', ('93.184.216.34', 80))]Изменено в версии 3.2: параметры теперь могут передаваться с использованием именованных аргументов.
Изменено в версии 3.7: для IPv6-мультиадресных адресов строка, представляющая адрес, не будет содержать
%scopeчасть.
-
socket.getfqdn([name]) -
Возвращает полное доменное имя для name. Если name опущено или пустое, оно интерпретируется как локальный хост. Для поиска полного имени проверяется имя хоста, возвращённое
gethostbyaddr(), а затем псевдонимы хоста, если они доступны. Выбирается первое имя, которое включает точку. В случае отсутствия полного доменного имени возвращается имя хоста, возвращённоеgethostname().
-
socket.gethostbyname(hostname) -
Преобразует имя хоста в формат IPv4-адреса. IPv4-адрес возвращается в виде строки, например
'100.50.200.5'. Если имя хоста само по себе является IPv4-адресом, оно возвращается без изменений. Для более полной функции см.gethostbyname_ex().gethostbyname()не поддерживает разрешение имён IPv6, а для поддержки IPv4/v6 дуального стека следует использоватьgetaddrinfo().Вызывает событие аудита аудита
socket.gethostbynameс аргументомhostname.
-
socket.gethostbyname_ex(hostname) -
Преобразует имя хоста в формат IPv4-адреса, расширенный интерфейс. Возвращает тройку
(hostname, aliaslist, ipaddrlist)где hostname — основное имя хоста, отвечающее на данный ip_address, aliaslist — список (возможно, пустой) альтернативных имён хостов для того же адреса, а ipaddrlist — список IPv4-адресов для того же интерфейса на том же хосте (часто, но не всегда, единственный адрес). Для поиска полного доменного имени используйте функциюgetfqdn().gethostbyname_ex()не поддерживает разрешение имён IPv6, а для поддержки IPv4/v6 дуального стека следует использоватьgetaddrinfo().Вызывает событие аудита аудита
socket.gethostbynameс аргументомhostname.
-
socket.gethostname() -
Возвращает строку, содержащую имя хоста машины, на которой в данный момент выполняется интерпретатор Python.
Вызывает событие аудита аудита
socket.gethostnameбез аргументов.Примечание:
gethostname()не всегда возвращает полное доменное имя; для этого используйтеgetfqdn().
-
socket.gethostbyaddr(ip_address) -
Возвращает тройку
(hostname, aliaslist, ipaddrlist)где hostname — основное имя хоста, отвечающее на данный ip_address, aliaslist — список (возможно, пустой) альтернативных имён хостов для того же адреса, а ipaddrlist — список IPv4/v6-адресов для того же интерфейса на том же хосте (вероятно, содержащий только один адрес). Для поиска полного доменного имени используйте функциюgetfqdn().gethostbyaddr()поддерживает как IPv4, так и IPv6.Вызывает событие аудита аудита
socket.gethostbyaddrс аргументомip_address.
-
socket.getnameinfo(sockaddr, flags) -
Преобразует адрес сокета sockaddr в 2-кортеж
(host, port). В зависимости от настроек flags, результат может содержать полное доменное имя или числовое представление адреса в host. Аналогично, port может содержать строку имени порта или числовой номер порта.Для IPv6-адресов
%scopeдобавляется к части хоста, если sockaddr содержит значимый scopeid. Обычно это происходит для мультиадресных адресов.Для получения дополнительной информации об flags, вы можете обратиться к getnameinfo(3).
Вызывает событие аудита аудита
socket.getnameinfoс аргументомsockaddr.
-
socket.getprotobyname(protocolname) -
Преобразует имя интернет-протокола (например,
'icmp') в константу, подходящую для передачи в качестве третьего (необязательного) аргумента функцииsocket(). Это обычно необходимо только для сокетов, открытых в «сыром» режиме (SOCK_RAW); для обычных режимов сокетов правильный протокол выбирается автоматически, если протокол опущен или равен нулю.
-
socket.getservbyname(servicename[, protocolname]) -
Преобразует имя интернет-сервиса и имя протокола в номер порта для этого сервиса. Необязательное имя протокола, если указано, должно быть
'tcp'или'udp', в противном случае любой протокол будет соответствовать.Вызывает событие аудита аудита
socket.getservbynameс аргументамиservicename,protocolname.
-
socket.getservbyport(port[, protocolname]) -
Преобразует номер порта интернета и имя протокола в имя сервиса для этого сервиса. Необязательное имя протокола, если указано, должно быть
'tcp'или'udp', в противном случае любой протокол будет соответствовать.Вызывает событие аудита аудита
socket.getservbyportс аргументамиport,protocolname.
-
socket.ntohl(x) -
Преобразует 32-битные целые положительные числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это не делает ничего; в противном случае выполняется операция перестановки 4 байтов.
-
socket.ntohs(x) -
Преобразование 16-разрядных целых положительных чисел из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это ничто; в противном случае выполняется операция перестановки двух байтов.
Устарело начиная с версии 3.7: В случае, если x не помещается в 16-битовое беззнаковое целое, но помещается в положительное целое C, оно молчаливо усекается до 16-битового беззнакового целого. Эта функция молчаливого усечения устарела и в будущих версиях Python будет вызывать исключение.
-
socket.htonl(x) -
Преобразование 32-разрядных целых положительных чисел из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это ничто; в противном случае выполняется операция перестановки четырёх байтов.
-
socket.htons(x) -
Преобразование 16-разрядных целых положительных чисел из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это ничто; в противном случае выполняется операция перестановки двух байтов.
Устарело начиная с версии 3.7: В случае, если x не помещается в 16-битовое беззнаковое целое, но помещается в положительное целое C, оно молчаливо усекается до 16-битового беззнакового целого. Эта функция молчаливого усечения устарела и в будущих версиях Python будет вызывать исключение.
-
socket.inet_aton(ip_string) -
Преобразование IPv4-адреса из строкового формата с точками и дефисами (например, ‘123.45.67.89’) в 32-битный упакованный двоичный формат в виде объекта типа bytes длиной в четыре символа. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа
struct 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-like object длиной в четыре байта) в его стандартное строковое представление с точками и дефисами (например, ‘123.45.67.89’). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа
struct in_addr, который является типом C для 32-битных упакованных двоичных данных, которые функция принимает в качестве аргумента.Если последовательность байтов, переданная в эту функцию, не имеет длины ровно 4 байта, будет поднято исключение
OSError.inet_ntoa()не поддерживает IPv6, и для поддержки IPv4/v6 дуального стека следует использоватьinet_ntop().Изменено в версии 3.5: Теперь принимается объект типа bytes-like object, допускающий запись.
-
socket.inet_pton(address_family, ip_string) -
Преобразование IP-адреса из его семейно-специфичного строкового формата в упакованный двоичный формат.
inet_pton()полезна, когда библиотека или сетевой протокол требует объекта типаstruct in_addr(аналогичноinet_aton()) илиstruct 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-like object некоторой длины в байтах) в его стандартное семейно-специфичное строковое представление (например,
'7.10.0.5'или'5aef:2b::8').inet_ntop()полезна, когда библиотека или сетевой протокол возвращает объект типаstruct in_addr(аналогичноinet_ntoa()) илиstruct in6_addr.Поддерживаемые значения для address_family в настоящее время это
AF_INETиAF_INET6. Если объект типа bytes packed_ip не имеет правильной длины для указанного семейства адресов, будет поднято исключениеValueError. ИсключениеOSErrorподнимается при ошибках, возникающих при вызовеinet_ntop().Доступность: Unix (возможно, не на всех платформах), Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
Изменено в версии 3.5: Теперь принимается объект типа bytes-like object, допускающий запись.
-
socket.CMSG_LEN(length) -
Возвращает полную длину, без хвостового заполнения, элемента данных вспомогательной информации с ассоциированными данными заданной длины. Это значение часто может использоваться в качестве размера буфера для
recvmsg()для получения одного элемента данных вспомогательной информации, но RFC 3542 требует, чтобы переносимые приложения использовалиCMSG_SPACE()и, таким образом, включали пространство для заполнения, даже когда элемент является последним в буфере. ВызываетOverflowError, если length находится вне допустимого диапазона значений.Доступность: большинство платформ Unix, возможно и другие.
Добавлена в версии 3.3.
-
socket.CMSG_SPACE(length) -
Возвращает размер буфера, необходимый для
recvmsg()для получения элемента данных вспомогательной информации с ассоциированными данными заданной длины, а также любого хвостового заполнения. Необходимое пространство буфера для получения нескольких элементов является суммой значенийCMSG_SPACE()для длин их ассоциированных данных. ВызываетOverflowError, если length находится вне допустимого диапазона значений.Обратите внимание, что некоторые системы могут поддерживать данные вспомогательной информации без предоставления этой функции. Также обратите внимание, что установка размера буфера с использованием результатов этой функции может не точно ограничивать количество получаемых данных вспомогательной информации, так как дополнительные данные могут уместиться в области заполнения.
Доступность: большинство платформ 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.
Новое в версии 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.
Новое в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
См. также
«Имя интерфейса» — это имя, как описано в
if_nameindex().
-
socket.if_indextoname(if_index) -
Возвращает имя сетевого интерфейса, соответствующее номеру индекса интерфейса.
OSError, если интерфейс с данным индексом не существует.Доступность: Unix, Windows.
Новое в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
См. также
«Имя интерфейса» — это имя, как описано в
if_nameindex().
Объекты сокета
Объекты сокета имеют следующие методы. За исключением makefile(), они соответствуют системным вызовам Unix, применимым к сокетам.
Изменено в версии 3.2: Добавлена поддержка протокола менеджера контекста. Выход из менеджера контекста эквивалентен вызову close().
-
socket.accept() -
Принять подключение. Сокет должен быть привязан к адресу и ожидать подключений. Результатом является пара
(conn, address), где conn — новый объект сокета, используемый для отправки и получения данных по подключению, а address — адрес, привязанный к сокету на другом конце соединения.Новый созданный сокет не наследуется.
Изменено в версии 3.4: Сокет теперь не наследуется.
Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо повышения исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.bind(address) -
Привязать сокет к адресу. Сокет не должен быть уже привязан. (Формат address зависит от семейства адресов — см. выше.)
Вызывает событие аудита аудита
socket.bindс аргументамиself,address.
-
socket.close() -
Пометить сокет закрытым. Базовый системный ресурс (например, дескриптор файла) также закрывается, когда все объекты файлов из
makefile()закрываются. После этого все последующие операции с объектом сокета завершатся ошибкой. Удаленный конец не будет получать больше данных (после того, как очереди данных будут сброшены).Сокеты автоматически закрываются при сборе мусора, но рекомендуется явно закрывать их
close()или использовать операторwithвокруг них.Изменено в версии 3.6:
OSErrorтеперь генерируется, если при выполнении базового вызоваclose()возникла ошибка.Примечание
close()освобождает ресурс, связанный с подключением, но не обязательно закрывает подключение немедленно. Если вы хотите закрыть подключение своевременно, вызовитеshutdown()передclose().
-
socket.connect(address) -
Подключиться к удалённому сокету по адресу address. (Формат address зависит от семейства адресов — см. выше.)
Если подключение прерывается сигналом, метод ожидает завершения подключения или генерирует
socket.timeoutпри превышении времени ожидания, если обработчик сигнала не вызывает исключение, а сокет блокирующий или имеет таймаут. Для неблокирующих сокетов метод вызывает исключениеInterruptedError, если подключение прерывается сигналом (или исключение, вызванное обработчиком сигнала).Вызывает событие аудита аудита
socket.connectс аргументамиself,address.Изменено в версии 3.5: Метод теперь ожидает завершения подключения вместо повышения исключения
InterruptedError, если подключение прерывается сигналом, обработчик сигнала не вызывает исключение, а сокет блокирующий или имеет таймаут (см. PEP 475 для обоснования).
-
socket.connect_ex(address) -
Как
connect(address), но возвращает индикатор ошибки вместо повышения исключения для ошибок, возвращаемых вызовом C-уровняconnect()(другие проблемы, такие как «хост не найден», все ещё могут вызывать исключения). Индикатор ошибки —0, если операция выполнена успешно, в противном случае значение переменнойerrno. Это полезно для поддержки, например, асинхронных подключений.Вызывает событие аудита аудита
socket.connectс аргументамиself,address.
-
socket.detach() -
Перевести объект сокета в состояние закрытия без фактического закрытия базового дескриптора файла. Дескриптор файла возвращается и может быть повторно использован для других целей.
Добавлено в версии 3.2.
-
socket.dup() -
Дублировать сокет.
Новый созданный сокет не наследуется.
Изменено в версии 3.4: Сокет теперь не наследуется.
-
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, закодированных как строковые значения).
-
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); он определяет количество необработанных подключений, которые система позволит, прежде чем отклонить новые подключения. Если он не указан, выбирается значение по умолчанию.
Изменено в версии 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 должно быть относительно небольшим степенью двойки, например, 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часть. Для получения полного адреса IPv6 используйтеgetnameinfo().
-
socket.recvmsg(bufsize[, ancbufsize[, flags]]) -
Принимает обычные данные (до bufsize байт) и служебные данные из сокета. Аргумент ancbufsize задаёт размер внутреннего буфера в байтах, используемого для приёма служебных данных; по умолчанию он равен 0, что означает, что служебные данные не будут приниматься. Соответствующие размеры буфера для служебных данных можно рассчитать с помощью
CMSG_SPACE()илиCMSG_LEN(), а элементы, которые не помещаются в буфер, могут быть усечены или отброшены. Аргумент flags по умолчанию равен 0 и имеет то же значение, что и дляrecv().Возвращаемое значение — кортеж из 4 элементов:
(data, ancdata, msg_flags, address). Элемент data — объектbytes, содержащий принятые неслужебные данные. Элемент ancdata — список из нуля или более кортежей(cmsg_level, cmsg_type, cmsg_data), представляющих служебные данные (управляющие сообщения): cmsg_level и cmsg_type — целые числа, указывающие уровень протокола и тип, специфичный для протокола, соответственно, а cmsg_data — объектbytes, содержащий связанные данные. Элемент msg_flags — побитовое ИЛИ различных флагов, указывающих условия для принятого сообщения; см. документацию вашей системы для получения подробностей. Если принимающий сокет не подключен, address — это адрес сокета, отправившего данные, если доступен; в противном случае его значение не определено.На некоторых системах
sendmsg()иrecvmsg()могут использоваться для передачи дескрипторов файлов между процессами через сокетAF_UNIX. Когда используется этот механизм (часто ограниченный для сокетовSOCK_STREAM),recvmsg()вернёт в своих служебных данных элементы вида(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds), где fds — объектbytes, представляющий новые дескрипторы файлов в виде двоичного массива с типомintиз родного C. Еслиrecvmsg()вызывает исключение после возврата системного вызова, то в первую очередь будет предпринята попытка закрыть любые дескрипторы файлов, полученные этим способом.На некоторых системах не указывается усечённая длина элементов служебных данных, которые были получены только частично. Если элемент, похоже, выходит за пределы конца буфера,
recvmsg()выдастRuntimeWarning, и вернёт его часть, которая находится внутри предоставленного буфера, при условии, что она не была усечена до начала связанных с ней данных.На системах, которые поддерживают механизм
SCM_RIGHTS, следующая функция примет до maxfds дескрипторов файлов, вернув данные сообщения и список, содержащий дескрипторы (игнорируя неожиданные условия, такие как получение не относящихся к делу управляющих сообщений). См. такжеsendmsg().import socket, array def recv_fds(sock, msglen, maxfds): fds = array.array("i") # Array of ints msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize)) for cmsg_level, cmsg_type, cmsg_data in ancdata: if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS: # Append data, ignoring any truncated integers at the end. fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) return msg, list(fds)Доступность: большинство Unix-платформ, возможно, и другие.
Новая в версии 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, возможно, и другие.
Введено в версии 3.3.
-
socket.recvfrom_into(buffer[, nbytes[, flags]]) -
Принять данные из сокета, записав их в buffer вместо создания новой строки байтов. Значение возврата — пара
(nbytes, address), где nbytes — количество принятых байтов, а address — адрес сокета, отправляющего данные. Обратитесь к странице справочника Unix recv(2), чтобы узнать значение необязательного аргумента flags; он имеет значение по умолчанию ноль. (Формат address зависит от семейства адресов — см. выше.)
-
socket.recv_into(buffer[, nbytes[, flags]]) -
Принять до nbytes байтов из сокета, сохраняя данные в буфере, а не создавая новую строку байтов. Если nbytes не указан (или равен 0), принять до размера, доступного в заданном буфере. Возвращает количество принятых байтов. Обратитесь к странице справочника Unix recv(2), чтобы узнать значение необязательного аргумента flags; он имеет значение по умолчанию ноль.
-
socket.send(bytes[, flags]) -
Отправить данные в сокет. Сокет должен быть подключен к удаленному сокету. Необязательный аргумент flags имеет такое же значение, как и для
recv()выше. Возвращает количество отправленных байтов. Приложения несут ответственность за проверку того, что все данные были отправлены; если было передано только часть данных, приложению необходимо предпринять попытку доставки оставшихся данных. Дополнительную информацию по этой теме см. в Руководство по программированию сокетов.Изменено в версии 3.5: Если системный вызов прерывается, и обработчик сигналов не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо вызова исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendall(bytes[, flags]) -
Отправить данные в сокет. Сокет должен быть подключен к удаленному сокету. Необязательный аргумент flags имеет такое же значение, как и для
recv()выше. В отличие отsend(), этот метод продолжает отправлять данные из bytes, пока все данные не будут отправлены или не произойдет ошибка.Noneвозвращается при успехе. При ошибке генерируется исключение, и нет способа определить, сколько данных, если таковые имеются, было успешно отправлено.Изменено в версии 3.5: Таймаут сокета больше не сбрасывается каждый раз, когда данные отправляются успешно. Таймаут сокета теперь является максимальной общей продолжительностью отправки всех данных.
Изменено в версии 3.5: Если системный вызов прерывается, и обработчик сигналов не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо вызова исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendto(bytes, address) -
socket.sendto(bytes, flags, address) -
Отправить данные в сокет. Сокет не должен быть подключен к удаленному сокету, поскольку целевой сокет задается параметром address. Необязательный аргумент flags имеет такое же значение, как и для
recv()выше. Возвращает количество отправленных байтов. (Формат address зависит от семейства адресов — см. выше.)Вызывает событие аудита
socket.sendtoс аргументамиself,address.Изменено в версии 3.5: Если системный вызов прерывается, и обработчик сигналов не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо вызова исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendmsg(buffers[, ancdata[, flags[, address]]]) -
Отправить обычные и дополнительные данные в сокет, собрав не относящиеся к дополнительным данным данные из ряда буферов и объединив их в одно сообщение. Аргумент buffers задает данные, не относящиеся к дополнительным данным, как итерируемый объект объектов подобных байтам (например,
bytesобъекты); операционная система может установить ограничение (sysconf()значениеSC_IOV_MAX) на количество используемых буферов. Аргумент ancdata задает дополнительные данные (сообщения управления) как итерируемый объект нуля или более кортежей(cmsg_level, cmsg_type, cmsg_data), где cmsg_level и cmsg_type — целые числа, соответственно, указывающие уровень протокола и тип протокола, а cmsg_data — объект типа 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, возможно, и другие.
Вызывает событие аудита
socket.sendmsgс аргументамиself,address.Введено в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерывается, и обработчик сигналов не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо вызова исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]]) -
Специализированная версия
sendmsg()для сокетаAF_ALG. Установите режим, IV, длину ассоциированных данных AEAD и флаги для сокетаAF_ALG.Доступность: Linux >= 2.6.38.
Введено в версии 3.6.
-
socket.sendfile(file, offset=0, count=None) -
Отправить файл до достижения конца файла, используя высокопроизводительный метод
os.sendfile, и вернуть общее количество отправленных байтов. file должен быть объектом файла, открытым в двоичном режиме. Еслиos.sendfileнедоступен (например, в Windows) или file не является обычным файлом, будет использоватьсяsend(). offset указывает, с какой позиции начать чтение файла. Если указано, count — это общее количество байтов для передачи вместо отправки файла до конца. Положение файла обновляется при возврате или в случае ошибки, в этом случаеfile.tell()можно использовать для определения количества отправленных байтов. Сокет должен быть типаSOCK_STREAM. Неблокирующие сокеты не поддерживаются.Новая в версии 3.5.
-
socket.set_inheritable(inheritable) -
Установить флаг наследуемости для дескриптора файла сокета или дескриптора сокета.
Новая в версии 3.4.
-
socket.setblocking(flag) -
Установить режим блокировки или неблокирующего режима для сокета: если flag ложно, сокет устанавливается в неблокирующий режим, иначе в блокирующий режим.
Этот метод является сокращением для определенных вызовов
settimeout():-
sock.setblocking(True)эквивалентноsock.settimeout(None) -
sock.setblocking(False)эквивалентноsock.settimeout(0.0)
Изменено в версии 3.7: Метод больше не применяет флаг
SOCK_NONBLOCKкsocket.type. -
-
socket.settimeout(value) -
Установить таймаут для блокирующих операций с сокетом. Аргумент value может быть неотрицательным числом с плавающей точкой, представляющим секунды, или
None. Если задано ненулевое значение, последующие операции с сокетом приведут к исключениюtimeout, если истечёт период таймаута value до завершения операции. Если задано ноль, сокет переводится в неблокирующий режим. Если заданоNone, сокет переводится в блокирующий режим.Для получения дополнительной информации, пожалуйста, обратитесь к примечаниям по таймаутам сокетов.
Изменено в версии 3.7: Метод больше не переключает флаг
SOCK_NONBLOCKнаsocket.type.
-
socket.setsockopt(level, optname, value: int)
-
socket.setsockopt(level, optname, value: buffer)
-
socket.setsockopt(level, optname, None, optlen: int) -
Установить значение заданного параметра сокета (см. страницу руководства Unix setsockopt(2)). Необходимые символьные константы определены в модуле
socket(SO_*и т.д.). Значение может быть целым числом,Noneили объектом-подобным байтам, представляющим буфер. В последнем случае, вызывающий должен гарантировать, что строка байтов содержит правильные биты (см. необязательный встроенный модульstructдля способа кодирования C-структур в строки байтов). Когда value установлено вNone, требуется аргумент optlen. Он эквивалентен вызовуsetsockopt()C-функции сoptval=NULLиoptlen=optlen.Изменено в версии 3.5: Теперь принимается записываемый объект-подобный байтам.
Изменено в версии 3.6: Добавлена форма setsockopt(level, optname, None, optlen: int).
-
socket.shutdown(how) -
Закрыть одну или обе половины соединения. Если how равно
SHUT_RD, дальнейшие приёмы запрещаются. Если how равноSHUT_WR, дальнейшие отправки запрещаются. Если how равноSHUT_RDWR, дальнейшие отправки и приёмы запрещаются.
-
Создать дубликат сокета и подготовить его для совместного использования с целевым процессом. Целевой процесс должен быть предоставлен с process_id. Полученный объект байтов может быть передан целевому процессу с помощью некоторого вида межпроцессного взаимодействия, и сокет может быть там воссоздан с помощью
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 packages s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) # receive a package 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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/socket.html