socket
— Низкоуровневый сетевой интерфейс¶
Исходный код: Lib/socket.py.
Этот модуль предоставляет доступ к интерфейсу BSD socket. Он доступен на всех современных Unix-системах, Windows, MacOS и, возможно, на других платформах.
Примечание
Некоторое поведение может зависеть от платформы, поскольку выполняются вызовы API сокетов операционной системы.
Интерфейс Python представляет собой прямую транслитерацию интерфейса системных вызовов и библиотек Unix для сокетов в объектно-ориентированный стиль Python: функция socket()
возвращает socket object, методы которой реализуют различные системные вызовы сокетов. Типы параметров несколько выше, чем в интерфейсе C: как и в операциях read()
и write()
над файлами в Python, выделение буфера в операциях приема происходит автоматически, а длина буфера неявна в операциях отправки.
См.также
- Модуль
socketserver
Классы, упрощающие написание сетевых серверов.
- Модуль
ssl
Обертка TLS/SSL для объектов сокетов.
Семейства розеток¶
В зависимости от системы и вариантов сборки данный модуль поддерживает различные семейства сокетов.
Формат адреса, требуемый конкретным объектом сокета, выбирается автоматически на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представлены следующим образом:
Адрес сокета
AF_UNIX
, связанного с узлом файловой системы, представляется в виде строки с использованием кодировки файловой системы и обработчика ошибок'surrogateescape'
(см. PEP 383). Адрес в абстрактном пространстве имен Linux возвращается в виде bytes-like object с начальным нулевым байтом; обратите внимание, что сокеты в этом пространстве имен могут взаимодействовать с обычными сокетами файловой системы, поэтому программам, предназначенным для работы в Linux, возможно, придется иметь дело с обоими типами адресов. Строка или байтоподобный объект может быть использован для любого типа адреса при передаче его в качестве аргумента.Изменено в версии 3.3: Ранее предполагалось, что пути к сокетам
AF_UNIX
используют кодировку UTF-8.Изменено в версии 3.5: Теперь допускается запись bytes-like object.
Пара
(host, port)
используется для семейства адресовAF_INET
, где host - это строка, представляющая либо имя хоста в нотации интернет-домена, например'daring.cwi.nl'
, либо адрес IPv4, например'100.50.200.5'
, а port - целое число.Для адресов IPv4 вместо адреса хоста принимаются две специальные формы:
''
представляетINADDR_ANY
, который используется для привязки ко всем интерфейсам, а строка'<broadcast>'
представляетINADDR_BROADCAST
. Такое поведение несовместимо с IPv6, поэтому, если вы собираетесь поддерживать IPv6 в своих программах на Python, лучше избегать этого.
Для семейства адресов
AF_INET6
используется четверка кортежей(host, port, flowinfo, scope_id)
, где flowinfo и scope_id представляют членыsin6_flowinfo
иsin6_scope_id
вstruct sockaddr_in6
на языке С. Для методов модуляsocket
, flowinfo и 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.
Для семейства адресов
(interface, )
используется кортежAF_CAN
, где interface - это строка, представляющая имя сетевого интерфейса, например'can0'
. Имя сетевого интерфейса''
может использоваться для приема пакетов от всех сетевых интерфейсов этого семейства.Протокол
CAN_ISOTP
требует кортеж(interface, rx_addr, tx_addr)
, где оба дополнительных параметра являются беззнаковыми длинными целыми числами, представляющими идентификатор CAN (стандартный или расширенный).Протокол
CAN_J1939
требует кортеж(interface, name, pgn, addr)
, где дополнительными параметрами являются 64-битное беззнаковое целое число, представляющее имя ЭБУ, 32-битное беззнаковое целое число, представляющее номер группы параметров (PGN), и 8-битное целое число, представляющее адрес.
Строка или кортеж
(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-битные целые числа.
Availability: Linux 2.6.38, some algorithm types require more recent Kernels.
Добавлено в версии 3.6.
AF_VSOCK
позволяет осуществлять связь между виртуальными машинами и их хостами. Сокеты представлены в виде кортежа(CID, port)
, где идентификатор контекста или CID и порт являются целыми числами.Availability: 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
- Пакет на другой хост, который был пойман драйвером устройства в режиме promiscuous.PACKET_OUTGOING
- Пакет, исходящий от локального хоста, который возвращается в пакетный сокет.
hatype - Необязательное целое число, указывающее тип аппаратного адреса ARP.
addr - Необязательный байтоподобный объект, указывающий физический адрес оборудования, интерпретация которого зависит от устройства.
Availability: Linux >= 2.2.
AF_QIPCRTR
- это интерфейс на базе сокетов только для Linux для связи с сервисами, работающими на сопроцессорах в платформах Qualcomm. Семейство адресов представлено в виде кортежа(node, port)
, где node и port - неотрицательные целые числа.Availability: 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.Availability: Linux >= 2.6.20, FreeBSD >= 10.1-RELEASE
Добавлено в версии 3.9.
Если вы используете имя хоста в части host адреса сокета IPv4/v6, программа может показать недетерминированное поведение, так как Python использует первый адрес, полученный в результате разрешения DNS. Адрес сокета будет преобразован в фактический адрес IPv4/v6 по-разному, в зависимости от результатов разрешения DNS и/или конфигурации хоста. Для детерминированного поведения используйте числовой адрес в части host.
Все ошибки вызывают исключения. Могут быть вызваны обычные исключения для недопустимых типов аргументов и условий отсутствия памяти. Ошибки, связанные с семантикой сокета или адреса, вызывают OSError
или один из его подклассов.
Неблокирующий режим поддерживается через setblocking()
. Обобщение этого режима, основанное на таймаутах, поддерживается через settimeout()
.
Содержание модуля¶
Модуль socket
экспортирует следующие элементы.
Исключения¶
-
exception
socket.
herror
¶ Подкласс
OSError
, это исключение возникает для ошибок, связанных с адресом, т.е. для функций, использующих h_errno в POSIX C API, включаяgethostbyname_ex()
иgethostbyaddr()
. Сопутствующим значением является пара(h_errno, string)
, представляющая ошибку, возвращенную вызовом библиотеки. h_errno является числовым значением, а string представляет описание h_errno, возвращаемое функциейhstrerror()
Си.Изменено в версии 3.3: Этот класс был сделан подклассом
OSError
.
-
exception
socket.
gaierror
¶ Являясь подклассом
OSError
, это исключение вызывается при ошибках, связанных с адресамиgetaddrinfo()
иgetnameinfo()
. Сопутствующим значением является пара(error, string)
, представляющая ошибку, возвращенную вызовом библиотеки. Строка string представляет описание error, возвращаемое функциейgai_strerror()
языка Си. Числовое значение error будет соответствовать одной из константEAI_*
, определенных в этом модуле.Изменено в версии 3.3: Этот класс был сделан подклассом
OSError
.
-
exception
socket.
timeout
¶ Утративший силу псевдоним
TimeoutError
.Являясь подклассом
OSError
, это исключение возникает, когда происходит тайм-аут на сокете, у которого тайм-аут был включен через предыдущий вызовsettimeout()
(или неявно черезsetdefaulttimeout()
). Сопутствующим значением является строка, значение которой в настоящее время всегда «timed out».Изменено в версии 3.3: Этот класс был сделан подклассом
OSError
.Изменено в версии 3.10: Этот класс был сделан псевдонимом
TimeoutError
.
Константы¶
Константы AF_* и SOCK_* теперь являются коллекциями
AddressFamily
иSocketKind
IntEnum
.Добавлено в версии 3.4.
-
socket.
AF_UNIX
¶ -
socket.
AF_INET
¶ -
socket.
AF_INET6
¶ Эти константы представляют семейства адресов (и протоколов), используемые для первого аргумента
socket()
. Если константаAF_UNIX
не определена, то данный протокол не поддерживается. В зависимости от системы могут быть доступны и другие константы.
-
socket.
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
¶ Эти две константы, если они определены, могут быть объединены с типами сокетов и позволяют устанавливать некоторые флаги атомарно (таким образом избегая возможных условий гонки и необходимости отдельных вызовов).
См.также
Secure File Descriptor Handling для более подробного объяснения.
Availability: 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.
-
socket.
AF_CAN
¶ -
socket.
PF_CAN
¶ -
SOL_CAN_*
-
CAN_*
Многие константы этих форм, документированные в документации Linux, также определены в модуле socket.
Availability: Linux >= 2.6.25.
Добавлено в версии 3.3.
-
socket.
CAN_BCM
¶ -
CAN_BCM_*
CAN_BCM, в семействе протоколов CAN, является протоколом менеджера широковещания (BCM). Константы менеджера широковещания, описанные в документации Linux, также определены в модуле сокета.
Availability: 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.
Availability: Linux >= 3.6.
Добавлено в версии 3.5.
-
socket.
CAN_RAW_JOIN_FILTERS
¶ Объединяет примененные CAN-фильтры таким образом, что только CAN-кадры, соответствующие всем заданным CAN-фильтрам, передаются в пространство пользователя.
Эта константа описана в документации по Linux.
Availability: Linux >= 4.1.
Добавлено в версии 3.9.
-
socket.
CAN_ISOTP
¶ CAN_ISOTP, в семействе протоколов CAN, является протоколом ISO-TP (ISO 15765-2). Константы ISO-TP, документированные в документации Linux.
Availability: Linux >= 2.6.25.
Добавлено в версии 3.7.
-
socket.
CAN_J1939
¶ CAN_J1939, в семействе протоколов CAN, является протоколом SAE J1939. Константы J1939, документированные в документации Linux.
Availability: Linux >= 5.4.
Добавлено в версии 3.9.
-
socket.
AF_PACKET
¶ -
socket.
PF_PACKET
¶ -
PACKET_*
Многие константы этих форм, документированные в документации Linux, также определены в модуле socket.
Availability: Linux >= 2.2.
-
socket.
AF_RDS
¶ -
socket.
PF_RDS
¶ -
socket.
SOL_RDS
¶ -
RDS_*
Многие константы этих форм, документированные в документации Linux, также определены в модуле socket.
Availability: 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.
Availability: Linux >= 2.6.38.
Добавлено в версии 3.6.
-
socket.
AF_VSOCK
¶ -
socket.
IOCTL_VM_SOCKETS_GET_LOCAL_CID
¶ -
VMADDR*
-
SO_VM*
Константы для связи хост/гость в Linux.
Availability: Linux >= 4.8.
Добавлено в версии 3.7.
-
socket.
AF_LINK
¶ Availability: 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, используемого для связи с удаленными процессорами, предоставляющими услуги.
Availability: Linux >= 4.7.
Функции¶
Создание сокетов¶
Все следующие функции создают socket objects.
-
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 определяются автоматически из указанного дескриптора файла. Автоопределение можно отменить, вызвав функцию с явными аргументами семейство, тип или прото. Это влияет только на то, как Python представляет, например, возвращаемое значение
socket.getpeername()
, но не на фактический ресурс ОС. В отличие отsocket.fromfd()
, fileno вернет тот же сокет, а не дубликат. Это может помочь закрыть отсоединенный сокет с помощьюsocket.close()
.Вновь созданный сокет имеет номер non-inheritable.
Поднимает auditing event
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
.Вновь созданные сокеты имеют значение non-inheritable.
Изменено в версии 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 должен представлять собой кортеж
(host, port)
для привязки сокета в качестве адреса источника перед подключением. Если host или port равны „“ или 0 соответственно, будет использоваться поведение по умолчанию в ОС.Изменено в версии 3.2: Был добавлен адрес_источника.
-
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()
; при0
по умолчанию выбирается разумное значение. reuse_port определяет, устанавливать ли опцию сокетаSO_REUSEPORT
.Если dualstack_ipv6 равен true и платформа поддерживает его, то сокет сможет принимать как IPv4, так и IPv6 соединения, в противном случае он будет выдавать
ValueError
. Большинство платформ POSIX и Windows должны поддерживать эту функциональность. Когда эта функциональность включена, адрес, возвращаемыйsocket.getpeername()
при возникновении IPv4-соединения, будет IPv6-адресом, представленным как IPv4-mapped 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()
, описанной выше. Дескриптор файла должен ссылаться на сокет, но это не проверяется — последующие операции над объектом могут завершиться неудачей, если дескриптор файла недействителен. Эта функция нужна редко, но может использоваться для получения или установки параметров сокета, переданного программе в качестве стандартного ввода или вывода (например, сервер, запущенный демоном inet в Unix). Предполагается, что сокет находится в блокирующем режиме.Вновь созданный сокет имеет номер non-inheritable.
Изменено в версии 3.4: Возвращаемый сокет теперь не наследуется.
Создайте сокет из данных, полученных из метода
socket.share()
. Предполагается, что сокет находится в блокирующем режиме.Availability: 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.Аргументы семейство, тип и прото могут быть указаны дополнительно, чтобы сузить список возвращаемых адресов. Передача нуля в качестве значения для каждого из этих аргументов выбирает полный диапазон результатов. Аргумент flags может быть одной или несколькими из констант
AI_*
, и будет влиять на то, как будут вычисляться и возвращаться результаты. Например,AI_NUMERICHOST
отключает разрешение доменных имен и выдает ошибку, если host является доменным именем.Функция возвращает список из 5 кортежей со следующей структурой:
(family, type, proto, canonname, sockaddr)
В этих кортежах family, type, proto являются целыми числами и предназначены для передачи в функцию
socket()
. canonname будет строкой, представляющей каноническое имя хоста, еслиAI_CANONNAME
является частью аргумента flags; в противном случае canonname будет пустым. sockaddr - это кортеж, описывающий адрес сокета, формат которого зависит от возвращаемого семейства (2-кортеж(address, port)
дляAF_INET
, 4-кортеж(address, port, flowinfo, scope_id)
дляAF_INET6
), и предназначен для передачи методуsocket.connect()
.Поднимает auditing event
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>, <AddressFamily.SOCK_STREAM: 1>, 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)), (<AddressFamily.AF_INET: 2>, <AddressFamily.SOCK_STREAM: 1>, 6, '', ('93.184.216.34', 80))]
Изменено в версии 3.2: параметры теперь можно передавать с помощью аргументов ключевых слов.
Изменено в версии 3.7: для многоадресных адресов IPv6 строка, представляющая адрес, не будет содержать часть
%scope_id
.
-
socket.
getfqdn
([name])¶ Возвращает полное доменное имя для name. Если name опущено или пусто, оно интерпретируется как локальный хост. Чтобы найти полное квалифицированное имя, проверяется имя хоста, возвращаемое командой
gethostbyaddr()
, а затем псевдонимы хоста, если таковые имеются. Выбирается первое имя, содержащее точку. Если доменное имя недоступно и было указано name, оно возвращается без изменений. Если name было пустым или равным'0.0.0.0'
, возвращается имя хоста изgethostname()
.
-
socket.
gethostbyname
(hostname)¶ Перевести имя хоста в формат адреса IPv4. IPv4-адрес возвращается в виде строки, например
'100.50.200.5'
. Если имя хоста само является адресом IPv4, оно возвращается без изменений. Более полный интерфейс см. в разделеgethostbyname_ex()
.gethostbyname()
не поддерживает разрешение имен IPv6, и вместо него следует использоватьgetaddrinfo()
для поддержки двойного стека IPv4/v6.Вызывает auditing event
socket.gethostbyname
с аргументомhostname
.
-
socket.
gethostbyname_ex
(hostname)¶ Перевести имя хоста в формат адреса IPv4, расширенный интерфейс. Возвращает тройку
(hostname, aliaslist, ipaddrlist)
, где hostname - основное имя хоста, aliaslist - (возможно пустой) список альтернативных имен хоста для того же адреса, а ipaddrlist - список адресов IPv4 для того же интерфейса на том же хосте (часто, но не всегда один адрес).gethostbyname_ex()
не поддерживает разрешение имен IPv6, и вместо него следует использоватьgetaddrinfo()
для поддержки двойного стека IPv4/v6.Вызывает auditing event
socket.gethostbyname
с аргументомhostname
.
-
socket.
gethostname
()¶ Возвращает строку, содержащую имя хоста машины, на которой в данный момент выполняется интерпретатор Python.
Вызывает auditing event
socket.gethostname
без аргументов.Примечание:
gethostname()
не всегда возвращает полное доменное имя; для этого используйтеgetfqdn()
.
-
socket.
gethostbyaddr
(ip_address)¶ Возвращает тройку
(hostname, aliaslist, ipaddrlist)
, где hostname - основное имя хоста, отвечающее данному ip_address, aliaslist - (возможно пустой) список альтернативных имен хостов для того же адреса, а ipaddrlist - список IPv4/v6 адресов для того же интерфейса на том же хосте (скорее всего, содержащий только один адрес). Чтобы найти полностью квалифицированное доменное имя, используйте функциюgetfqdn()
.gethostbyaddr()
поддерживает как IPv4, так и IPv6.Вызывает auditing event
socket.gethostbyaddr
с аргументомip_address
.
-
socket.
getnameinfo
(sockaddr, flags)¶ Преобразовать адрес сокета sockaddr в 2-кортеж
(host, port)
. В зависимости от настроек flags, результат может содержать полное доменное имя или числовое представление адреса в host. Аналогично, port может содержать строковое имя порта или числовой номер порта.Для адресов IPv6 к части host добавляется
%scope_id
, если sockaddr содержит значимый scope_id. Обычно это происходит для многоадресных адресов.Для получения дополнительной информации о флагах вы можете обратиться к getnameinfo(3).
Вызывает auditing event
socket.getnameinfo
с аргументомsockaddr
.
-
socket.
getprotobyname
(protocolname)¶ Перевести имя интернет-протокола (например,
'icmp'
) в константу, подходящую для передачи в качестве (необязательного) третьего аргумента функцииsocket()
. Обычно это необходимо только для сокетов, открытых в «сыром» режиме (SOCK_RAW
); для обычных режимов сокетов правильный протокол выбирается автоматически, если протокол опущен или равен нулю.
-
socket.
getservbyname
(servicename[, protocolname])¶ Переводит имя интернет-сервиса и имя протокола в номер порта для этого сервиса. Необязательное имя протокола, если задано, должно быть
'tcp'
или'udp'
, иначе подойдет любой протокол.Вызывает auditing event
socket.getservbyname
с аргументамиservicename
,protocolname
.
-
socket.
getservbyport
(port[, protocolname])¶ Перевести номер интернет-порт и имя протокола в имя службы для этой службы. Необязательное имя протокола, если задано, должно быть
'tcp'
или'udp'
, иначе подойдет любой протокол.Вызывает auditing event
socket.getservbyport
с аргументамиport
,protocolname
.
-
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-битный упакованный двоичный формат в виде байтового объекта длиной четыре символа. Это полезно при работе с программой, использующей стандартную библиотеку C и нуждающейся в объектах типа struct in_addr, который является типом C для 32-битного упакованного двоичного формата, возвращаемого этой функцией.
inet_aton()
также принимает строки, содержащие менее трех точек; подробности см. на странице руководства по Unix inet(3).Если строка адреса IPv4, переданная в эту функцию, недействительна, будет выдано сообщение
OSError
. Обратите внимание, что то, что именно является допустимым, зависит от реализацииinet_aton()
на языке Си.inet_aton()
не поддерживает IPv6, иinet_pton()
следует использовать вместо него для поддержки двойного стека IPv4/v6.
-
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, и вместо него следует использоватьinet_ntop()
для поддержки двойного стека IPv4/v6.Изменено в версии 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()
.Availability: 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
. Если байтовый объект packed_ip не имеет правильной длины для указанного семейства адресов, будет выдано сообщениеValueError
.OSError
возникает при ошибках, связанных с вызовомinet_ntop()
.Availability: Unix (возможно, не все платформы), Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
Изменено в версии 3.5: Теперь допускается запись bytes-like object.
-
socket.
CMSG_LEN
(length)¶ Возвращает общую длину, без подкладок, элемента вспомогательных данных с сопутствующими данными заданной длины. Это значение часто можно использовать как размер буфера для
recvmsg()
для получения одного элемента вспомогательных данных, но RFC 3542 требует, чтобы портативные приложения использовалиCMSG_SPACE()
и, следовательно, включали место для заполнения, даже если этот элемент будет последним в буфере. ВызываетOverflowError
, если length выходит за пределы допустимого диапазона значений.Availability: большинство платформ Unix, возможно и другие.
Добавлено в версии 3.3.
-
socket.
CMSG_SPACE
(length)¶ Возвращает размер буфера, необходимый
recvmsg()
для приема вспомогательного элемента данных с ассоциированными данными заданной длины, вместе с любой последующей прокладкой. Размер буфера, необходимый для приема нескольких элементов, равен сумме значенийCMSG_SPACE()
для их ассоциированных длин данных. Вызывает ошибкуOverflowError
, если length находится вне допустимого диапазона значений.Обратите внимание, что некоторые системы могут поддерживать вспомогательные данные без предоставления этой функции. Также обратите внимание, что установка размера буфера с помощью результатов этой функции может не точно ограничивать объем вспомогательных данных, которые могут быть получены, так как дополнительные данные могут поместиться в область подстановки.
Availability: большинство платформ Unix, возможно и другие.
Добавлено в версии 3.3.
-
socket.
getdefaulttimeout
()¶ Возвращает тайм-аут по умолчанию в секундах (float) для новых объектов сокетов. Значение
None
означает, что новые объекты сокетов не имеют тайм-аута. Когда модуль socket импортируется впервые, по умолчанию используется значениеNone
.
-
socket.
setdefaulttimeout
(timeout)¶ Устанавливает тайм-аут по умолчанию в секундах (float) для новых объектов сокетов. Когда модуль сокетов импортируется впервые, по умолчанию используется значение
None
. Возможные значения и их соответствующие значения см. вsettimeout()
.
-
socket.
sethostname
(name)¶ Установите имя хоста машины на name. Это вызовет ошибку
OSError
, если у вас недостаточно прав.Вызывает auditing event
socket.sethostname
с аргументомname
.Availability: Unix.
Добавлено в версии 3.3.
-
socket.
if_nameindex
()¶ Возвращает список кортежей информации о сетевом интерфейсе (index int, name string).
OSError
если системный вызов завершился неудачно.Availability: 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
в данном примере.
-
socket.
if_nametoindex
(if_name)¶ Возвращает номер индекса сетевого интерфейса, соответствующий имени интерфейса.
OSError
если интерфейса с заданным именем не существует.Availability: Unix, Windows.
Добавлено в версии 3.3.
Изменено в версии 3.8: Была добавлена поддержка Windows.
См.также
«Имя интерфейса» - это имя, документированное в
if_nameindex()
.
-
socket.
if_indextoname
(if_index)¶ Возвращает имя сетевого интерфейса, соответствующее номеру индекса интерфейса.
OSError
если интерфейса с заданным индексом не существует.Availability: Unix, Windows.
Добавлено в версии 3.3.
Изменено в версии 3.8: Была добавлена поддержка Windows.
См.также
«Имя интерфейса» - это имя, документированное в
if_nameindex()
.
-
socket.
send_fds
(sock, buffers, fds[, flags[, address]])¶ Передать список файловых дескрипторов fds через
AF_UNIX
сокет sock. Параметр fds представляет собой последовательность дескрипторов файлов. Обратитесь кsendmsg()
за документацией по этим параметрам.Availability: Unix, поддерживающий механизм
sendmsg()
иSCM_RIGHTS
.Добавлено в версии 3.9.
-
socket.
recv_fds
(sock, bufsize, maxfds[, flags])¶ Получение до maxfds файловых дескрипторов с
AF_UNIX
сокета sock. Возвращает(msg, list(fds), flags, addr)
. Обратитесь кrecvmsg()
за документацией по этим параметрам.Availability: Unix, поддерживающий механизм
recvmsg()
иSCM_RIGHTS
.Добавлено в версии 3.9.
Примечание
Любые усеченные целые числа в конце списка дескрипторов файлов.
Объекты сокетов¶
Объекты Socket имеют следующие методы. За исключением makefile()
, они соответствуют системным вызовам Unix, применимым к сокетам.
Изменено в версии 3.2: Добавлена поддержка протокола context manager. Выход из контекстного менеджера эквивалентен вызову close()
.
-
socket.
accept
()¶ Принять соединение. Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение представляет собой пару
(conn, address)
, где conn - это новый объект сокета, используемый для отправки и получения данных по соединению, а address - это адрес, привязанный к сокету на другом конце соединения.Вновь созданный сокет имеет номер non-inheritable.
Изменено в версии 3.4: Теперь сокет не наследуется.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызвать исключение
InterruptedError
(см. обоснование в PEP 475).
-
socket.
bind
(address)¶ Привязать сокет к адресу. Сокет не должен быть уже привязан. (Формат адрес зависит от семейства адресов - см. выше).
Вызывает auditing event
socket.bind
с аргументамиself
,address
.
-
socket.
close
()¶ Пометить сокет закрытым. Базовый системный ресурс (например, дескриптор файла) также закрывается, когда закрываются все объекты файлов из
makefile()
. Как только это произойдет, все дальнейшие операции над объектом сокета будут неудачными. Удаленный конец больше не будет получать данные (после того, как данные из очереди будут удалены).Сокеты автоматически закрываются, когда в них собирается мусор, но рекомендуется
close()
закрывать их явно или использовать вокруг них операторwith
.Изменено в версии 3.6:
OSError
теперь поднимается, если произошла ошибка при выполнении базового вызоваclose()
.Примечание
close()
освобождает ресурс, связанный с соединением, но не обязательно закрывает соединение немедленно. Если вы хотите закрыть соединение своевременно, вызовитеshutdown()
передclose()
.
-
socket.
connect
(address)¶ Подключение к удаленному сокету по адресу адрес. (Формат адрес зависит от семейства адресов - см. выше).
Если соединение прерывается сигналом, метод ждет завершения соединения или выдает
TimeoutError
по таймауту, если обработчик сигнала не выдает исключение, а сокет блокируется или имеет таймаут. Для неблокирующих сокетов метод вызывает исключениеInterruptedError
, если соединение прерывается сигналом (или исключением, вызванным обработчиком сигнала).Вызывает auditing event
socket.connect
с аргументамиself
,address
.Изменено в версии 3.5: Теперь метод ожидает завершения соединения вместо того, чтобы вызывать исключение
InterruptedError
, если соединение прервано сигналом, обработчик сигнала не вызывает исключения, а сокет блокируется или имеет таймаут (см. обоснование в PEP 475).
-
socket.
connect_ex
(address)¶ Подобно
connect(address)
, но возвращает индикатор ошибки вместо того, чтобы вызывать исключение для ошибок, возвращаемых вызовомconnect()
на уровне C (другие проблемы, такие как «хост не найден», могут по-прежнему вызывать исключения). Индикатором ошибки является0
, если операция прошла успешно, иначе - значение переменнойerrno
. Это полезно для поддержки, например, асинхронных подключений.Вызывает auditing event
socket.connect
с аргументамиself
,address
.
-
socket.
detach
()¶ Переводит объект сокета в закрытое состояние без фактического закрытия базового файлового дескриптора. Дескриптор файла возвращается и может быть повторно использован для других целей.
Добавлено в версии 3.2.
-
socket.
dup
()¶ Дублировать гнездо.
Вновь созданный сокет имеет номер non-inheritable.
Изменено в версии 3.4: Теперь сокет не наследуется.
-
socket.
fileno
()¶ Возвращает дескриптор файла сокета (маленькое целое число), или -1 в случае неудачи. Это полезно при использовании
select.select()
.В Windows маленькое целое число, возвращаемое этим методом, нельзя использовать там, где можно использовать дескриптор файла (например,
os.fdopen()
). В Unix это ограничение отсутствует.
-
socket.
get_inheritable
()¶ Получение inheritable flag файлового дескриптора сокета или дескриптора сокета:
True
если сокет может быть унаследован в дочерних процессах,False
если нет.Добавлено в версии 3.4.
-
socket.
getpeername
()¶ Возвращает удаленный адрес, к которому подключен сокет. Это полезно, например, чтобы узнать номер порта удаленного сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов — см. выше). В некоторых системах эта функция не поддерживается.
-
socket.
getsockname
()¶ Возвращает собственный адрес сокета. Это полезно, например, для определения номера порта сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов - см. выше).
-
socket.
getsockopt
(level, optname[, buflen])¶ Возвращает значение заданной опции сокета (см. Unix man page getsockopt(2)). Необходимые символьные константы (
SO_*
и т.д.) определены в этом модуле. Если buflen отсутствует, предполагается целочисленная опция, и ее целочисленное значение возвращается функцией. Если buflen присутствует, он определяет максимальную длину буфера, используемого для приема опции, и этот буфер возвращается как объект bytes. Декодирование содержимого буфера остается за вызывающей стороной (см. дополнительный встроенный модульstruct
для способа декодирования структур языка Си, закодированных как байтовые строки).
-
socket.
getblocking
()¶ Возвращает
True
, если сокет находится в блокирующем режиме,False
, если в неблокирующем.Это эквивалентно проверке
socket.gettimeout() == 0
.Добавлено в версии 3.7.
-
socket.
gettimeout
()¶ Возвращает тайм-аут в секундах (float), связанный с операциями с сокетом, или
None
, если тайм-аут не установлен. Это отражает последний вызовsetblocking()
илиsettimeout()
.
-
socket.
ioctl
(control, option)¶ - платформа
Windows
Метод
ioctl()
представляет собой ограниченный интерфейс к системному интерфейсу WSAIoctl. Пожалуйста, обратитесь к Win32 documentation для получения дополнительной информации.На других платформах можно использовать общие функции
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)¶ Возвращает file object, связанный с сокетом. Точный возвращаемый тип зависит от аргументов, переданных в
makefile()
. Эти аргументы интерпретируются так же, как и встроенная функцияopen()
, за исключением того, что единственными поддерживаемыми значениями mode являются'r'
(по умолчанию),'w'
и'b'
.Сокет должен работать в блокирующем режиме; он может иметь тайм-аут, но внутренний буфер файлового объекта может оказаться в противоречивом состоянии, если произойдет тайм-аут.
Закрытие файлового объекта, возвращаемого
makefile()
, не приведет к закрытию исходного сокета, пока не будут закрыты все остальные файловые объекты и не будет вызванsocket.close()
на объекте сокета.Примечание
В Windows файлоподобный объект, созданный командой
makefile()
, нельзя использовать там, где ожидается файловый объект с дескриптором файла, например, в аргументах потока командыsubprocess.Popen()
.
-
socket.
recv
(bufsize[, flags])¶ Получение данных из сокета. Возвращаемым значением является объект bytes, представляющий полученные данные. Максимальный объем данных, который может быть получен за один раз, задается bufsize. Значение необязательного аргумента flags см. на странице руководства Unix recv(2); по умолчанию он равен нулю.
Примечание
Для наилучшего соответствия аппаратным и сетевым реалиям значение bufsize должно быть относительно небольшим, равным 2, например, 4096.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызвать исключение
InterruptedError
(см. обоснование в PEP 475).
-
socket.
recvfrom
(bufsize[, flags])¶ Получить данные от сокета. Возвращаемое значение представляет собой пару
(bytes, address)
, где bytes - объект bytes, представляющий полученные данные, а address - адрес сокета, посылающего данные. Значение необязательного аргумента flags см. на странице руководства по Unix recv(2); по умолчанию он равен нулю. (Формат address зависит от семейства адресов — см. выше).Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызвать исключение
InterruptedError
(см. обоснование в PEP 475).Изменено в версии 3.7: Для многоадресного IPv6-адреса первый элемент адрес больше не содержит части
%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)
Availability: большинство платформ 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---')]
Availability: большинство платформ Unix, возможно и другие.
Добавлено в версии 3.3.
-
socket.
recvfrom_into
(buffer[, nbytes[, flags]])¶ Получить данные от сокета, записав их в buffer вместо создания новой строки байтов. Возвращаемым значением является пара
(nbytes, address)
, где nbytes - количество полученных байт, а address - адрес сокета, посылающего данные. Значение необязательного аргумента flags см. на странице руководства по Unix recv(2); по умолчанию он равен нулю. (Формат address зависит от семейства адресов — см. выше).
-
socket.
recv_into
(buffer[, nbytes[, flags]])¶ Получить до nbytes байт от сокета, сохраняя данные в буфер, а не создавая новую строку байтов. Если nbytes не указано (или 0), то принимается размер, доступный в данном буфере. Возвращает количество полученных байтов. Значение необязательного аргумента flags см. на странице руководства Unix recv(2); по умолчанию он равен нулю.
-
socket.
send
(bytes[, flags])¶ Отправка данных в сокет. Сокет должен быть подключен к удаленному сокету. Необязательный аргумент flags имеет то же значение, что и для
recv()
выше. Возвращает количество отправленных байтов. Приложения отвечают за проверку того, что все данные были отправлены; если была передана только часть данных, приложение должно попытаться доставить оставшиеся данные. Для получения дополнительной информации по этому вопросу обратитесь к разделу Программирование сокетов HOWTO.Изменено в версии 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) Отправка данных в сокет. Сокет не должен быть подключен к удаленному сокету, поскольку целевой сокет задается адрес. Необязательный аргумент 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 - байтоподобный объект, содержащий связанные данные. Обратите внимание, что некоторые системы (в частности, системы безCMSG_SPACE()
) могут поддерживать отправку только одного управляющего сообщения за вызов. Аргумент флаги по умолчанию равен 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))])
Availability: большинство платформ 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
.Availability: 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 равен false, сокет устанавливается в неблокирующий режим, иначе - в блокирующий.
Этот метод является сокращением для определенных вызовов
settimeout()
:sock.setblocking(True)
эквивалентноsock.settimeout(None)
sock.setblocking(False)
эквивалентноsock.settimeout(0.0)
Изменено в версии 3.7: Метод больше не применяет флаг
SOCK_NONBLOCK
наsocket.type
.
-
socket.
settimeout
(value)¶ Устанавливает таймаут на блокирование операций с сокетами. Аргумент value может быть неотрицательным числом с плавающей точкой, выражающим секунды, или
None
. Если задано ненулевое значение, последующие операции с сокетом вызовут исключениеtimeout
, если период таймаута значение истек до завершения операции. Если задано нулевое значение, сокет переводится в неблокирующий режим. Если указаноNone
, сокет переводится в блокирующий режим.Для получения дополнительной информации, пожалуйста, обратитесь к notes on socket timeouts.
Изменено в версии 3.7: Метод больше не переключает флаг
SOCK_NONBLOCK
наsocket.type
.
-
socket.
setsockopt
(level, optname, value: buffer)
-
socket.
setsockopt
(level, optname, None, optlen: int) Установить значение заданной опции сокета (см. страницу руководства по Unix setsockopt(2)). Необходимые символьные константы определены в модуле
socket
(SO_*
и т.д.). Значение может быть целым числом,None
или bytes-like object, представляющим буфер. В последнем случае вызывающая сторона должна убедиться, что байтовая строка содержит нужные биты (см. дополнительный встроенный модульstruct
для способа кодирования структур Си в виде байтовых строк). Когда value установлено вNone
, требуется аргумент optlen. Это эквивалентно вызову функцииsetsockopt()
Си сoptval=NULL
иoptlen=optlen
.Изменено в версии 3.5: Теперь допускается запись bytes-like object.
Изменено в версии 3.6: добавлена форма setsockopt(level, optname, None, optlen: int).
-
socket.
shutdown
(how)¶ Отключение одной или обеих половин соединения. Если how равно
SHUT_RD
, дальнейшие приемы запрещены. Если how равноSHUT_WR
, дальнейшие отправки запрещены. Если how равноSHUT_RDWR
, дальнейшие отправления и получения запрещены.
Дублирует сокет и подготавливает его для совместного использования с целевым процессом. Целевому процессу должен быть предоставлен process_id. Полученный объект байтов может быть передан целевому процессу с помощью какой-либо формы межпроцессного взаимодействия, и сокет может быть воссоздан там с помощью
fromshare()
. После вызова этого метода можно закрыть сокет, поскольку операционная система уже продублировала его для целевого процесса.Availability: Windows.
Добавлено в версии 3.3.
Обратите внимание, что не существует методов read()
и write()
; вместо них используйте recv()
и send()
без аргумента flags.
Объекты Socket также имеют эти атрибуты (только для чтения), которые соответствуют значениям, переданным конструктору socket
.
-
socket.
family
¶ Семейство розеток.
-
socket.
type
¶ Тип сокета.
-
socket.
proto
¶ Протокол сокета.
Замечания по таймаутам сокетов¶
Объект сокета может находиться в одном из трех режимов: блокирующий, неблокирующий или таймаут. По умолчанию сокеты всегда создаются в блокирующем режиме, но это можно изменить, вызвав команду setdefaulttimeout()
.
В режиме блокировки операции блокируются до завершения или система выдает ошибку (например, соединение прервано по времени).
В неблокирующем режиме операции завершаются неудачно (с ошибкой, которая, к сожалению, зависит от системы), если они не могут быть завершены немедленно: функции из
select
можно использовать, чтобы узнать, когда и доступен ли сокет для чтения или записи.В режиме timeout операции завершаются неудачно, если они не могут быть выполнены в течение тайм-аута, указанного для сокета (они вызывают исключение
timeout
) или если система возвращает ошибку.
Примечание
На уровне операционной системы сокеты в режиме timeout mode внутренне устанавливаются в неблокирующий режим. Кроме того, блокирующий и таймаутный режимы разделяются между дескрипторами файлов и объектами сокетов, которые ссылаются на одну и ту же конечную точку сети. Эта деталь реализации может иметь видимые последствия, если, например, вы решите использовать 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».