socket
— Низкоуровневый сетевой интерфейс¶
Исходный код: Lib/socket.py
Этот модуль предоставляет доступ к интерфейсу BSD socket. Он доступен во всех современных системах Unix, Windows, macOS и, возможно, на дополнительных платформах.
Примечание
Некоторое поведение может зависеть от платформы, поскольку вызовы выполняются к API-интерфейсам сокетов операционной системы.
Availability: это не Emscripten, это был не я.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten
и wasm32-wasi
. Дополнительную информацию смотрите в разделе Платформы веб-сборки.
Этот модуль не работает или недоступен на платформах WebAssembly socket()
и socket object. Дополнительную информацию смотрите в разделе read()
write()
.
См.также
- Модуль
socketserver
Модуль
- Модуль
ssl
Модуль
Модуль¶
Модуль
Формат адреса, требуемый для конкретного объекта socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта socket. Адреса сокетов представлены следующим образом:
AF_UNIX`Формат `
“surrogateescape“`` адреса, PEP 383 требуемый bytes-like object для конкретного объекта socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта socket. Адреса сокетов представлены следующим образом:Изменено в версии 3.3: :const:`AF_UNIX`Формат адреса, требуемый для конкретного объекта socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта socket. Адреса сокетов представлены следующим образом:
Изменено в версии 3.5: :term:`bytes-like object`Формат адреса, требуемый для конкретного объекта socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта socket. Адреса сокетов представлены следующим образом:
(host, port)``Формат :const:`AF_INET` адреса, ``'daring.cwi.nl'
требуемый'100.50.200.5'
для конкретного объекта socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта socket. Адреса сокетов представлены следующим образом:''``Формат :const:`INADDR_ANY` адреса, ``'<broadcast>'
требуемыйINADDR_BROADCAST
для конкретного объекта socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта socket. Адреса сокетов представлены следующим образом:
AF_INET6`Формат ``(host, port, flowinfo, scope_id)`
адреса,sin6_flowinfo
требуемыйsin6_scope_id
дляstruct sockaddr_in6
конкретногоsocket
объекта socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта socket. Адреса сокетов представлены следующим образом:Изменено в версии 3.7:
%scope_id``Формат ``zone id
адреса, требуемый для конкретного объекта socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта socket. Адреса сокетов представлены следующим образом:AF_NETLINK
сокеты представлены в виде пар(pid, groups)
.AF_TIPC
сокеты представлены в виде пар(addr_type, v1, v2, v3 [, scope])
.TIPC_ADDR_NAMESEQ
сокеты представлены в виде парTIPC_ADDR_NAME
TIPC_ADDR_ID
.TIPC_ZONE_SCOPE
сокеты представлены в виде парTIPC_CLUSTER_SCOPE
TIPC_NODE_SCOPE
.TIPC_ADDR_NAME
сокеты представлены в виде пар .Если значение addr_type равно
TIPC_ADDR_NAMESEQ
, то v1 - это тип сервера, v2 - нижний номер порта, а v3 - верхний номер порта.Если значение addr_type равно
TIPC_ADDR_ID
, то v1 - это тип сервера, v2 - нижний номер порта, а v3 - верхний номер порта.
Кортеж
(interface, )
используется для семейства адресовAF_CAN
, где interface - это строка, представляющая имя сетевого интерфейса, например'can0'
. Имя сетевого интерфейса''
может использоваться для приема пакетов от всех сетевых интерфейсов этого семейства.CAN_ISOTP
протоколу требуется кортеж(interface, rx_addr, tx_addr)
, где оба дополнительных параметра являются длинными целыми числами без знака, представляющими идентификатор CAN (стандартный или расширенный).CAN_J1939
для протокола требуется кортеж(interface, name, pgn, addr)
, в котором дополнительными параметрами являются 64-разрядное целое число без знака, представляющее имя ECU, 32-разрядное целое число без знака, представляющее номер группы параметров (PGN), и 8-разрядное целое число, представляющее адрес.
Строка или кортеж
(id, unit)
используется для протоколаSYSPROTO_CONTROL
семействаPF_SYSTEM
. Строка - это имя элемента управления ядра, использующего динамически назначаемый идентификатор. Кортеж можно использовать, если известны идентификатор и номер модуля элемента управления ядром или если используется зарегистрированный идентификатор.Добавлено в версии 3.3.
AF_BLUETOOTH
поддерживает следующие протоколы и форматы адресов:BTPROTO_L2CAP
принимает(bdaddr, psm)
, гдеbdaddr
- это адрес Bluetooth в виде строки, аpsm
- целое число.BTPROTO_RFCOMM
принимает(bdaddr, channel)
, гдеbdaddr
- это адрес Bluetooth в виде строки, аchannel
- целое число.BTPROTO_HCI
принимает(device_id,)
, гдеdevice_id
- это адрес Bluetooth в виде строки, а - целое число.Изменено в версии 3.2: NetBSD and DragonFlyBSD support added.
BTPROTO_SCO
принимаетbdaddr
, гдеbdaddr
- это адрес Bluetooth в виде строки, аbytes
- целоеb'12:23:34:45:56:67'
число.
AF_ALG
принимает(type, name [, feat [, mask]])
, где - это адрес Bluetooth в виде строки, а - целое число.aead
принимаетhash
, гдеskcipher
- это адрес Bluetooth в виде строки, аrng
- целое число.name - это название алгоритма и режим работы в виде строки, например
sha256
,hmac(sha256)
,cbc(aes)
илиdrbg_nopr_ctr_aes256
.feat и mask - это 32-разрядные целые числа без знака.
:ref:`Availability <availability>`*feat* и mask - это 32-разрядные целые числа без знака.
Для некоторых типов алгоритмов требуются более свежие ядра.
Добавлено в версии 3.6.
AF_VSOCK
обеспечивает обмен данными между виртуальными машинами и их хостами. Сокеты представлены в виде(CID, port)
кортежа, где идентификатор контекста или CID и порт являются целыми числами.Availability обеспечивает обмен данными между виртуальными машинами и их хостами. Сокеты представлены в виде кортежа, где идентификатор контекста или CID и порт являются целыми числами.
Смотрите vsock(7)
Добавлено в версии 3.7.
Смотрите <<<0>>
(ifname, proto[, pkttype[, hatype[, addr]]])
>Смотрите
Смотрите
Смотрите
Смотрите
PACKET_HOST
Смотрите
PACKET_BROADCAST
PACKET_MULTICAST
- Пакет, отправленный на адрес многоадресной рассылки физического уровня.PACKET_OTHERHOST
- Пакет на какой-либо другой хост, который был перехвачен драйвером устройства в случайном режиме.PACKET_OUTGOING
- Пакет, исходящий от локального хоста, который передается обратно в пакетный сокет.
hatype - Необязательное целое число, указывающее тип аппаратного адреса ARP.
addr - Необязательный байтоподобный объект, указывающий физический адрес оборудования, интерпретация которого зависит от устройства.
Availability: Linux >= 2.2.
AF_QIPCRTR
- это интерфейс на базе сокетов только для Linux, предназначенный для взаимодействия со службами, работающими на сопроцессорах платформ Qualcomm. Семейство адресов представлено в виде кортежа(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
Добавлено в версии 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()
C.Изменено в версии 3.3: Этот класс был преобразован в подкласс
OSError
.
- exception socket.gaierror¶
Подкласс
OSError
, это исключение генерируется для ошибок, связанных с адресом, с помощьюgetaddrinfo()
иgetnameinfo()
. Сопутствующим значением является пара(error, string)
, представляющая ошибку, возвращаемую вызовом библиотеки. строка представляет собой описание ошибки, возвращаемое функциейgai_strerror()
C. Числовое значение error будет соответствовать одной изEAI_*
констант, определенных в этом модуле.Изменено в версии 3.3: Этот класс был преобразован в подкласс
OSError
.
- exception socket.timeout¶
Устаревший псевдоним
TimeoutError
.Подкласс
OSError
, это исключение возникает, когда происходит тайм-аут в сокете, для которого тайм-ауты были включены с помощью предыдущего вызоваsettimeout()
(или неявно с помощьюsetdefaulttimeout()
). Сопровождающее значение - это строка, значение которой в данный момент всегда имеет значение «тайм-аут».Изменено в версии 3.3: Этот класс был преобразован в подкласс
OSError
.Изменено в версии 3.10: Этому классу был присвоен псевдоним
TimeoutError
.
Константы¶
AddressFamily`Констант :class:`SocketKind
IntEnum
ыДобавлено в версии 3.4.
- socket.AF_UNIX¶
- socket.AF_INET¶
- socket.AF_INET6¶
Эти константы представляют семейства адресов (и протоколов), используемые в качестве первого аргумента
socket()
. Если константаAF_UNIX
не определена, то этот протокол не поддерживается. В зависимости от системы могут быть доступны дополнительные константы.
- socket.AF_UNSPEC¶
AF_UNSPEC
означает, чтоgetaddrinfo()
должен возвращать адреса сокетов для любого семейства адресов (IPv4, IPv6 или любого другого), которые могут быть использованы.
- socket.SOCK_STREAM¶
- socket.SOCK_DGRAM¶
- socket.SOCK_RAW¶
- socket.SOCK_RDM¶
- socket.SOCK_SEQPACKET¶
Эти константы представляют типы сокетов, используемые для второго аргумента
socket()
. В зависимости от системы могут быть доступны другие константы. (ТолькоSOCK_STREAM
иSOCK_DGRAM
, по-видимому, в целом полезны.)
- socket.SOCK_CLOEXEC¶
- socket.SOCK_NONBLOCK¶
Эти две константы, если они определены, могут быть объединены с типами сокетов и позволяют вам устанавливать некоторые флаги атомарно (таким образом, избегая возможных условий гонки и необходимости в отдельных вызовах).
См.также
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()
объектов socket. В большинстве случаев задаются только те символы, которые определены в заголовочных файлах Unix; для некоторых символов указаны значения по умолчанию.Изменено в версии 3.6:
SO_DOMAIN
,SO_PROTOCOL
,SO_PEERSEC
,SO_PASSSEC
,TCP_USER_TIMEOUT
,TCP_CONGESTION
были добавлены.Изменено в версии 3.6.5: В Windows,
TCP_FASTOPEN
,TCP_KEEPCNT
появляется, если поддерживается Windows во время выполнения.Изменено в версии 3.7: был добавлен
TCP_NOTSENT_LOWAT
.В Windows,
TCP_KEEPIDLE
,TCP_KEEPINTVL
появляется, если поддерживается Windows во время выполнения.Изменено в версии 3.10: Была добавлена
IP_RECVTOS
. ДобавленаTCP_KEEPALIVE
. В macOS эту константу можно использовать так же, какTCP_KEEPIDLE
в Linux.Изменено в версии 3.11: Добавлено
TCP_CONNECTION_INFO
. В macOS эту константу можно использовать так же, какTCP_INFO
в Linux и BSD.
- socket.AF_CAN¶
- socket.PF_CAN¶
- SOL_CAN_*
- CAN_*
Многие константы этих форм, задокументированные в документации Linux, также определены в модуле socket.
Availability: Linux >= 2.6.25, NetBSD >= 8.
Добавлено в версии 3.3.
Изменено в версии 3.11: Была добавлена поддержка NetBSD.
- socket.CAN_BCM¶
- CAN_BCM_*
CAN_BCM, входящий в семейство протоколов CAN, является протоколом broadcast manager (BCM). Константы Broadcast manager, описанные в документации Linux, также определены в модуле socket.
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_*
Константы для Windows WSAIoctl(). Константы используются в качестве аргументов для метода
ioctl()
объектов socket.Изменено в версии 3.6: был добавлен
SIO_LOOPBACK_FAST_PATH
.
- TIPC_*
Константы, связанные с TIPC, совпадают с константами, экспортируемыми C socket API. Дополнительную информацию смотрите в документации TIPS.
- socket.AF_ALG¶
- socket.SOL_ALG¶
- ALG_*
Константы для криптографии ядра Linux.
:ref:`Availability <availability>`*feat* и mask - это 32-разрядные целые числа без знака.
Добавлено в версии 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.SCM_CREDS2¶
- socket.LOCAL_CREDS¶
- socket.LOCAL_CREDS_PERSISTENT¶
LOCAL_CREDS и LOCAL_CREDS_PERSISTENT могут использоваться с сокетами SOCK_DGRAM, SOCK_STREAM, что эквивалентно SO_PASSCRED для Linux/DragonFlyBSD, в то время как LOCAL_CREDS отправляет учетные данные при первом чтении, LOCAL_CREDS_PERSISTENT отправляет для каждого чтения, SCM_CREDS2 затем должен использоваться для последнего типа сообщения.
Добавлено в версии 3.11.
Availability: FreeBSD.
- socket.SO_INCOMING_CPU¶
Константа для оптимизации местоположения процессора, которая будет использоваться в сочетании с
SO_REUSEPORT
.Добавлено в версии 3.11.
Availability обеспечивает обмен данными между виртуальными машинами и их хостами. Сокеты представлены в виде кортежа, где идентификатор контекста или CID и порт являются целыми числами.
Функции¶
Создание сокетов¶
Все следующие функции создают 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 автоматически определяются из указанного файлового дескриптора. Автоматическое определение может быть отменено путем вызова функции с явными аргументами 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_ISO TP.
Изменено в версии 3.7: Когда к типу применяются битовые флаги
SOCK_NONBLOCK
илиSOCK_CLOEXEC
, они снимаются, иsocket.type
не будут отображаться. Они по-прежнему передаются в базовый системный вызовsocket()
. Следовательно,sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
по-прежнему будет создан неблокирующий сокет в операционных системах, поддерживающих
SOCK_NONBLOCK
, но дляsock.type
будет установлено значениеsocket.SOCK_STREAM
.Изменено в версии 3.9: Был добавлен протокол CAN_J1939.
Изменено в версии 3.10: Был добавлен протокол IPPROTO_TCP.
- socket.socketpair([family[, type[, proto]]])¶
Создайте пару подключенных объектов socket, используя заданное семейство адресов, тип сокета и номер протокола. Семейство адресов, тип сокета и номер протокола соответствуют функции
socket()
, описанной выше. Семейство по умолчанию равноAF_UNIX
, если оно определено на платформе; в противном случае по умолчанию используетсяAF_INET
.Вновь созданные сокеты имеют значение non-inheritable.
Изменено в версии 3.2: Возвращаемые объекты socket теперь поддерживают весь socket API, а не его подмножество.
Изменено в версии 3.4: Возвращенные сокеты теперь не могут быть унаследованы.
Изменено в версии 3.5: Добавлена поддержка Windows.
- socket.create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False)¶
Подключитесь к службе TCP, прослушивающей в Интернете адрес (состоящий из 2 кортежей
(host, port)
), и верните объект socket. Это функция более высокого уровня, чемsocket.connect()
: если host является нечисловым именем хоста, она попытается разрешить его как дляAF_INET
, так и дляAF_INET6
, а затем попытается подключиться ко всем возможным адресам по очереди до тех пор, пока соединение не будет установлено успешно. Это упрощает создание клиентов, совместимых как с IPv4, так и с IPv6.Передача необязательного параметра timeout установит время ожидания для экземпляра сокета перед попыткой подключения. Если параметр timeout не указан, используется глобальное значение времени ожидания по умолчанию, возвращаемое параметром
getdefaulttimeout()
.Если указано, source_address должен содержать 2 кортежа
(host, port)
, к которым сокет будет привязан в качестве исходного адреса перед подключением. Если хост или порт равны » или 0 соответственно, будет использоваться поведение операционной системы по умолчанию.Когда соединение не может быть создано, генерируется исключение. По умолчанию это исключение для последнего адреса в списке. Если значение all_errors равно
True
, то это значениеExceptionGroup
, содержащее ошибки всех попыток.Изменено в версии 3.2: был добавлен исходный_адрес.
Изменено в версии 3.11: был добавлен all_errors.
- 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 имеет значение true и платформа поддерживает его, сокет сможет принимать соединения как по протоколу IPv4, так и по протоколу IPv6, в противном случае он вызовет
ValueError
. Предполагается, что большинство платформ POSIX и Windows поддерживают эту функциональность. Когда эта функция включена, адрес, возвращаемыйsocket.getpeername()
при подключении по протоколу IPv4, будет представлять собой IPv6-адрес, представленный как IPv6-адрес, сопоставленный с IPv4. Если значение 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 на основе результата. Семейство адресов, тип сокета и номер протокола соответствуют функцииsocket()
, описанной выше. Файловый дескриптор должен ссылаться на сокет, но это не проверено - последующие операции с объектом могут завершиться неудачей, если файловый дескриптор неверен. Эта функция редко требуется, но может использоваться для получения или установки параметров сокета, передаваемого программе в качестве стандартного ввода или вывода (например, серверу, запускаемому демоном Unix inet). Предполагается, что сокет находится в режиме блокировки.Вновь созданный сокет имеет значение non-inheritable.
Изменено в версии 3.4: Возвращаемый сокет теперь не может быть унаследован.
Создайте экземпляр сокета на основе данных, полученных с помощью метода
socket.share()
. Предполагается, что сокет находится в режиме блокировки.Availability: Окна.
Добавлено в версии 3.3.
- socket.SocketType¶
Это объект типа Python, который представляет тип объекта socket. Он такой же, как
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 кортежей, которые содержат все необходимые аргументы для создания сокета, подключенного к этой службе. хост - это доменное имя, строковое представление адреса IPv4/v6 или
None
. порт - это строковое имя службы, например'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 будет строкой, представляющей каноническое имя хоста, еслиAI_CANONNAME
является частью аргумента flags; в противном случае canonname будет пустым. sockaddr - это кортеж, описывающий адрес сокета, формат которого зависит от возвращаемого семейства ((address, port)
2-кортеж дляAF_INET
,(address, port, flowinfo, scope_id)
4-кортеж для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) [(socket.AF_INET6, socket.SOCK_STREAM, 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)), (socket.AF_INET, socket.SOCK_STREAM, 6, '', ('93.184.216.34', 80))]
Изменено в версии 3.2: теперь параметры можно передавать с помощью ключевых слов arguments.
Изменено в версии 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
.Availability: это был не я.
- socket.gethostbyname_ex(hostname)¶
Перевод имени хоста в формат адреса IPv4, расширенный интерфейс. Возвращает 3 кортежа
(hostname, aliaslist, ipaddrlist)
, где hostname - это основное имя хоста, aliaslist - это (возможно, пустой) список альтернативных имен хостов для одного и того же адреса, а ipaddrlist - это список IPv4-адресов для одного и того же интерфейса на одном и том же сервере. хост (часто, но не всегда один адрес).gethostbyname_ex()
не поддерживает разрешение имен IPv6, и вместо этого следует использоватьgetaddrinfo()
для поддержки двойного стека IPv4/v6.Создает auditing event
socket.gethostbyname
с аргументомhostname
.Availability: это был не я.
- socket.gethostname()¶
Возвращает строку, содержащую имя хоста компьютера, на котором в данный момент выполняется интерпретатор Python.
Выдает auditing event
socket.gethostname
без каких-либо аргументов.Примечание:
gethostname()
не всегда возвращает полное доменное имя; используйтеgetfqdn()
для этого.Availability: это был не я.
- socket.gethostbyaddr(ip_address)¶
Возвращает 3 кортежа
(hostname, aliaslist, ipaddrlist)
, где hostname - это основное имя хоста, соответствующее заданному ip_address, aliaslist - это (возможно, пустой) список альтернативных имен хостов для того же адреса, а ipaddrlist - это список адресов IPv4/v6 для одного и того же интерфейса на одном и том же хосте (скорее всего, содержащем только один адрес). Чтобы найти полное доменное имя, воспользуйтесь функциейgetfqdn()
.gethostbyaddr()
поддерживает как IPv4, так и IPv6.Создает auditing event
socket.gethostbyaddr
с аргументомip_address
.Availability: это был не я.
- socket.getnameinfo(sockaddr, flags)¶
Преобразуйте адрес сокета sockaddr в кортеж из 2 элементов
(host, port)
. В зависимости от настроек flags, результат может содержать полное доменное имя или числовой адрес, указанный в host. Аналогично, port может содержать строковое имя порта или цифровой номер порта.Для IPv6-адресов
%scope_id
добавляется к части хоста, если sockaddr содержит значимый scope_id. Обычно это происходит для адресов многоадресной рассылки.Для получения дополнительной информации о флагах вы можете обратиться к getnameinfo(3).
Создает auditing event
socket.getnameinfo
с аргументомsockaddr
.Availability: это был не я.
- socket.getprotobyname(protocolname)¶
Преобразуйте имя интернет-протокола (например,
'icmp'
) в константу, подходящую для передачи в качестве (необязательного) третьего аргумента функцииsocket()
. Обычно это необходимо только для сокетов, открытых в «сыром» режиме (SOCK_RAW
); для обычных режимов сокетов правильный протокол выбирается автоматически, если он не указан или равен нулю.Availability: это был не я.
- socket.getservbyname(servicename[, protocolname])¶
Преобразуйте название интернет-службы и название протокола в номер порта для этой службы. Необязательное название протокола, если оно указано, должно быть
'tcp'
или'udp'
, в противном случае подойдет любой протокол.Создает auditing event
socket.getservbyname
с аргументамиservicename
,protocolname
.Availability: это был не я.
- socket.getservbyport(port[, protocolname])¶
Преобразуйте номер интернет-порта и название протокола в название службы для этой службы. Необязательное название протокола, если оно указано, должно быть
'tcp'
или'udp'
, в противном случае подойдет любой протокол.Создает auditing event
socket.getservbyport
с аргументамиport
,protocolname
.Availability: это был не я.
- socket.ntohl(x)¶
Преобразуйте 32-разрядные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На компьютерах, где порядок байтов хоста совпадает с порядком байтов сети, это не требуется; в противном случае выполняется операция подкачки в 4 байта.
- socket.ntohs(x)¶
Преобразуйте 16-разрядные положительные целые числа из сетевого порядка байтов в порядок байтов хоста. На компьютерах, где порядок байтов хоста совпадает с порядком байтов сети, это не требуется; в противном случае выполняется операция подкачки в 2 байта.
Изменено в версии 3.10: Увеличивает значение
OverflowError
, если x не помещается в 16-разрядное целое число без знака.
- socket.htonl(x)¶
Преобразуйте 32-разрядные положительные целые числа из порядка байтов хоста в порядок байтов сети. На компьютерах, где порядок байтов хоста совпадает с порядком байтов сети, это не требуется; в противном случае выполняется операция подкачки в 4 байта.
- socket.htons(x)¶
Преобразуйте 16-разрядные положительные целые числа из порядка байтов хоста в порядок байтов сети. На компьютерах, где порядок байтов хоста совпадает с порядком байтов сети, это не требуется; в противном случае выполняется операция подкачки в 2 байта.
Изменено в версии 3.10: Увеличивает значение
OverflowError
, если x не помещается в 16-разрядное целое число без знака.
- socket.inet_aton(ip_string)¶
Преобразуйте IPv4-адрес из четырехзначного строкового формата с пунктиром (например, «123.45.67.89») в 32-разрядный двоичный формат с упаковкой в виде объекта bytes длиной в четыре символа. Это полезно при работе с программой, использующей стандартную библиотеку C и нуждающейся в объектах типа
in_addr
, который является типом C для 32-разрядного упакованного двоичного файла, возвращаемого этой функцией.inet_aton()
также принимает строки, содержащие менее трех точек; подробности смотрите на странице руководства по Unix inet(3).Если строка IPv4-адреса, переданная в эту функцию, является недопустимой, будет выведено значение
OSError
. Обратите внимание, что именно то, что является допустимым, зависит от базовой реализации Cinet_aton()
.inet_aton()
не поддерживает IPv6, и вместо него следует использоватьinet_pton()
для поддержки двойного стека IPv4/v6.
- socket.inet_ntoa(packed_ip)¶
Преобразуйте 32-разрядный упакованный IPv4-адрес (длиной bytes-like object четыре байта) в его стандартное строковое представление в виде четырехугольника с точками (например, „123.45.67.89“). Это полезно при работе с программой, использующей стандартную библиотеку C и нуждающейся в объектах типа
in_addr
, который является типом C для 32-разрядных упакованных двоичных данных, принимаемых этой функцией в качестве аргумента.Если последовательность байтов, передаваемая в эту функцию, имеет длину не ровно 4 байта, будет поднят
OSError
.inet_ntoa()
не поддерживает IPv6, и вместо этого следует использоватьinet_ntop()
для поддержки двойного стека IPv4/v6.Изменено в версии 3.5: :term:`bytes-like object`Формат адреса, требуемый для конкретного объекта socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта socket. Адреса сокетов представлены следующим образом:
- socket.inet_pton(address_family, ip_string)¶
Преобразует IP-адрес из строкового формата, относящегося к конкретному семейству, в упакованный двоичный формат.
inet_pton()
полезно, когда библиотека или сетевой протокол запрашивают объект типа:c:struct:in_addr (аналогичноinet_aton()
) или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()
полезно, когда библиотека или сетевой протокол возвращает объект типаin_addr
(аналогичноinet_ntoa()
) илиin6_addr
.Поддерживаемыми значениями для address_family в настоящее время являются
AF_INET
иAF_INET6
. Если объект bytes packed_ip имеет неправильную длину для указанного семейства адресов, будет поднятValueError
.OSError
вызывается при ошибках, связанных с вызовомinet_ntop()
.Availability: Unix, Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
Изменено в версии 3.5: :term:`bytes-like object`Формат адреса, требуемый для конкретного объекта socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта socket. Адреса сокетов представлены следующим образом:
- socket.CMSG_LEN(length)¶
Возвращает общую длину, без завершающего отступа, вспомогательного элемента данных со связанными данными заданной длины. Это значение часто можно использовать в качестве размера буфера для
recvmsg()
для получения отдельного элемента вспомогательных данных, но RFC 3542 требует, чтобы переносимые приложения использовалиCMSG_SPACE()
и, таким образом, включали пространство для заполнения, даже если элемент будет последний в буфере. Увеличивает значениеOverflowError
, если длина выходит за пределы допустимого диапазона значений.Availability: Unix, не Emscripten, не БЫЛ I.
Большинство платформ Unix.
Добавлено в версии 3.3.
- socket.CMSG_SPACE(length)¶
Возвращает размер буфера, необходимый для
recvmsg()
получения дополнительного элемента данных со связанными данными заданной длины вместе с любым завершающим заполнением. Объем буфера, необходимый для приема нескольких элементов, равен сумме значенийCMSG_SPACE()
для связанных с ними длин данных. ЗначениеOverflowError
увеличивается, если длина выходит за допустимый диапазон значений.Обратите внимание, что некоторые системы могут поддерживать дополнительные данные без предоставления этой функции. Также обратите внимание, что установка размера буфера с использованием результатов этой функции может не точно ограничить объем дополнительных данных, которые могут быть получены, поскольку дополнительные данные могут помещаться в область заполнения.
Availability: Unix, не Emscripten, не БЫЛ I.
большинство платформ Unix.
Добавлено в версии 3.3.
- socket.getdefaulttimeout()¶
Возвращает значение тайм-аута по умолчанию в секундах (с плавающей точкой) для новых объектов сокета. Значение
None
указывает на то, что у новых объектов сокета нет тайм-аута. При первом импорте модуля сокета значение по умолчанию равноNone
.
- socket.setdefaulttimeout(timeout)¶
Установите время ожидания по умолчанию в секундах (с плавающей точкой) для новых объектов socket. При первом импорте модуля socket значение по умолчанию равно
None
. Возможные значения и их соответствующие значения приведены в разделеsettimeout()
.
- socket.sethostname(name)¶
Задайте для имени хоста компьютера значение name. Если у вас недостаточно прав, это вызовет ошибку
OSError
.Создает auditing event
socket.sethostname
с аргументомname
.Availability: Unix.
Добавлено в версии 3.3.
- socket.if_nameindex()¶
Возвращает список кортежей с информацией о сетевом интерфейсе (индекс int, строка имени).
OSError
в случае сбоя системного вызова.Availability: Unix, Windows, не Emscripten, не БЫЛ я.
Добавлено в версии 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, не Emscripten, не БЫЛ я.
Добавлено в версии 3.3.
Изменено в версии 3.8: Была добавлена поддержка Windows.
См.также
«Имя интерфейса» - это имя, задокументированное в
if_nameindex()
.
- socket.if_indextoname(if_index)¶
Возвращает имя сетевого интерфейса, соответствующее индексному номеру интерфейса.
OSError
если интерфейса с заданным индексом не существует.Availability: Unix, Windows, не Emscripten, не БЫЛ я.
Добавлено в версии 3.3.
Изменено в версии 3.8: Была добавлена поддержка Windows.
См.также
«Имя интерфейса» - это имя, задокументированное в
if_nameindex()
.
- socket.send_fds(sock, buffers, fds[, flags[, address]])¶
Отправьте список файловых дескрипторов fds по
AF_UNIX
сокету sock. Параметр fds представляет собой последовательность файловых дескрипторов. Обратитесь кsendmsg()
для получения документации по этим параметрам.Availability: Unix, Windows, не Emscripten, не БЫЛ я.
Платформы 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, Windows, не Emscripten, не БЫЛ я.
Платформы Unix поддерживают механизм
sendmsg()
и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)¶
Привяжите сокет к address. Сокет не должен быть уже привязан. (Формат address зависит от семейства адресов — смотрите выше.)
Создает auditing event
socket.bind
с аргументамиself
,address
.Availability: это был не я.
- socket.close()¶
Отметьте сокет закрытым. Базовый системный ресурс (например, файловый дескриптор) также закрывается, когда закрываются все файловые объекты, начиная с
makefile()
. Как только это произойдет, все последующие операции с объектом сокета завершатся ошибкой. Удаленный сервер больше не будет получать данные (после того, как данные, помещенные в очередь, будут сброшены).Сокеты автоматически закрываются при сборке мусора, но рекомендуется явно указывать
close()
для них или использовать инструкциюwith
для них.Изменено в версии 3.6:
OSError
теперь вызывается, если при выполнении базового вызоваclose()
возникает ошибка.Примечание
close()
освобождает ресурс, связанный с подключением, но не обязательно немедленно закрывает соединение. Если вы хотите закрыть соединение своевременно, вызовитеshutdown()
передclose()
.
- socket.connect(address)¶
Подключитесь к удаленному сокету по адресу address. (Формат address зависит от семейства адресов — смотрите выше.)
Если соединение прерывается сигналом, метод ожидает завершения соединения или выдает
TimeoutError
по таймауту, если обработчик сигнала не генерирует исключение, а сокет блокируется или имеет тайм-аут. Для неблокирующих сокетов метод генерирует исключениеInterruptedError
, если соединение прерывается сигналом (или исключением, вызванным обработчиком сигнала).Создает auditing event
socket.connect
с аргументамиself
,address
.Изменено в версии 3.5: Метод теперь ожидает завершения соединения, вместо того чтобы генерировать исключение
InterruptedError
если соединение прерывается сигналом, обработчик сигнала не генерирует исключение, а сокет блокируется или имеет тайм-аут (объяснение смотрите в PEP 475).Availability: это был не я.
- socket.connect_ex(address)¶
Аналогично
connect(address)
, но возвращает индикатор ошибки вместо создания исключения для ошибок, возвращаемых вызовом C-levelconnect()
(другие проблемы, такие как «хост не найден», все еще могут вызывать исключения). Индикатор ошибки равен0
, если операция выполнена успешно, в противном случае значение переменнойerrno
. Это полезно, например, для поддержки асинхронных подключений.Создает auditing event
socket.connect
с аргументамиself
,address
.Availability: это был не я.
- socket.detach()¶
Переведите объект socket в закрытое состояние, фактически не закрывая базовый файловый дескриптор. Файловый дескриптор возвращается и может быть повторно использован для других целей.
Добавлено в версии 3.2.
- socket.dup()¶
Продублируйте гнездо.
Вновь созданный сокет имеет значение non-inheritable.
Изменено в версии 3.4: Сокет теперь не передается по наследству.
Availability: это был не я.
- 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 getsockopt(2)). Необходимые символьные константы (SO_* etc.) определены в этом модуле. Если параметр buflen отсутствует, предполагается целочисленный параметр, и функция возвращает его целочисленное значение. Если параметр buflen присутствует, он указывает максимальную длину буфера, используемого для получения параметра, и этот буфер возвращается в виде объекта bytes. Вызывающий объект должен декодировать содержимое буфера (смотрите дополнительный встроенный модуль
struct
, чтобы узнать, как декодировать структуры C, закодированные в виде байтовых строк).Availability: это был не я.
- socket.getblocking()¶
Возвращает
True
, если сокет находится в режиме блокировки,False
, если в режиме неблокирования.Это эквивалентно проверке
socket.gettimeout() != 0
.Добавлено в версии 3.7.
- socket.gettimeout()¶
Возвращает время ожидания в секундах (с плавающей точкой), связанное с операциями с сокетом, или
None
, если время ожидания не задано. Это отражает последний вызовsetblocking()
илиsettimeout()
.
- socket.ioctl(control, option)¶
- платформа:
Окна
Метод
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); оно указывает количество недопустимых подключений, которое система разрешит, прежде чем отказать в новых подключениях. Если не указано, то выбирается разумное значение по умолчанию.
Availability: это был не я.
Изменено в версии 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 не был вызванsocket.close()
.Примечание
В Windows файлоподобный объект, созданный с помощью
makefile()
, не может использоваться там, где ожидается файловый объект с файловым дескриптором, например, в потоковых аргументахsubprocess.Popen()
.
- socket.recv(bufsize[, flags])¶
Получать данные из сокета. Возвращаемое значение - это объект bytes, представляющий полученные данные. Максимальный объем данных, который должен быть получен за один раз, задается параметром bufsize. Возвращаемый объект empty bytes указывает на то, что клиент отключился. Смотрите страницу руководства по Unix recv(2) для получения информации о значении необязательного аргумента flags; по умолчанию он равен нулю.
Примечание
Для наилучшего соответствия аппаратным и сетевым реалиям значение параметра bufsize должно быть относительно небольшим в степени 2, например, 4096.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не генерирует исключение, метод теперь повторяет системный вызов вместо того, чтобы генерировать исключение
InterruptedError
(объяснение смотрите в PEP 475).
- socket.recvfrom(bufsize[, flags])¶
Получать данные из сокета. Возвращаемое значение представляет собой пару
(bytes, address)
, где bytes - объект bytes, представляющий полученные данные, а address - адрес сокета, отправляющего данные. Смотрите страницу руководства по Unix recv(2), чтобы узнать значение необязательного аргумента flags; по умолчанию он равен нулю. (Формат address зависит от семейства адресов — смотрите выше.)Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не генерирует исключение, метод теперь повторяет системный вызов вместо того, чтобы генерировать исключение
InterruptedError
(объяснение смотрите в PEP 475).Изменено в версии 3.7: Для многоадресного IPv6-адреса первый элемент address больше не содержит части
%scope_id
. Чтобы получить полный IPv6-адрес, используйтеgetnameinfo()
.
- socket.recvmsg(bufsize[, ancbufsize[, flags]])¶
Получать обычные данные (размером до bufsize байт) и дополнительные данные из сокета. Аргумент ancbufsize задает размер в байтах внутреннего буфера, используемого для приема дополнительных данных; по умолчанию он равен 0, что означает, что дополнительные данные получены не будут. Соответствующие размеры буфера для вспомогательных данных могут быть рассчитаны с использованием
CMSG_SPACE()
илиCMSG_LEN()
, а элементы, которые не помещаются в буфер, могут быть усечены или отброшены. Аргумент flags по умолчанию равен 0 и имеет то же значение, что и дляrecv()
.Возвращаемое значение состоит из 4 кортежей:
(data, ancdata, msg_flags, address)
. Элемент data представляет собой объектbytes
, содержащий полученные данные, не являющиеся дополнительными. Элемент ancdata представляет собой список из нуля или более кортежей(cmsg_level, cmsg_type, cmsg_data)
, представляющих полученные вспомогательные данные (управляющие сообщения): cmsg_level и cmsg_type - это целые числа, указывающие уровень протокола и тип протокола, зависящий от конкретного протокола, соответственно, а cmsg_data - этоbytes
объект, содержащий связанные с ним данные. Элемент msg_flags представляет собой побитовое ИЛИ различных флагов, указывающих условия в полученном сообщении; подробности смотрите в документации к вашей системе. Если принимающий сокет не подключен, address - это адрес отправляющего сокета, если таковой имеется; в противном случае его значение не задано.В некоторых системах
sendmsg()
иrecvmsg()
могут использоваться для передачи файловых дескрипторов между процессами через сокетAF_UNIX
. Когда используется это средство (оно часто ограниченоSOCK_STREAM
сокетами),recvmsg()
возвращает в своих дополнительных данных элементы вида(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)
, где fds - этоbytes
объект, представляющий новые файловые дескрипторы в виде двоичного массива собственного типа C int. Еслиrecvmsg()
вызывает исключение после возврата системного вызова, сначала будет предпринята попытка закрыть все файловые дескрипторы, полученные с помощью этого механизма.Некоторые системы не указывают усеченную длину вспомогательных элементов данных, которые были получены лишь частично. Если элемент, по-видимому, выходит за пределы буфера,
recvmsg()
выдаетRuntimeWarning
и возвращает его часть, которая находится внутри буфера, при условии, что она не была обрезана до начала связанных с ней данных.В системах, поддерживающих механизм
SCM_RIGHTS
, следующая функция будет получать до maxfds файловых дескрипторов, возвращая данные сообщения и список, содержащий дескрипторы (игнорируя при этом непредвиденные условия, такие как получение несвязанных управляющих сообщений). Смотрите такжеsendmsg()
.import socket, array def recv_fds(sock, msglen, maxfds): fds = array.array("i") # Array of ints msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize)) for cmsg_level, cmsg_type, cmsg_data in ancdata: if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS: # Append data, ignoring any truncated integers at the end. fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) return msg, list(fds)
Availability: Unix.
Большинство платформ Unix.
Добавлено в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не генерирует исключение, метод теперь повторяет системный вызов вместо того, чтобы генерировать исключение
InterruptedError
(объяснение смотрите в PEP 475).
- socket.recvmsg_into(buffers[, ancbufsize[, flags]])¶
Получать обычные данные и вспомогательные данные из сокета, действуя так, как это сделал бы
recvmsg()
, но распределять несвязанные данные по ряду буферов вместо того, чтобы возвращать новый объект bytes. Аргумент buffers должен содержать список объектов, которые экспортируют буферы, доступные для записи (например, объектыbytearray
); они будут заполняться последовательными фрагментами необязательных данных до тех пор, пока все они не будут записаны или пока буферов больше не останется. Операционная система может установить ограничение (sysconf()
значениеSC_IOV_MAX
) на количество буферов, которые могут быть использованы. Аргументы ancbufsize и flags имеют то же значение, что и дляrecvmsg()
.Возвращаемое значение представляет собой кортеж из 4 элементов:
(nbytes, ancdata, msg_flags, address)
, где nbytes - это общее количество байт несвязанных данных, записанных в буферы, а ancdata, msg_flags и address такие же, как дляrecvmsg()
.Пример:
>>> import socket >>> s1, s2 = socket.socketpair() >>> b1 = bytearray(b'----') >>> b2 = bytearray(b'0123456789') >>> b3 = bytearray(b'--------------') >>> s1.send(b'Mary had a little lamb') 22 >>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3]) (22, [], 0, None) >>> [b1, b2, b3] [bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]
Availability: Unix.
Большинство платформ Unix.
Добавлено в версии 3.3.
- socket.recvfrom_into(buffer[, nbytes[, flags]])¶
Получать данные из сокета, записывая их в buffer вместо создания новой байтовой строки. Возвращаемое значение представляет собой пару
(nbytes, address)
, где nbytes - количество полученных байт, а address - адрес сокета, отправляющего данные. Смотрите страницу руководства по Unix recv(2), чтобы узнать значение необязательного аргумента flags; по умолчанию он равен нулю. (Формат address зависит от семейства адресов — смотрите выше.)
- socket.recv_into(buffer[, nbytes[, flags]])¶
Получает до nbytes байт из сокета, сохраняя данные в буфере, а не создавая новую байтовую строку. Если значение nbytes не указано (или равно 0), получает до размера, доступного в данном буфере. Возвращает количество полученных байт. Смотрите страницу руководства по Unix recv(2) для получения информации о значении необязательного аргумента flags; по умолчанию он равен нулю.
- socket.send(bytes[, flags])¶
Отправляйте данные в сокет. Сокет должен быть подключен к удаленному сокету. Необязательный аргумент flags имеет то же значение, что и для
recv()
, приведенный выше. Возвращает количество отправленных байт. Приложения отвечают за проверку отправки всех данных; если была передана только часть данных, приложению необходимо попытаться отправить оставшиеся данные. Для получения дополнительной информации по этому вопросу обратитесь к Руководство по программированию сокетов.Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не генерирует исключение, метод теперь повторяет системный вызов вместо того, чтобы генерировать исключение
InterruptedError
(объяснение смотрите в PEP 475).
- socket.sendall(bytes[, flags])¶
Отправляйте данные в сокет. Сокет должен быть подключен к удаленному сокету. Необязательный аргумент flags имеет то же значение, что и для
recv()
, приведенный выше. В отличие отsend()
, этот метод продолжает отправлять данные из байт до тех пор, пока не будут отправлены все данные или не возникнет ошибка.None
возвращается в случае успешного завершения. При возникновении ошибки возникает исключение, и нет никакого способа определить, сколько данных было успешно отправлено, если таковые имелись.Изменено в версии 3.5: Время ожидания сокета больше не сбрасывается при каждой успешной отправке данных. Время ожидания сокета теперь является максимальной общей продолжительностью для отправки всех данных.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не генерирует исключение, метод теперь повторяет системный вызов вместо того, чтобы генерировать исключение
InterruptedError
(объяснение смотрите в PEP 475).
- socket.sendto(bytes, address)¶
- socket.sendto(bytes, flags, address)
Отправляйте данные в сокет. Сокет не должен быть подключен к удаленному сокету, поскольку конечный сокет указан с помощью address. Необязательный аргумент flags имеет то же значение, что и для
recv()
, приведенного выше. Возвращает количество отправленных байт. (Формат address зависит от семейства адресов — смотрите выше.)Создает auditing event
socket.sendto
с аргументамиself
,address
.Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не генерирует исключение, метод теперь повторяет системный вызов вместо того, чтобы генерировать исключение
InterruptedError
(объяснение смотрите в PEP 475).
- socket.sendmsg(buffers[, ancdata[, flags[, address]]])¶
Отправляйте обычные и вспомогательные данные в сокет, собирая несвязанные данные из серии буферов и объединяя их в одно сообщение. Аргумент buffers определяет несвязанные данные как повторяемые из bytes-like objects (например,
bytes
объектов); операционная система может установить ограничение (sysconf()
значениеSC_IOV_MAX
) для количество буферов, которые могут быть использованы. Аргумент ancdata определяет вспомогательные данные (управляющие сообщения) как повторяемый набор из нуля или более кортежей(cmsg_level, cmsg_type, cmsg_data)
, где cmsg_level и cmsg_type являются целыми числами, определяющими уровень протокола и специфичный для протокола тип соответственно, а cmsg_data является байтоподобным объектом хранящий связанные с ними данные. Обратите внимание, что некоторые системы (в частности, системы без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))])
Availability: Unix, как и я.
Большинство платформ 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, ЗАРАНЕЕ связанную длину данных и флаги дляAF_ALG
сокета.:ref:`Availability <availability>`*feat* и mask - это 32-разрядные целые числа без знака.
Добавлено в версии 3.6.
- socket.sendfile(file, offset=0, count=None)¶
Отправляйте файл до тех пор, пока не будет достигнут EOF, используя высокопроизводительный
os.sendfile
, и возвращайте общее количество отправленных байт. файл должен быть обычным файловым объектом, открытым в двоичном режиме. Еслиos.sendfile
недоступен (например, в Windows) или если файл не является обычным файлом, вместо него будет использоватьсяsend()
. offset указывает, с чего следует начать чтение файла. Если указано, count - это общее количество байт для передачи, в отличие от отправки файла до достижения EOF. Позиция файла обновляется при возврате или также в случае ошибки, и в этом случаеfile.tell()
можно использовать для определения количества отправленных байт. Сокет должен быть типаSOCK_STREAM
. Неблокирующие сокеты не поддерживаются.Добавлено в версии 3.5.
- socket.set_inheritable(inheritable)¶
Установите значение inheritable flag для файлового дескриптора сокета или дескриптора сокета.
Добавлено в версии 3.4.
- socket.setblocking(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)). Необходимые символьные константы определены в этом модуле (SO_* etc. <socket-unix-constants>). Значение может быть целым числом,
None
или bytes-like object, представляющим буфер. В последнем случае вызывающая сторона должна убедиться, что байтовая строка содержит правильные биты (смотрите дополнительный встроенный модульstruct
, чтобы узнать, как кодировать структуры C в виде байтовых строк). Когда для параметра value задано значениеNone
, требуется аргумент optlen. Это эквивалентно вызовуsetsockopt()
функции C сoptval=NULL
иoptlen=optlen
.Изменено в версии 3.5: :term:`bytes-like object`Формат адреса, требуемый для конкретного объекта socket, выбирается автоматически на основе семейства адресов, указанного при создании объекта socket. Адреса сокетов представлены следующим образом:
Изменено в версии 3.6: добавлена форма setsockopt(уровень, optname, Нет, optlen: int).
Availability: это был не я.
- socket.shutdown(how)¶
Отключите одну или обе половины соединения. Если значение how равно
SHUT_RD
, дальнейшие отправки будут запрещены. Если значение how равноSHUT_WR
, дальнейшие отправки будут запрещены. Если значение how равноSHUT_RDWR
, дальнейшие отправки и получения запрещены.Availability: это был не я.
Дублируйте сокет и подготовьте его для совместного использования с целевым процессом. Целевому процессу должен быть присвоен process_id. Результирующий объект bytes затем может быть передан целевому процессу, используя некоторую форму межпроцессного взаимодействия, и сокет может быть воссоздан там с помощью
fromshare()
. После вызова этого метода можно безопасно закрыть сокет, поскольку операционная система уже продублировала его для целевого процесса.Availability: Окна.
Добавлено в версии 3.3.
Обратите внимание, что здесь нет методов read()
или write()
; вместо этого используйте recv()
и send()
без аргумента flags.
Объекты сокета также имеют эти атрибуты (доступные только для чтения), которые соответствуют значениям, заданным конструктору socket
.
- socket.family¶
Семейство сокетов.
- socket.type¶
Тип розетки.
- socket.proto¶
Протокол сокета.
Примечания по тайм-аутам сокетов¶
Объект сокета может находиться в одном из трех режимов: блокирующий, неблокирующий или время ожидания. Сокеты по умолчанию всегда создаются в режиме блокировки, но это можно изменить, вызвав setdefaulttimeout()
.
В режиме блокировки операции блокируются до завершения или пока система не выдаст сообщение об ошибке (например, время ожидания подключения истекло).
В неблокирующем режиме операции завершаются неудачей (с ошибкой, которая, к сожалению, зависит от системы), если они не могут быть выполнены немедленно: функции из модуля
select
можно использовать, чтобы узнать, когда и доступен ли сокет для чтения или записи.В режиме тайм-аута операции завершаются ошибкой, если они не могут быть завершены в течение времени ожидания, указанного для сокета (возникает исключение
timeout
) или если система возвращает ошибку.
Примечание
На уровне операционной системы сокеты в режиме тайм-аута внутренне настроены на неблокирующий режим. Кроме того, режимы блокировки и тайм-аута совместно используются файловыми дескрипторами и объектами сокетов, которые ссылаются на одну и ту же конечную точку сети. Эта деталь реализации может иметь видимые последствия, если, например, вы решите использовать fileno()
сокета.
Тайм-ауты и метод connect
¶
Операция connect()
также зависит от настройки времени ожидания, и, как правило, рекомендуется вызывать settimeout()
перед вызовом connect()
или передавать параметр времени ожидания в create_connection()
. Однако системный сетевой стек также может сам по себе возвращать ошибку тайм-аута соединения, независимо от каких-либо настроек тайм-аута сокета Python.
Тайм-ауты и метод accept
¶
Если getdefaulttimeout()
не равно None
, сокеты, возвращаемые методом accept()
, наследуют этот тайм-аут. В противном случае поведение зависит от настроек прослушивающего сокета:
если прослушивающий сокет находится в режиме блокировки или в режиме ожидания, сокет, возвращаемый
accept()
, находится в режиме блокировки;если прослушивающий сокет находится в неблокирующем режиме, то независимо от того, находится ли сокет, возвращаемый с помощью
accept()
, в блокирующем или неблокирующем режиме, зависит от операционной системы. Если вы хотите обеспечить межплатформенное взаимодействие, рекомендуется вручную переопределить этот параметр.
Пример¶
Вот четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который возвращает все данные, которые он получает обратно (обслуживая только одного клиента), и клиент, использующий его. Обратите внимание, что сервер должен выполнять последовательность socket()
, bind()
, listen()
, accept()
(, возможно, повторяя accept()
для обслуживания более чем одного клиента), в то время как клиенту требуется только последовательность socket()
, connect()
. Также обратите внимание, что сервер не sendall()
/recv()
в сокете, который он прослушивает, но в новом сокете, возвращаемом accept()
.
Первые два примера поддерживают только IPv4.
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
# Echo client program
import socket
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Следующие два примера идентичны двум приведенным выше, но поддерживают как IPv4, так и IPv6. Серверная часть будет прослушивать первое доступное семейство адресов (вместо этого она должна прослушивать оба). В большинстве систем, поддерживающих протокол IPv6, приоритет будет иметь протокол IPv6, и сервер может не принимать трафик IPv4. Клиентская сторона попытается подключиться ко всем адресам, возвращенным в результате разрешения имен, и отправит трафик на первый успешно подключенный адрес.
# Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.send(data)
# Echo client program
import socket
import sys
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.connect(sa)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
with s:
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
В следующем примере показано, как написать очень простой сетевой анализатор с необработанными сокетами в Windows. Для изменения интерфейса в этом примере требуются права администратора:
import socket
# the public network interface
HOST = socket.gethostbyname(socket.gethostname())
# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))
# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# receive all packets
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
# receive a packet
print(s.recvfrom(65565))
# disabled promiscuous mode
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
В следующем примере показано, как использовать интерфейс socket для связи с сетью CAN по протоколу raw socket. Чтобы использовать CAN с протоколом broadcast manager, откройте сокет с помощью:
socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
После привязки (CAN_RAW
) или подключения (CAN_BCM
) сокета вы можете использовать операции socket.send()
и socket.recv()
(и их аналоги) для объекта socket как обычно.
Для этого последнего примера могут потребоваться особые привилегии:
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) смотрите в следующих статьях:
An Introductory 4.3BSD Interprocess Communication Tutorial, by Stuart Sechrest
An Advanced 4.3BSD Interprocess Communication Tutorial, by Samuel J. Leffler et al,
оба в Руководстве программиста UNIX, Дополнительные документы 1 (разделы PS1:7 и PS1:8). Справочные материалы по различным системным вызовам, связанным с сокетами, относящиеся к конкретной платформе, также являются ценным источником информации о деталях семантики сокетов. Для Unix обратитесь к страницам руководства; для Windows - к спецификации WinSock (или Winsock 2). Что касается готовых к использованию в IPv6 API-интерфейсов, читатели могут обратиться к RFC 3493, озаглавленному «Основные расширения интерфейса сокета для IPv6».