socket
— Low-level networking interface¶
Source code: Lib/socket.py
Цей модуль забезпечує доступ до інтерфейсу BSD socket. Він доступний у всіх сучасних системах Unix, Windows, MacOS і, можливо, на додаткових платформах.
Informacja
Деяка поведінка може залежати від платформи, оскільки виклики здійснюються до API сокетів операційної системи.
Dostępność: not WASI.
Этот модуль не работает или недоступен в WebAssembly. См. Платформы веб-сборки для получения дополнительной информации.
The Python interface is a straightforward transliteration of the Unix system
call and library interface for sockets to Python’s object-oriented style: the
socket()
function returns a socket object whose methods implement
the various socket system calls. Parameter types are somewhat higher-level than
in the C interface: as with read()
and write()
operations on Python
files, buffer allocation on receive operations is automatic, and buffer length
is implicit on send operations.
Zobacz także
- Module
socketserver
Класи, які спрощують написання мережевих серверів.
- Модуль
ssl
Обгортка TLS/SSL для об’єктів сокета.
Сімейства розеток¶
Depending on the system and the build options, various socket families are supported by this module.
Формат адреси, необхідний для певного об’єкта сокета, вибирається автоматично на основі сімейства адрес, указаного під час створення об’єкта сокета. Адреси сокетів представлені таким чином:
The address of an
AF_UNIX
socket bound to a file system node is represented as a string, using the file system encoding and the'surrogateescape'
error handler (see PEP 383). An address in Linux’s abstract namespace is returned as a bytes-like object with an initial null byte; note that sockets in this namespace can communicate with normal file system sockets, so programs intended to run on Linux may need to deal with both types of address. A string or bytes-like object can be used for either type of address when passing it as an argument.Zmienione w wersji 3.3: Previously,
AF_UNIX
socket paths were assumed to use UTF-8 encoding.Zmienione w wersji 3.5: Записуваний bytes-like object тепер приймається.
A pair
(host, port)
is used for theAF_INET
address family, where host is a string representing either a hostname in internet domain notation like'daring.cwi.nl'
or an IPv4 address like'100.50.200.5'
, and port is an integer.For IPv4 addresses, two special forms are accepted instead of a host address:
''
representsINADDR_ANY
, which is used to bind to all interfaces, and the string'<broadcast>'
representsINADDR_BROADCAST
. This behavior is not compatible with IPv6, therefore, you may want to avoid these if you intend to support IPv6 with your Python programs.
For
AF_INET6
address family, a four-tuple(host, port, flowinfo, scope_id)
is used, where flowinfo and scope_id represent thesin6_flowinfo
andsin6_scope_id
members instruct sockaddr_in6
in C. Forsocket
module methods, flowinfo and scope_id can be omitted just for backward compatibility. Note, however, omission of scope_id can cause problems in manipulating scoped IPv6 addresses.Zmienione w wersji 3.7: For multicast addresses (with scope_id meaningful) address may not contain
%scope_id
(orzone id
) part. This information is superfluous and may be safely omitted (recommended).AF_NETLINK
сокети представлені як пари(pid, groups)
.Linux-only support for TIPC is available using the
AF_TIPC
address family. TIPC is an open, non-IP based networked protocol designed for use in clustered computer environments. Addresses are represented by a tuple, and the fields depend on the address type. The general tuple form is(addr_type, v1, v2, v3 [, scope])
, where:addr_type is one of
TIPC_ADDR_NAMESEQ
,TIPC_ADDR_NAME
, orTIPC_ADDR_ID
.scope є одним із
TIPC_ZONE_SCOPE
,TIPC_CLUSTER_SCOPE
таTIPC_NODE_SCOPE
.If addr_type is
TIPC_ADDR_NAME
, then v1 is the server type, v2 is the port identifier, and v3 should be 0.If addr_type is
TIPC_ADDR_NAMESEQ
, then v1 is the server type, v2 is the lower port number, and v3 is the upper port number.Якщо addr_type дорівнює
TIPC_ADDR_ID
, тоді v1 є вузлом, v2 є посиланням, а v3 має бути встановлено на 0.
Кортеж
(інтерфейс, )
використовується для сімейства адресAF_CAN
, де інтерфейс — це рядок, що представляє назву мережевого інтерфейсу, наприклад'can0'
. Ім’я мережевого інтерфейсу''
можна використовувати для отримання пакетів від усіх мережевих інтерфейсів цього сімейства.CAN_ISOTP
protocol require a tuple(interface, rx_addr, tx_addr)
where both additional parameters are unsigned long integer that represent a CAN identifier (standard or extended).CAN_J1939
protocol require a tuple(interface, name, pgn, addr)
where additional parameters are 64-bit unsigned integer representing the ECU name, a 32-bit unsigned integer representing the Parameter Group Number (PGN), and an 8-bit integer representing the address.
Строка или кортеж
(id, unit)
используется для протоколаSYSPROTO_CONTROL
семействаPF_SYSTEM
. Эта строка представляет собой имя элемента управления ядра с использованием динамически назначаемого идентификатора. Кортеж можно использовать, если известны идентификатор и номер устройства управления ядром или если используется зарегистрированный идентификатор.Dodane w wersji 3.3.
AF_BLUETOOTH
supports the following protocols and address formats:BTPROTO_L2CAP
accepts(bdaddr, psm)
wherebdaddr
is the Bluetooth address as a string andpsm
is an integer.BTPROTO_RFCOMM
accepts(bdaddr, channel)
wherebdaddr
is the Bluetooth address as a string andchannel
is an integer.BTPROTO_HCI
accepts a format that depends on your OS.On Linux it accepts a tuple
(device_id,)
wheredevice_id
is an integer specifying the number of the Bluetooth device.在 FreeBSD, NetBSD 和 DragonFly BSD 上它接受
bdaddr
其中bdaddr
是字符串形式的蓝牙地址。
Zmienione w wersji 3.2: NetBSD and DragonFlyBSD support added.
Zmienione w wersji 3.13.3: FreeBSD support added.
BTPROTO_SCO
acceptsbdaddr
wherebdaddr
is the Bluetooth address as a string or abytes
object. (ex.'12:23:34:45:56:67'
orb'12:23:34:45:56:67'
) This protocol is not supported under FreeBSD.
AF_ALG
— це інтерфейс для криптографії ядра на основі сокетів лише для Linux. Сокет алгоритму налаштований за допомогою кортежу з двох-чотирьох елементів(type, name [, feat [, mask]])
, де:type is the algorithm type as string, e.g.
aead
,hash
,skcipher
orrng
.ім’я — це назва алгоритму та режим роботи у вигляді рядка, напр.
sha256
,hmac(sha256)
,cbc(aes)
абоdrbg_nopr_ctr_aes256
.feat і mask — це 32-розрядні цілі числа без знаку.
Dostępność: Linux >= 2.6.38.
Для некоторых типов алгоритмов требуются более свежие ядра.
Dodane w wersji 3.6.
AF_VSOCK
дозволяє спілкуватися між віртуальними машинами та їх хостами. Сокети представлені як кортеж(CID, порт)
, де ідентифікатор контексту або CID і порт є цілими числами.Dostępność: Linux >= 3.9
См. vsock(7)
Dodane w wersji 3.7.
AF_PACKET
— это низкоуровневый интерфейс непосредственно с сетевыми устройствами. Адреса представлены кортежем(ifname, proto[, pkttype[, hatype[, addr]]])
, где:ifname - Рядок, що визначає назву пристрою.
proto — номер протокола Ethernet. Это может быть
ETH_P_ALL
для захвата всех протоколов, одна из констант ETHERTYPE_* или любой другой номер протокола Ethernet.pkttype - Optional integer specifying the packet type:
PACKET_HOST
(the default) - Packet addressed to the local host.PACKET_BROADCAST
- широкомовний пакет фізичного рівня.PACKET_MULTICAST
- Packet sent to a physical-layer multicast address.PACKET_OTHERHOST
- Packet to some other host that has been caught by a device driver in promiscuous mode.PACKET_OUTGOING
– Пакет, що надходить від локального хосту і повертається до сокета пакета.
hatype – додаткове ціле число, що визначає тип апаратної адреси ARP.
addr – необов’язковий байтовий об’єкт, що вказує апаратну фізичну адресу, інтерпретація якої залежить від пристрою.
Dostępność: Linux >= 2.2.
AF_QIPCRTR
— це інтерфейс на основі сокетів лише для Linux для зв’язку зі службами, що працюють на співпроцесорах на платформах Qualcomm. Сімейство адрес представлено як кортеж(вузол, порт)
, де вузол і порт є невід’ємними цілими числами.Dostępność: Linux >= 4.7.
Dodane w wersji 3.8.
IPPROTO_UDPLITE
is a variant of UDP which allows you to specify what portion of a packet is covered with the checksum. It adds two socket options that you can change.self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)
will change what portion of outgoing packets are covered by the checksum andself.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)
will filter out packets which cover too little of their data. In both caseslength
should be inrange(8, 2**16, 8)
.Such a socket should be constructed with
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)
for IPv4 orsocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)
for IPv6.Dostępność: Linux >= 2.6.20, FreeBSD >= 10.1
Dodane w wersji 3.9.
AF_HYPERV
is a Windows-only socket based interface for communicating with Hyper-V hosts and guests. The address family is represented as a(vm_id, service_id)
tuple where thevm_id
andservice_id
are UUID strings.The
vm_id
is the virtual machine identifier or a set of known VMID values if the target is not a specific virtual machine. Known VMID constants defined onsocket
are:HV_GUID_ZERO
HV_GUID_BROADCAST
HV_GUID_WILDCARD
- Used to bind on itself and accept connections from all partitions.HV_GUID_CHILDREN
- Used to bind on itself and accept connection from child partitions.HV_GUID_LOOPBACK
— используется как цель для самого себя.HV_GUID_PARENT
- When used as a bind accepts connection from the parent partition. When used as an address target it will connect to the parent partition.
The
service_id
is the service identifier of the registered service.Dodane w wersji 3.12.
Якщо ви використовуєте ім’я хоста в частині host адреси сокета IPv4/v6, програма може продемонструвати недетерміновану поведінку, оскільки Python використовує першу адресу, повернуту з вирішення DNS. Адреса сокета буде перетворена по-іншому в фактичну адресу IPv4/v6, залежно від результатів розв’язання DNS та/або конфігурації хоста. Для детермінованої поведінки використовуйте числову адресу в частині host.
All errors raise exceptions. The normal exceptions for invalid argument types
and out-of-memory conditions can be raised. Errors
related to socket or address semantics raise OSError
or one of its
subclasses.
Non-blocking mode is supported through setblocking()
. A
generalization of this based on timeouts is supported through
settimeout()
.
Зміст модуля¶
Модуль socket
експортує такі елементи.
Wyjątki¶
- exception socket.herror¶
Підклас
OSError
, цей виняток виникає для помилок, пов’язаних з адресою, тобто для функцій, які використовують h_errno в POSIX C API, включаючиgethostbyname_ex()
іgethostbyaddr()
. Супровідним значенням є пара(h_errno, string)
, яка представляє помилку, яку повертає виклик бібліотеки. h_errno — це числове значення, тоді як string представляє опис h_errno, який повертає функціяhstrerror()
C.Zmienione w wersji 3.3: This class was made a subclass of
OSError
.
- exception socket.gaierror¶
A subclass of
OSError
, this exception is raised for address-related errors bygetaddrinfo()
andgetnameinfo()
. The accompanying value is a pair(error, string)
representing an error returned by a library call. string represents the description of error, as returned by thegai_strerror()
C function. The numeric error value will match one of theEAI_*
constants defined in this module.Zmienione w wersji 3.3: This class was made a subclass of
OSError
.
- exception socket.timeout¶
A deprecated alias of
TimeoutError
.A subclass of
OSError
, this exception is raised when a timeout occurs on a socket which has had timeouts enabled via a prior call tosettimeout()
(or implicitly throughsetdefaulttimeout()
). The accompanying value is a string whose value is currently always „timed out”.Zmienione w wersji 3.3: This class was made a subclass of
OSError
.Zmienione w wersji 3.10: This class was made an alias of
TimeoutError
.
Stały¶
The AF_* and SOCK_* constants are now AddressFamily
and
SocketKind
IntEnum
collections.
Dodane w wersji 3.4.
- socket.AF_UNIX¶
- socket.AF_INET¶
- socket.AF_INET6¶
These constants represent the address (and protocol) families, used for the first argument to
socket()
. If theAF_UNIX
constant is not defined then this protocol is unsupported. More constants may be available depending on the system.
- socket.AF_UNSPEC¶
AF_UNSPEC
означает, чтоgetaddrinfo()
должен возвращать адреса сокетов для любого семейства адресов (IPv4, IPv6 или любого другого), которое можно использовать.
- socket.SOCK_STREAM¶
- socket.SOCK_DGRAM¶
- socket.SOCK_RAW¶
- socket.SOCK_RDM¶
- socket.SOCK_SEQPACKET¶
These constants represent the socket types, used for the second argument to
socket()
. More constants may be available depending on the system. (OnlySOCK_STREAM
andSOCK_DGRAM
appear to be generally useful.)
- socket.SOCK_CLOEXEC¶
- socket.SOCK_NONBLOCK¶
Ці дві константи, якщо їх визначено, можна комбінувати з типами сокетів і дозволити вам встановлювати деякі прапори атомарно (таким чином уникаючи можливих умов змагання та потреби в окремих викликах).
Zobacz także
Безопасная обработка файловых дескрипторов для более подробного объяснения.
Dostępność: Linux >= 2.6.27.
Dodane w wersji 3.2.
- SO_*
- socket.SOMAXCONN¶
- MSG_*
- SOL_*
- SCM_*
- IPPROTO_*
- IPPORT_*
- INADDR_*
- IP_*
- IPV6_*
- EAI_*
- AI_*
- NI_*
- TCP_*
Многие константы этих форм, описанные в документации Unix по сокетам и/или протоколу IP, также определены в модуле сокета. Обычно они используются в аргументах методов
setsockopt()
иgetsockopt()
объектов сокетов. В большинстве случаев определяются только те символы, которые определены в файлах заголовков Unix; для некоторых символов указаны значения по умолчанию.Zmienione w wersji 3.6: Додано
SO_DOMAIN
,SO_PROTOCOL
,SO_PEERSEC
,SO_PASSSEC
,TCP_USER_TIMEOUT
,TCP_CONGESTION
.Zmienione w wersji 3.6.5: On Windows,
TCP_FASTOPEN
,TCP_KEEPCNT
appear if run-time Windows supports.Zmienione w wersji 3.7:
TCP_NOTSENT_LOWAT
було додано.On Windows,
TCP_KEEPIDLE
,TCP_KEEPINTVL
appear if run-time Windows supports.Zmienione w wersji 3.10:
IP_RECVTOS
was added. AddedTCP_KEEPALIVE
. On MacOS this constant can be used in the same way thatTCP_KEEPIDLE
is used on Linux.Zmienione w wersji 3.11: Добавлен
TCP_CONNECTION_INFO
. В MacOS эту константу можно использовать так же, как TCP_INFO в Linux и BSD.Zmienione w wersji 3.12: Добавлены SO_RTABLE и SO_USER_COOKIE. В OpenBSD и FreeBSD соответственно эти константы можно использовать так же, как SO_MARK в Linux. Также добавлены отсутствующие параметры TCP-сокета из Linux:
TCP_MD5SIG
,TCP_THIN_LINEAR_TIMEOUTS
,TCP_THIN_DUPACK
,TCP_REPAIR
,TCP_REPAIR_QUEUE
,TCP_QUEUE_SEQ
,TCP_REPAIR_OPTIONS
,TCP_TIMESTAMP
,TCP_CC_INFO
,TCP_SAVE_SYN
,TCP_SAVED_SYN
,TCP_REPAIR_WINDOW
,TCP_FASTOPEN_CONNECT
,TCP_ULP
,TCP_MD5SIG_EXT
, `` TCP_FASTOPEN_KEY`,TCP_FASTOPEN_NO_COOKIE
,TCP_ZEROCOPY_RECEIVE
,TCP_INQ
,TCP_TX_DELAY
. Добавлены IP_PKTINFO, IP_UNBLOCK_SOURCE, IP_BLOCK_SOURCE, IP_ADD_SOURCE_MEMBERSHIP, IP_DROP_SOURCE_MEMBERSHIP.Zmienione w wersji 3.13: Добавлен
SO_BINDTOIFINDEX
. В Linux эту константу можно использовать так же, как SO_BINDTODEVICE, но с индексом сетевого интерфейса вместо его имени.
- socket.AF_CAN¶
- socket.PF_CAN¶
- SOL_CAN_*
- CAN_*
Many constants of these forms, documented in the Linux documentation, are also defined in the socket module.
Dostępność: Linux >= 2.6.25, NetBSD >= 8.
Dodane w wersji 3.3.
Zmienione w wersji 3.11: NetBSD support was added.
Zmienione w wersji 3.13.4: 在 Linux 上恢复缺失的
CAN_RAW_ERR_FILTER
。
- socket.CAN_BCM¶
- CAN_BCM_*
CAN_BCM, in the CAN protocol family, is the broadcast manager (BCM) protocol. Broadcast manager constants, documented in the Linux documentation, are also defined in the socket module.
Dostępność: Linux >= 2.6.25.
Informacja
The
CAN_BCM_CAN_FD_FRAME
flag is only available on Linux >= 4.8.Dodane w wersji 3.4.
- socket.CAN_RAW_FD_FRAMES¶
Вмикає підтримку CAN FD у гнізді CAN_RAW. За замовчуванням це вимкнено. Це дозволяє вашій програмі надсилати кадри CAN і CAN FD; однак під час читання з роз’єму ви повинні приймати як CAN, так і CAN FD кадри.
This constant is documented in the Linux documentation.
Dostępność: Linux >= 3.6.
Dodane w wersji 3.5.
- socket.CAN_RAW_JOIN_FILTERS¶
Об’єднує застосовані фільтри CAN, щоб у простір користувача передавалися лише кадри CAN, які відповідають усім наданим фільтрам CAN.
This constant is documented in the Linux documentation.
Dostępność: Linux >= 4.1.
Dodane w wersji 3.9.
- socket.CAN_ISOTP¶
CAN_ISOTP у сімействі протоколів CAN є протоколом ISO-TP (ISO 15765-2). Константи ISO-TP, задокументовані в документації Linux.
Dostępność: Linux >= 2.6.25.
Dodane w wersji 3.7.
- socket.CAN_J1939¶
CAN_J1939, in the CAN protocol family, is the SAE J1939 protocol. J1939 constants, documented in the Linux documentation.
Dostępność: Linux >= 5.4.
Dodane w wersji 3.9.
- socket.AF_DIVERT¶
- socket.PF_DIVERT¶
Эти две константы, описанные на странице руководства FreeBSD divert(4), также определены в модуле сокета.
Dostępność: FreeBSD >= 14.0.
Dodane w wersji 3.12.
- socket.AF_PACKET¶
- socket.PF_PACKET¶
- PACKET_*
Many constants of these forms, documented in the Linux documentation, are also defined in the socket module.
Dostępność: Linux >= 2.2.
- socket.ETH_P_ALL¶
ETH_P_ALL
can be used in thesocket
constructor as proto for theAF_PACKET
family in order to capture every packet, regardless of protocol.For more information, see the packet(7) manpage.
Dostępność: Linux.
Dodane w wersji 3.12.
- socket.AF_RDS¶
- socket.PF_RDS¶
- socket.SOL_RDS¶
- RDS_*
Many constants of these forms, documented in the Linux documentation, are also defined in the socket module.
Dostępność: Linux >= 2.6.30.
Dodane w wersji 3.3.
- socket.SIO_RCVALL¶
- socket.SIO_KEEPALIVE_VALS¶
- socket.SIO_LOOPBACK_FAST_PATH¶
- RCVALL_*
Константи для Windows WSAIoctl(). Константи використовуються як аргументи методу
ioctl()
об’єктів сокета.Zmienione w wersji 3.6:
SIO_LOOPBACK_FAST_PATH
було додано.
- TIPC_*
Константи, пов’язані з TIPC, що збігаються з тими, які експортує API сокета C. Додаткову інформацію див. у документації TIPC.
- socket.AF_ALG¶
- socket.SOL_ALG¶
- ALG_*
Константи для криптографії ядра Linux.
Dostępność: Linux >= 2.6.38.
Dodane w wersji 3.6.
- socket.AF_VSOCK¶
- socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID¶
- VMADDR*
- SO_VM*
Константи для зв’язку хост/гость Linux.
Dostępność: Linux >= 4.8.
Dodane w wersji 3.7.
- socket.AF_LINK¶
Dostępność: BSD, macOS.
Dodane w wersji 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¶
For use with
BTPROTO_HCI
.HCI_FILTER
is only available on Linux and FreeBSD.HCI_TIME_STAMP
andHCI_DATA_DIR
are only available on Linux.
- socket.AF_QIPCRTR¶
Константа для протоколу маршрутизатора IPC Qualcomm, який використовується для зв’язку з віддаленими процесорами, що надають послуги.
Dostępność: Linux >= 4.7.
- socket.SCM_CREDS2¶
- socket.LOCAL_CREDS¶
- socket.LOCAL_CREDS_PERSISTENT¶
LOCAL_CREDS и LOCAL_CREDS_PERSISTENT могут использоваться с сокетами SOCK_DGRAM, SOCK_STREAM, что эквивалентно Linux/DragonFlyBSD SO_PASSCRED, в то время как LOCAL_CREDS отправляет учетные данные при первом чтении, LOCAL_CREDS_PERSISTENT отправляет при каждом чтении, затем для последнего необходимо использовать SCM_CREDS2 для типа сообщения.
Dodane w wersji 3.11.
Dostępność: FreeBSD.
- socket.SO_INCOMING_CPU¶
Константа для оптимизации локальности ЦП, которая будет использоваться вместе с
SO_REUSEPORT
.Dodane w wersji 3.11.
Dostępność: Linux >= 3.9
- socket.AF_HYPERV¶
- socket.HV_PROTOCOL_RAW¶
- socket.HVSOCKET_CONNECT_TIMEOUT¶
- socket.HVSOCKET_CONNECT_TIMEOUT_MAX¶
- socket.HVSOCKET_CONNECTED_SUSPEND¶
- socket.HVSOCKET_ADDRESS_FLAG_PASSTHRU¶
- socket.HV_GUID_ZERO¶
- socket.HV_GUID_WILDCARD¶
- socket.HV_GUID_BROADCAST¶
- socket.HV_GUID_CHILDREN¶
- socket.HV_GUID_LOOPBACK¶
- socket.HV_GUID_PARENT¶
Constants for Windows Hyper-V sockets for host/guest communications.
Dostępność: Windows.
Dodane w wersji 3.12.
- socket.ETHERTYPE_ARP¶
- socket.ETHERTYPE_IP¶
- socket.ETHERTYPE_IPV6¶
- socket.ETHERTYPE_VLAN¶
IEEE 802.3 protocol number. constants.
Dostępność: Linux, FreeBSD, macOS.
Dodane w wersji 3.12.
- socket.SHUT_RD¶
- socket.SHUT_WR¶
- socket.SHUT_RDWR¶
These constants are used by the
shutdown()
method of socket objects.Dostępność: not WASI.
Zadania¶
Створення сокетів¶
The following functions all create 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()
.Новостворений сокет не успадковується.
Raises an auditing event
socket.__new__
with argumentsself
,family
,type
,protocol
.Zmienione w wersji 3.3: Додано сімейство AF_CAN. Додано сімейство AF_RDS.
Zmienione w wersji 3.4: The CAN_BCM protocol was added.
Zmienione w wersji 3.4: Повернений сокет тепер не успадковується.
Zmienione w wersji 3.7: Додано протокол CAN_ISOTP.
Zmienione w wersji 3.7: Когда битовые флаги
SOCK_NONBLOCK
илиSOCK_CLOEXEC
применяются к type, они очищаются, иsocket.type
не будет их отражать. Они по-прежнему передаются базовому системному вызову Socket(). Поэтому,sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
will still create a non-blocking socket on OSes that support
SOCK_NONBLOCK
, butsock.type
will be set tosocket.SOCK_STREAM
.Zmienione w wersji 3.9: The CAN_J1939 protocol was added.
Zmienione w wersji 3.10: Додано протокол IPPROTO_MPTCP.
- socket.socketpair([family[, type[, proto]]])¶
Build a pair of connected socket objects using the given address family, socket type, and protocol number. Address family, socket type, and protocol number are as for the
socket()
function above. The default family isAF_UNIX
if defined on the platform; otherwise, the default isAF_INET
.Новостворені сокети не успадковуються.
Zmienione w wersji 3.2: The returned socket objects now support the whole socket API, rather than a subset.
Zmienione w wersji 3.4: Повернені сокети тепер не успадковуються.
Zmienione w wersji 3.5: Додано підтримку Windows.
- socket.create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False)¶
Підключіться до служби TCP, яка прослуховує адресу в Інтернеті (2-кортеж
(хост, порт)
) і поверніть об’єкт сокета. Це функція вищого рівня, ніжsocket.connect()
: якщо host є нечисловим ім’ям хоста, вона намагатиметься вирішити його як дляAF_INET
, так і дляAF_INET6
, а потім спробуйте підключитися до всіх можливих адрес по черзі, доки підключення не вдасться. Це полегшує написання клієнтів, сумісних як з IPv4, так і з IPv6.Передача додаткового параметра timeout встановить час очікування для екземпляра сокета перед спробою підключення. Якщо тайм-аут не вказано, використовується глобальне налаштування тайм-ауту за умовчанням, яке повертає
getdefaulttimeout()
.Якщо надано, source_address має бути 2-кортежем
(хост, порт)
, щоб сокет прив’язувався до своєї адреси джерела перед підключенням. Якщо хост або порт мають значення «» або 0 відповідно, буде використано типову поведінку ОС.Если соединение не может быть создано, возникает исключение. По умолчанию это исключение из последнего адреса в списке. Если all_errors имеет значение True, это
ExceptionGroup
, содержащий ошибки всех попыток.Zmienione w wersji 3.2: вихідна_адреса була додана.
Zmienione w wersji 3.11: all_errors was added.
- socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False)¶
Удобная функция, которая создает TCP-сокет, привязанный к адресу (двухкортежный
(хост, порт)
) и возвращает объект сокета.family should be either
AF_INET
orAF_INET6
. backlog is the queue size passed tosocket.listen()
; if not specified , a default reasonable value is chosen. reuse_port dictates whether to set theSO_REUSEPORT
socket option.Если dualstack_ipv6 имеет значение true, family имеет значение
AF_INET6
и платформа его поддерживает, сокет сможет принимать как соединения IPv4, так и соединения IPv6, в противном случае будет выдана ошибкаValueError
. Предполагается, что большинство платформ POSIX и Windows поддерживают эту функциональность. Когда эта функциональность включена, адрес, возвращаемыйsocket.getpeername()
при возникновении соединения IPv4, будет адресом IPv6, представленным как сопоставленный с IPv4 адрес IPv6. Если dualstack_ipv6 имеет значение false, эта функциональность будет явно отключена на платформах, которые включают ее по умолчанию (например, Linux). Этот параметр можно использовать вместе сhas_dualstack_ipv6()
:import socket addr = ("", 8080) # all interfaces, port 8080 if socket.has_dualstack_ipv6(): s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True) else: s = socket.create_server(addr)
Informacja
On POSIX platforms the
SO_REUSEADDR
socket option is set in order to immediately reuse previous sockets which were bound on the same address and remained in TIME_WAIT state.Dodane w wersji 3.8.
- socket.has_dualstack_ipv6()¶
Return
True
if the platform supports creating a TCP socket which can handle both IPv4 and IPv6 connections.Dodane w wersji 3.8.
- socket.fromfd(fd, family, type, proto=0)¶
Duplicate the file descriptor fd (an integer as returned by a file object’s
fileno()
method) and build a socket object from the result. Address family, socket type and protocol number are as for thesocket()
function above. The file descriptor should refer to a socket, but this is not checked — subsequent operations on the object may fail if the file descriptor is invalid. This function is rarely needed, but can be used to get or set socket options on a socket passed to a program as standard input or output (such as a server started by the Unix inet daemon). The socket is assumed to be in blocking mode.Новостворений сокет не успадковується.
Zmienione w wersji 3.4: Повернений сокет тепер не успадковується.
Instantiate a socket from data obtained from the
socket.share()
method. The socket is assumed to be in blocking mode.Dostępność: Windows.
Dodane w wersji 3.3.
- socket.SocketType¶
Це об’єкт типу Python, який представляє тип об’єкта сокета. Це те саме, що
type(socket(...))
.
Інші функції¶
The socket
module also offers various network-related services:
- socket.close(fd)¶
Close a socket file descriptor. This is like
os.close()
, but for sockets. On some platforms (most noticeable Windows)os.close()
does not work for socket file descriptors.Dodane w wersji 3.7.
- socket.getaddrinfo(host, port, family=AF_UNSPEC, type=0, proto=0, flags=0)¶
This function wraps the C function
getaddrinfo
of the underlying system.Translate the host/port argument into a sequence of 5-tuples that contain all the necessary arguments for creating a socket connected to that service. host is a domain name, a string representation of an IPv4/v6 address or
None
. port is a string service name such as'http'
, a numeric port number orNone
. By passingNone
as the value of host and port, you can passNULL
to the underlying C API.Аргументы family, type и proto можно указать дополнительно, чтобы предоставить параметры и ограничить список возвращаемых адресов. Передайте их значения по умолчанию (
AF_UNSPEC
, 0 и 0 соответственно), чтобы не ограничивать результаты. Подробности смотрите в примечании ниже.The flags argument can be one or several of the
AI_*
constants, and will influence how results are computed and returned. For example,AI_NUMERICHOST
will disable domain name resolution and will raise an error if host is a domain name.Функція повертає список із 5-ти кортежів із такою структурою:
(family, type, proto, canonname, sockaddr)
In these tuples, family, type, proto are all integers and are meant to be passed to the
socket()
function. canonname will be a string representing the canonical name of the host ifAI_CANONNAME
is part of the flags argument; else canonname will be empty. sockaddr is a tuple describing a socket address, whose format depends on the returned family (a(address, port)
2-tuple forAF_INET
, a(address, port, flowinfo, scope_id)
4-tuple forAF_INET6
), and is meant to be passed to thesocket.connect()
method.Informacja
If you intend to use results from
getaddrinfo()
to create a socket (rather than, for example, retrieve canonname), consider limiting the results by type (e.g.SOCK_STREAM
orSOCK_DGRAM
) and/or proto (e.g.IPPROTO_TCP
orIPPROTO_UDP
) that your application can handle.The behavior with default values of family, type, proto and flags is system-specific.
Many systems (for example, most Linux configurations) will return a sorted list of all matching addresses. These addresses should generally be tried in order until a connection succeeds (possibly tried in parallel, for example, using a Happy Eyeballs algorithm). In these cases, limiting the type and/or proto can help eliminate unsuccessful or unusable connection attempts.
Some systems will, however, only return a single address. (For example, this was reported on Solaris and AIX configurations.) On these systems, limiting the type and/or proto helps ensure that this address is usable.
Raises an auditing event
socket.getaddrinfo
with argumentshost
,port
,family
,type
,protocol
.The following example fetches address information for a hypothetical TCP connection to
example.org
on port 80 (results may differ on your system if IPv6 isn’t enabled):>>> 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))]
Zmienione w wersji 3.2: parameters can now be passed using keyword arguments.
Zmienione w wersji 3.7: для багатоадресних адрес IPv6 рядок, що представляє адресу, не міститиме частину
%scope_id
.
- socket.getfqdn([name])¶
Повернути повне доменне ім’я для name. Якщо ім’я опущене або порожнє, воно інтерпретується як локальний хост. Щоб знайти повне ім’я, перевіряється ім’я хоста, яке повертає
gethostbyaddr()
, а потім ідуть псевдоніми хоста, якщо вони доступні. Вибрано перше ім’я, яке містить крапку. Якщо повне доменне ім’я недоступне, а було вказано ім’я, воно повертається без змін. Якщо name було порожнім або дорівнює'0.0.0.0'
, повертається ім’я хоста зgethostname()
.
- socket.gethostbyname(hostname)¶
Translate a host name to IPv4 address format. The IPv4 address is returned as a string, such as
'100.50.200.5'
. If the host name is an IPv4 address itself it is returned unchanged. Seegethostbyname_ex()
for a more complete interface.gethostbyname()
does not support IPv6 name resolution, andgetaddrinfo()
should be used instead for IPv4/v6 dual stack support.Викликає подію аудиту
socket.gethostbyname
з аргументомhostname
.Dostępność: not WASI.
- socket.gethostbyname_ex(hostname)¶
Translate a host name to IPv4 address format, extended interface. Return a 3-tuple
(hostname, aliaslist, ipaddrlist)
where hostname is the host’s primary host name, aliaslist is a (possibly empty) list of alternative host names for the same address, and ipaddrlist is a list of IPv4 addresses for the same interface on the same host (often but not always a single address).gethostbyname_ex()
does not support IPv6 name resolution, andgetaddrinfo()
should be used instead for IPv4/v6 dual stack support.Викликає подію аудиту
socket.gethostbyname
з аргументомhostname
.Dostępność: not WASI.
- socket.gethostname()¶
Повертає рядок, що містить ім’я хоста машини, на якій зараз виконується інтерпретатор Python.
Викликає подію аудиту
socket.gethostname
без аргументів.Note:
gethostname()
doesn’t always return the fully qualified domain name; usegetfqdn()
for that.Dostępność: not WASI.
- socket.gethostbyaddr(ip_address)¶
Return a 3-tuple
(hostname, aliaslist, ipaddrlist)
where hostname is the primary host name responding to the given ip_address, aliaslist is a (possibly empty) list of alternative host names for the same address, and ipaddrlist is a list of IPv4/v6 addresses for the same interface on the same host (most likely containing only a single address). To find the fully qualified domain name, use the functiongetfqdn()
.gethostbyaddr()
supports both IPv4 and IPv6.Викликає подію аудиту
socket.gethostbyaddr
з аргументомip_address
.Dostępność: not WASI.
- socket.getnameinfo(sockaddr, flags)¶
Translate a socket address sockaddr into a 2-tuple
(host, port)
. Depending on the settings of flags, the result can contain a fully qualified domain name or numeric address representation in host. Similarly, port can contain a string port name or a numeric port number.Для адрес IPv6
%scope_id
додається до частини хоста, якщо sockaddr містить значимий scope_id. Зазвичай це відбувається для багатоадресних адрес.Для отримання додаткової інформації про прапори ви можете звернутися до getnameinfo(3).
Викликає подію аудиту
socket.getnameinfo
з аргументомsockaddr
.Dostępność: not WASI.
- socket.getprotobyname(protocolname)¶
Преобразуйте имя интернет-протокола (например,
'icmp'
) в константу, подходящую для передачи в качестве (необязательного) третьего аргумента функцииsocket()
. Обычно это необходимо только для сокетов, открытых в «необработанном» режиме (SOCK_RAW
); для обычных режимов сокетов правильный протокол выбирается автоматически, если протокол опущен или равен нулю.Dostępność: not WASI.
- socket.getservbyname(servicename[, protocolname])¶
Перекладіть назву інтернет-сервісу та назву протоколу на номер порту для цієї служби. Додаткова назва протоколу, якщо її вказано, має бути
'tcp'
або'udp'
, інакше будь-який протокол збігатиметься.Викликає подію аудиту
socket.getservbyname
з аргументамиservicename
,protocolname
.Dostępność: not WASI.
- socket.getservbyport(port[, protocolname])¶
Перекладіть номер інтернет-порту та назву протоколу на назву служби для цієї служби. Додаткова назва протоколу, якщо її вказано, має бути
'tcp'
або'udp'
, інакше будь-який протокол збігатиметься.Викликає подію аудиту
socket.getservbyport
з аргументамиport
,protocolname
.Dostępność: not WASI.
- socket.ntohl(x)¶
Convert 32-bit positive integers from network to host byte order. On machines where the host byte order is the same as network byte order, this is a no-op; otherwise, it performs a 4-byte swap operation.
- socket.ntohs(x)¶
Перетворення 16-розрядних додатних чисел із мережевого порядку байтів на хост. На машинах, де порядок байтів хоста збігається з порядком байтів у мережі, це заборонено; інакше він виконує 2-байтову операцію обміну.
Zmienione w wersji 3.10: Raises
OverflowError
if x does not fit in a 16-bit unsigned integer.
- socket.htonl(x)¶
Convert 32-bit positive integers from host to network byte order. On machines where the host byte order is the same as network byte order, this is a no-op; otherwise, it performs a 4-byte swap operation.
- socket.htons(x)¶
Перетворення 16-розрядних додатних чисел із хоста в мережевий порядок байтів. На машинах, де порядок байтів хоста збігається з порядком байтів у мережі, це заборонено; інакше він виконує 2-байтову операцію обміну.
Zmienione w wersji 3.10: Raises
OverflowError
if x does not fit in a 16-bit unsigned integer.
- socket.inet_aton(ip_string)¶
Convert an IPv4 address from dotted-quad string format (for example, «123.45.67.89») to 32-bit packed binary format, as a bytes object four characters in length. This is useful when conversing with a program that uses the standard C library and needs objects of type
in_addr
, which is the C type for the 32-bit packed binary this function returns.inet_aton()
також приймає рядки з менш ніж трьома крапками; подробиці див. на сторінці посібника Unix inet(3).Якщо рядок адреси IPv4, переданий цій функції, недійсний, буде викликано
OSError
. Зауважте, що саме те, що є дійсним, залежить від базової реалізації Cinet_aton()
.inet_aton()
не підтримує IPv6, аinet_pton()
слід використовувати замість цього для підтримки подвійного стеку IPv4/v6.
- socket.inet_ntoa(packed_ip)¶
Преобразуйте 32-битный упакованный адрес IPv4 (объект, подобный bytes длиной в четыре байта) в его стандартное строковое представление, состоящее из четырех точек (например, «123.45.67.89»). Это полезно при общении с программой, которая использует стандартную библиотеку C и нуждается в объектах типа
in_addr
, который является типом C для 32-битных упакованных двоичных данных, которые эта функция принимает в качестве аргумента.If the byte sequence passed to this function is not exactly 4 bytes in length,
OSError
will be raised.inet_ntoa()
does not support IPv6, andinet_ntop()
should be used instead for IPv4/v6 dual stack support.Zmienione w wersji 3.5: Записуваний bytes-like object тепер приймається.
- socket.inet_pton(address_family, ip_string)¶
Преобразуйте IP-адрес из строкового формата, специфичного для семейства, в упакованный двоичный формат.
inet_pton()
полезен, когда библиотека или сетевой протокол вызывает объект типаin_addr
(аналогичноinet_aton()
) илиin6_addr
.Supported values for address_family are currently
AF_INET
andAF_INET6
. If the IP address string ip_string is invalid,OSError
will be raised. Note that exactly what is valid depends on both the value of address_family and the underlying implementation ofinet_pton()
.Dostępność: Unix, Windows.
Zmienione w wersji 3.4: Додано підтримку Windows
- socket.inet_ntop(address_family, packed_ip)¶
Convert a packed IP address (a bytes-like object of some number of bytes) to its standard, family-specific string representation (for example,
'7.10.0.5'
or'5aef:2b::8'
).inet_ntop()
is useful when a library or network protocol returns an object of typein_addr
(similar toinet_ntoa()
) orin6_addr
.Supported values for address_family are currently
AF_INET
andAF_INET6
. If the bytes object packed_ip is not the correct length for the specified address family,ValueError
will be raised.OSError
is raised for errors from the call toinet_ntop()
.Dostępność: Unix, Windows.
Zmienione w wersji 3.4: Додано підтримку Windows
Zmienione w wersji 3.5: Записуваний bytes-like object тепер приймається.
- socket.CMSG_LEN(length)¶
Повертає загальну довжину, без заповнення в кінці, елемента допоміжних даних із пов’язаними даними заданої довжини. Це значення часто можна використовувати як розмір буфера для
recvmsg()
для отримання окремого елемента допоміжних даних, але RFC 3542 вимагає, щоб портативні програми використовувалиCMSG_SPACE()
і таким чином включали простір для заповнення, навіть якщо елемент буде останнім у буфері. ВикликаєOverflowError
, якщо length виходить за межі допустимого діапазону значень.Dostępność: Unix, not WASI.
Большинство платформ Unix.
Dodane w wersji 3.3.
- socket.CMSG_SPACE(length)¶
Повертає розмір буфера, необхідний для
recvmsg()
для отримання елемента допоміжних даних із пов’язаними даними заданої довжини разом із будь-яким доповненням у кінці. Буферний простір, необхідний для отримання кількох елементів, є сумою значеньCMSG_SPACE()
для відповідної довжини даних. ВикликаєOverflowError
, якщо length виходить за межі допустимого діапазону значень.Note that some systems might support ancillary data without providing this function. Also note that setting the buffer size using the results of this function may not precisely limit the amount of ancillary data that can be received, since additional data may be able to fit into the padding area.
Dostępność: Unix, not WASI.
most Unix platforms.
Dodane w wersji 3.3.
- socket.getdefaulttimeout()¶
Повертає стандартний час очікування в секундах (float) для нових об’єктів сокета. Значення
None
вказує на те, що нові об’єкти сокета не мають часу очікування. Коли модуль сокета імпортовано вперше, за замовчуванням будеNone
.
- socket.setdefaulttimeout(timeout)¶
Встановіть стандартний час очікування в секундах (float) для нових об’єктів сокета. Коли модуль сокета імпортовано вперше, за замовчуванням буде
None
. Перегляньтеsettimeout()
можливі значення та їх відповідні значення.
- socket.sethostname(name)¶
Встановіть ім’я хоста машини на name. Це викличе
OSError
, якщо у вас недостатньо прав.Викликає подію аудиту
socket.sethostname
з аргументомname
.Dostępność: Unix, not Android.
Dodane w wersji 3.3.
- socket.if_nameindex()¶
Повертає список кортежів інформації про мережевий інтерфейс (index int, name string).
OSError
, якщо системний виклик не вдається.Dostępność: Unix, Windows, not WASI.
Dodane w wersji 3.3.
Zmienione w wersji 3.8: Додано підтримку Windows.
Informacja
On Windows network interfaces have different names in different contexts (all names are examples):
UUID:
{FB605B73-AAC2-49A6-9A2F-25416AEA0573}
name:
ethernet_32770
friendly name:
vEthernet (nat)
description:
Hyper-V Virtual Ethernet Adapter
Ця функція повертає імена другої форми зі списку,
ethernet_32770
у цьому прикладі.
- socket.if_nametoindex(if_name)¶
Return a network interface index number corresponding to an interface name.
OSError
if no interface with the given name exists.Dostępność: Unix, Windows, not WASI.
Dodane w wersji 3.3.
Zmienione w wersji 3.8: Додано підтримку Windows.
Zobacz także
„Назва інтерфейсу” — це назва, задокументована в
if_nameindex()
.
- socket.if_indextoname(if_index)¶
Return a network interface name corresponding to an interface index number.
OSError
if no interface with the given index exists.Dostępność: Unix, Windows, not WASI.
Dodane w wersji 3.3.
Zmienione w wersji 3.8: Додано підтримку Windows.
Zobacz także
„Назва інтерфейсу” — це назва, задокументована в
if_nameindex()
.
- socket.send_fds(sock, buffers, fds[, flags[, address]])¶
Отправьте список файловых дескрипторов fds через сокет
AF_UNIX
sock. Параметр fds представляет собой последовательность файловых дескрипторов. Обратитесь кsendmsg()
за документацией по этим параметрам.Dostępność: Unix, not WASI.
Платформы Unix, поддерживающие механизм
sendmsg()
иSCM_RIGHTS
.Dodane w wersji 3.9.
- socket.recv_fds(sock, bufsize, maxfds[, flags])¶
Получите до maxfds файловых дескрипторов из сокета
AF_UNIX
sock. Возврат(msg, list(fds), flags, addr)
. Обратитесь кrecvmsg()
для получения документации по этим параметрам.Dostępność: Unix, not WASI.
Unix platforms supporting
recvmsg()
andSCM_RIGHTS
mechanism.Dodane w wersji 3.9.
Informacja
Будь-які скорочені цілі числа в кінці списку дескрипторів файлів.
Socket Objects¶
Socket objects have the following methods. Except for
makefile()
, these correspond to Unix system calls applicable
to sockets.
Zmienione w wersji 3.2: Додано підтримку протоколу context manager. Вихід із контекстного менеджера еквівалентний виклику close()
.
- socket.accept()¶
Прийняти підключення. Сокет має бути прив’язаний до адреси та прослуховувати підключення. Поверненим значенням є пара
(conn, address)
, де conn — це новий об’єкт сокета, який можна використовувати для надсилання та отримання даних під час з’єднання, а address — це адреса, прив’язана до сокета на іншому кінець з’єднання.Новостворений сокет не успадковується.
Zmienione w wersji 3.4: Тепер сокет не успадковується.
Zmienione w wersji 3.5: If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising an
InterruptedError
exception (see PEP 475 for the rationale).
- socket.bind(address)¶
Bind the socket to address. The socket must not already be bound. (The format of address depends on the address family — see above.)
Викликає подію аудиту
socket.bind
з аргументамиself
,address
.Dostępność: not WASI.
- socket.close()¶
Mark the socket closed. The underlying system resource (e.g. a file descriptor) is also closed when all file objects from
makefile()
are closed. Once that happens, all future operations on the socket object will fail. The remote end will receive no more data (after queued data is flushed).Sockets are automatically closed when they are garbage-collected, but it is recommended to
close()
them explicitly, or to use awith
statement around them.Zmienione w wersji 3.6:
OSError
тепер викликається, якщо виникає помилка під час основного викликуclose()
.Informacja
close()
освобождает ресурс, связанный с соединением, но не обязательно немедленно закрывает соединение. Если вы хотите своевременно закрыть соединение, вызовитеshutdown()
передclose()
.
- socket.connect(address)¶
Підключіться до віддаленої розетки за адресою. (Формат адреси залежить від групи адрес — див. вище.)
Якщо з’єднання перервано сигналом, метод чекає, доки з’єднання не завершиться, або викликає
TimeoutError
після тайм-ауту, якщо обробник сигналу не викликає виключення, а сокет блокується або має тайм-аут. Для неблокуючих сокетів метод викликає винятокInterruptedError
, якщо з’єднання переривається сигналом (або винятком, викликаним обробником сигналу).Raises an auditing event
socket.connect
with argumentsself
,address
.Zmienione w wersji 3.5: Тепер метод очікує, доки з’єднання завершиться, замість того, щоб викликати виняток
InterruptedError
, якщо з’єднання перервано сигналом, обробник сигналу не викликає виключення, а сокет блокується або має тайм-аут (див. PEP 475 для обґрунтування).Dostępność: not WASI.
- socket.connect_ex(address)¶
Подібно до
connect(address)
, але повертає індикатор помилки замість виклику винятку для помилок, які повертає викликconnect()
рівня C (інші проблеми, такі як „хост не знайдено”, можуть все ще викликають винятки). Індикатор помилки –0
, якщо операція виконана успішно, інакше значення змінноїerrno
. Це корисно для підтримки, наприклад, асинхронних підключень.Raises an auditing event
socket.connect
with argumentsself
,address
.Dostępność: not WASI.
- socket.detach()¶
Переведіть об’єкт сокета в закритий стан, фактично не закриваючи базовий файловий дескриптор. Файловий дескриптор повертається, і його можна повторно використовувати для інших цілей.
Dodane w wersji 3.2.
- socket.dup()¶
Дублюйте розетку.
Новостворений сокет не успадковується.
Zmienione w wersji 3.4: Тепер сокет не успадковується.
Dostępność: not WASI.
- socket.fileno()¶
Return the socket’s file descriptor (a small integer), or -1 on failure. This is useful with
select.select()
.Under Windows the small integer returned by this method cannot be used where a file descriptor can be used (such as
os.fdopen()
). Unix does not have this limitation.
- socket.get_inheritable()¶
Отримайте inheritable flag дескриптора файлу сокета або дескриптора сокета:
True
, якщо сокет можна успадкувати в дочірніх процесах,False
, якщо це неможливо.Dodane w wersji 3.4.
- socket.getpeername()¶
Return the remote address to which the socket is connected. This is useful to find out the port number of a remote IPv4/v6 socket, for instance. (The format of the address returned depends on the address family — see above.) On some systems this function is not supported.
- socket.getsockname()¶
Повернути власну адресу сокета. Це корисно, наприклад, щоб дізнатися номер порту сокета IPv4/v6. (Формат адреси, що повертається, залежить від сімейства адрес — див. вище.)
- socket.getsockopt(level, optname[, buflen])¶
Return the value of the given socket option (see the Unix man page getsockopt(2)). The needed symbolic constants (SO_* etc.) are defined in this module. If buflen is absent, an integer option is assumed and its integer value is returned by the function. If buflen is present, it specifies the maximum length of the buffer used to receive the option in, and this buffer is returned as a bytes object. It is up to the caller to decode the contents of the buffer (see the optional built-in module
struct
for a way to decode C structures encoded as byte strings).Dostępność: not WASI.
- socket.getblocking()¶
Повертає
True
, якщо сокет знаходиться в режимі блокування,False
, якщо він не блокується.This is equivalent to checking
socket.gettimeout() != 0
.Dodane w wersji 3.7.
- socket.gettimeout()¶
Return the timeout in seconds (float) associated with socket operations, or
None
if no timeout is set. This reflects the last call tosetblocking()
orsettimeout()
.
- socket.ioctl(control, option)¶
- Platform:
Windows
Метод
ioctl()
є обмеженим інтерфейсом системного інтерфейсу WSAIoctl. Будь ласка, зверніться до документації Win32 для отримання додаткової інформації.On other platforms, the generic
fcntl.fcntl()
andfcntl.ioctl()
functions may be used; they accept a socket object as their first argument.Currently only the following control codes are supported:
SIO_RCVALL
,SIO_KEEPALIVE_VALS
, andSIO_LOOPBACK_FAST_PATH
.Zmienione w wersji 3.6:
SIO_LOOPBACK_FAST_PATH
було додано.
- socket.listen([backlog])¶
Увімкніть сервер для прийняття підключень. Якщо вказано backlog, воно має бути принаймні 0 (якщо менше, то встановлюється на 0); він визначає кількість неприйнятих підключень, які система дозволить перед тим, як відхилити нові підключення. Якщо не вказано, вибирається розумне значення за умовчанням.
Dostępność: not WASI.
Zmienione w wersji 3.5: The backlog parameter is now optional.
- socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)¶
Return a file object associated with the socket. The exact returned type depends on the arguments given to
makefile()
. These arguments are interpreted the same way as by the built-inopen()
function, except the only supported mode values are'r'
(default),'w'
,'b'
, or a combination of those.The socket must be in blocking mode; it can have a timeout, but the file object’s internal buffer may end up in an inconsistent state if a timeout occurs.
Закриття файлового об’єкта, який повертає
makefile()
, не закриє оригінальний сокет, якщо всі інші файлові об’єкти не закриті таsocket.close()
не викликано для об’єкта сокета.Informacja
У Windows файлоподібний об’єкт, створений
makefile()
, не можна використовувати там, де очікується файловий об’єкт із дескриптором файлу, наприклад аргументи потокуsubprocess.Popen()
.
- socket.recv(bufsize[, flags])¶
Получить данные из сокета. Возвращаемое значение — это байтовый объект, представляющий полученные данные. Максимальный объем данных, принимаемых за один раз, определяется bufsize. Возвращенный объект с пустыми байтами указывает на то, что клиент отключился. См. страницу руководства Unix recv(2), чтобы узнать значение необязательного аргумента flags; по умолчанию он равен нулю.
Zmienione w wersji 3.5: If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising an
InterruptedError
exception (see PEP 475 for the rationale).
- socket.recvfrom(bufsize[, flags])¶
Отримувати дані з розетки. Поверненим значенням є пара
(байти, адреса)
, де байт — об’єкт байтів, що представляє отримані дані, а адреса — адреса сокета, який надсилає дані. Перегляньте сторінку посібника Unix recv(2) для визначення значення необов’язкового аргументу flags; за замовчуванням він дорівнює нулю. (Формат адреси залежить від групи адрес — див. вище.)Zmienione w wersji 3.5: If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising an
InterruptedError
exception (see PEP 475 for the rationale).Zmienione w wersji 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 — це порозрядне АБО різних прапорів, що вказують на умови отриманого повідомлення; подробиці дивіться в системній документації. Якщо сокет-одержувач не підключений, адреса є адресою сокета-відправника, якщо він доступний; інакше його значення не вказано.В некоторых системах
sendmsg()
иrecvmsg()
могут использоваться для передачи дескрипторов файлов между процессами через сокетAF_UNIX
. Когда используется эта возможность (она часто ограничена сокетамиSOCK_STREAM
),recvmsg()
будет возвращать в своих вспомогательных данных элементы формы(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds )
, где fds — это объектbytes
, представляющий новые файловые дескрипторы в виде двоичного массива собственного типа C int. Еслиrecvmsg()
вызывает исключение после возврата системного вызова, он сначала попытается закрыть любые файловые дескрипторы, полученные через этот механизм.Some systems do not indicate the truncated length of ancillary data items which have been only partially received. If an item appears to extend beyond the end of the buffer,
recvmsg()
will issue aRuntimeWarning
, and will return the part of it which is inside the buffer provided it has not been truncated before the start of its associated data.On systems which support the
SCM_RIGHTS
mechanism, the following function will receive up to maxfds file descriptors, returning the message data and a list containing the descriptors (while ignoring unexpected conditions such as unrelated control messages being received). See alsosendmsg()
.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)
Dostępność: Unix.
Большинство платформ Unix.
Dodane w wersji 3.3.
Zmienione w wersji 3.5: If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising an
InterruptedError
exception (see PEP 475 for the rationale).
- 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 і адреса такі самі, як і дляrecvmsg()
.Przykład:
>>> 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---')]
Dostępność: Unix.
Большинство платформ Unix.
Dodane w wersji 3.3.
- socket.recvfrom_into(buffer[, nbytes[, flags]])¶
Receive data from the socket, writing it into buffer instead of creating a new bytestring. The return value is a pair
(nbytes, address)
where nbytes is the number of bytes received and address is the address of the socket sending the data. See the Unix manual page recv(2) for the meaning of the optional argument flags; it defaults to zero. (The format of address depends on the address family — see above.)
- socket.recv_into(buffer[, nbytes[, flags]])¶
Отримайте до nbytes байт із сокета, зберігаючи дані в буфері, а не створюючи новий рядок байтів. Якщо nbytes не вказано (або 0), отримати до розміру, доступного в даному буфері. Повертає кількість отриманих байтів. Перегляньте сторінку посібника Unix recv(2) для визначення значення необов’язкового аргументу flags; за замовчуванням він дорівнює нулю.
- socket.send(bytes[, flags])¶
Надіслати дані в сокет. Розетка повинна бути підключена до віддаленої розетки. Необов’язковий аргумент flags має те саме значення, що й для
recv()
вище. Повертає кількість надісланих байтів. Додатки відповідають за перевірку того, що всі дані були надіслані; якщо було передано лише частину даних, програма повинна спробувати доставити решту даних. Для отримання додаткової інформації з цієї теми зверніться до Socket Programming HOWTO.Zmienione w wersji 3.5: If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising an
InterruptedError
exception (see PEP 475 for the rationale).
- socket.sendall(bytes[, flags])¶
Send data to the socket. The socket must be connected to a remote socket. The optional flags argument has the same meaning as for
recv()
above. Unlikesend()
, this method continues to send data from bytes until either all data has been sent or an error occurs.None
is returned on success. On error, an exception is raised, and there is no way to determine how much data, if any, was successfully sent.Zmienione w wersji 3.5: The socket timeout is no longer reset each time data is sent successfully. The socket timeout is now the maximum total duration to send all data.
Zmienione w wersji 3.5: If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising an
InterruptedError
exception (see PEP 475 for the rationale).
- socket.sendto(bytes, address)¶
- socket.sendto(bytes, flags, address)
Send data to the socket. The socket should not be connected to a remote socket, since the destination socket is specified by address. The optional flags argument has the same meaning as for
recv()
above. Return the number of bytes sent. (The format of address depends on the address family — see above.)Викликає подію аудиту
socket.sendto
з аргументамиself
,address
.Zmienione w wersji 3.5: If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising an
InterruptedError
exception (see PEP 475 for the rationale).
- socket.sendmsg(buffers[, ancdata[, flags[, address]]])¶
Надсилайте звичайні та допоміжні дані в сокет, збираючи недопоміжні дані з ряду буферів і об’єднуючи їх в одне повідомлення. Аргумент buffers вказує на не допоміжні дані як ітерацію bytes-подібних об’єктів (наприклад,
bytes
об’єктів); операційна система може встановити обмеження (sysconf()
значенняSC_IOV_MAX
) на кількість буферів, які можна використовувати. Аргумент ancdata визначає допоміжні дані (керуючі повідомлення) як ітерацію з нуля або більше кортежів(cmsg_level, cmsg_type, cmsg_data)
, де cmsg_level і cmsg_type є цілими числами, що визначають рівень протоколу та протокол- певного типу відповідно, а cmsg_data — це байтиподібний об’єкт, що містить пов’язані дані. Зверніть увагу, що деякі системи (зокрема, системи безCMSG_SPACE()
) можуть підтримувати надсилання лише одного керуючого повідомлення на виклик. Аргумент flags за умовчанням дорівнює 0 і має те саме значення, що й дляsend()
. Якщо вказано address, а неNone
, це встановлює адресу призначення для повідомлення. Повернене значення — це кількість байтів надісланих непоміжних даних.The following function sends the list of file descriptors fds over an
AF_UNIX
socket, on systems which support theSCM_RIGHTS
mechanism. See alsorecvmsg()
.import socket, array def send_fds(sock, msg, fds): return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])
Dostępność: Unix, not WASI.
Большинство платформ Unix.
Raises an auditing event
socket.sendmsg
with argumentsself
,address
.Dodane w wersji 3.3.
Zmienione w wersji 3.5: If the system call is interrupted and the signal handler does not raise an exception, the method now retries the system call instead of raising an
InterruptedError
exception (see PEP 475 for the rationale).
- socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])¶
Specialized version of
sendmsg()
forAF_ALG
socket. Set mode, IV, AEAD associated data length and flags forAF_ALG
socket.Dostępność: Linux >= 2.6.38.
Dodane w wersji 3.6.
- socket.sendfile(file, offset=0, count=None)¶
Send a file until EOF is reached by using high-performance
os.sendfile
and return the total number of bytes which were sent. file must be a regular file object opened in binary mode. Ifos.sendfile
is not available (e.g. Windows) or file is not a regular filesend()
will be used instead. offset tells from where to start reading the file. If specified, count is the total number of bytes to transmit as opposed to sending the file until EOF is reached. File position is updated on return or also in case of error in which casefile.tell()
can be used to figure out the number of bytes which were sent. The socket must be ofSOCK_STREAM
type. Non-blocking sockets are not supported.Dodane w wersji 3.5.
- socket.set_inheritable(inheritable)¶
Set the inheritable flag of the socket’s file descriptor or socket’s handle.
Dodane w wersji 3.4.
- socket.setblocking(flag)¶
Встановіть блокуючий або неблокуючий режим сокета: якщо flag має значення false, сокет встановлено в неблокуючий режим, інакше в режим блокування.
This method is a shorthand for certain
settimeout()
calls:sock.setblocking(True)
is equivalent tosock.settimeout(None)
sock.setblocking(False)
еквівалентнийsock.settimeout(0.0)
Zmienione w wersji 3.7: Метод більше не застосовує прапор
SOCK_NONBLOCK
доsocket.type
.
- socket.settimeout(value)¶
Set a timeout on blocking socket operations. The value argument can be a nonnegative floating-point number expressing seconds, or
None
. If a non-zero value is given, subsequent socket operations will raise atimeout
exception if the timeout period value has elapsed before the operation has completed. If zero is given, the socket is put in non-blocking mode. IfNone
is given, the socket is put in blocking mode.Щоб отримати додаткову інформацію, зверніться до приміток щодо тайм-аутів сокетів.
Zmienione w wersji 3.7: Метод більше не вмикає прапор
SOCK_NONBLOCK
наsocket.type
.
- socket.setsockopt(level, optname, value: buffer)
- socket.setsockopt(level, optname, None, optlen: int)
Установите значение данной опции сокета (см. страницу руководства Unix setsockopt(2)). В этом модуле определены необходимые символические константы (SO_* и т. д. <socket-unix-constants>). Значение может быть целым числом, None или байтовым объектом, представляющим буфер. В последнем случае вызывающая сторона должна убедиться, что строка байтов содержит правильные биты (см. дополнительный встроенный модуль
struct
, чтобы узнать, как кодировать структуры C как строки байтов). Если для value установлено значение None, требуется аргумент optlen. Это эквивалентно вызову функции Csetsockopt()
сoptval=NULL
иoptlen=optlen
.Zmienione w wersji 3.5: Записуваний bytes-like object тепер приймається.
Zmienione w wersji 3.6: setsockopt(level, optname, None, optlen: int) form added.
Dostępność: not WASI.
- socket.shutdown(how)¶
Shut down one or both halves of the connection. If how is
SHUT_RD
, further receives are disallowed. If how isSHUT_WR
, further sends are disallowed. If how isSHUT_RDWR
, further sends and receives are disallowed.Dostępność: not WASI.
Duplicate a socket and prepare it for sharing with a target process. The target process must be provided with process_id. The resulting bytes object can then be passed to the target process using some form of interprocess communication and the socket can be recreated there using
fromshare()
. Once this method has been called, it is safe to close the socket since the operating system has already duplicated it for the target process.Dostępność: Windows.
Dodane w wersji 3.3.
Зверніть увагу, що немає методів read()
або write()
; замість цього використовуйте recv()
і send()
без аргументу flags.
Об’єкти Socket також мають ці атрибути (лише для читання), які відповідають значенням, наданим конструктору socket
.
- socket.family¶
The socket family.
- socket.type¶
Тип розетки.
- socket.proto¶
Протокол сокета.
Notes on socket timeouts¶
A socket object can be in one of three modes: blocking, non-blocking, or
timeout. Sockets are by default always created in blocking mode, but this
can be changed by calling setdefaulttimeout()
.
In blocking mode, operations block until complete or the system returns an error (such as connection timed out).
In non-blocking mode, operations fail (with an error that is unfortunately system-dependent) if they cannot be completed immediately: functions from the
select
module can be used to know when and whether a socket is available for reading or writing.In timeout mode, operations fail if they cannot be completed within the timeout specified for the socket (they raise a
timeout
exception) or if the system returns an error.
Informacja
At the operating system level, sockets in timeout mode are internally set
in non-blocking mode. Also, the blocking and timeout modes are shared between
file descriptors and socket objects that refer to the same network endpoint.
This implementation detail can have visible consequences if e.g. you decide
to use the fileno()
of a socket.
Час очікування та метод connect
¶
Операція connect()
також залежить від параметра тайм-ауту, і загалом рекомендується викликати settimeout()
перед викликом connect()
або передати параметр часу очікування для create_connection()
. Однак системний мережевий стек також може повертати власну помилку очікування підключення незалежно від будь-якого параметра часу очікування сокета Python.
Час очікування та метод accept
¶
Якщо getdefaulttimeout()
не None
, сокети, повернуті методом accept()
, успадковують цей час очікування. В іншому випадку поведінка залежить від налаштувань прослуховувального сокета:
if the listening socket is in blocking mode or in timeout mode, the socket returned by
accept()
is in blocking mode;якщо сокет, що прослуховує, знаходиться в неблокуючому режимі, чи є сокет, повернутий
accept()
у блокуючому чи неблокуючому режимі, залежить від операційної системи. Якщо ви хочете забезпечити кросплатформну поведінку, радимо вручну змінити це налаштування.
Przykład¶
Here are four minimal example programs using the TCP/IP protocol: a server that
echoes all data that it receives back (servicing only one client), and a client
using it. Note that a server must perform the sequence socket()
,
bind()
, listen()
, accept()
(possibly
repeating the accept()
to service more than one client), while a
client only needs the sequence socket()
, connect()
. Also
note that the server does not sendall()
/recv()
on
the socket it is listening on but on the new socket returned by
accept()
.
The first two examples support IPv4 only.
# 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))
The next two examples are identical to the above two, but support both IPv4 and IPv6. The server side will listen to the first address family available (it should listen to both instead). On most of IPv6-ready systems, IPv6 will take precedence and the server may not accept IPv4 traffic. The client side will try to connect to all the addresses returned as a result of the name resolution, and sends traffic to the first one connected successfully.
# 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)
After binding (CAN_RAW
) or connecting (CAN_BCM
) the socket, you
can use the socket.send()
and socket.recv()
operations (and
their counterparts) on the socket object as usual.
Цей останній приклад може вимагати спеціальних привілеїв:
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')
Running an example several times with too small delay between executions, could lead to this error:
Ошибка ОС: [Errno 98] Адрес уже используется
This is because the previous execution has left the socket in a TIME_WAIT
state, and can’t be immediately reused.
Чтобы предотвратить это, необходимо установить флаг 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))
the SO_REUSEADDR
flag tells the kernel to reuse a local socket in
TIME_WAIT
state, without waiting for its natural timeout to expire.
Zobacz także
For an introduction to socket programming (in C), see the following papers:
Вступний навчальний посібник із взаємодії між процесами 4.3BSD, Стюарт Сехрест
An Advanced 4.3BSD Interprocess Communication Tutorial, by Samuel J. Leffler et al,
both in the UNIX Programmer’s Manual, Supplementary Documents 1 (sections PS1:7 and PS1:8). The platform-specific reference material for the various socket-related system calls are also a valuable source of information on the details of socket semantics. For Unix, refer to the manual pages; for Windows, see the WinSock (or Winsock 2) specification. For IPv6-ready APIs, readers may want to refer to RFC 3493 titled Basic Socket Interface Extensions for IPv6.