socket — Интерфейс низкоуровневой сетевой работы
Исходный код: Lib/socket.py
Этот модуль предоставляет доступ к интерфейсу сокетов BSD. Он доступен на всех современных Unix-системах, Windows, macOS и, вероятно, на дополнительных платформах.
Примечание
Некоторые особенности могут зависеть от платформы, поскольку вызовы выполняются к API сокетов операционной системы.
Интерфейс Python представляет собой прямое преобразование интерфейса системных вызовов и библиотек Unix для сокетов в объектно-ориентированный стиль Python: функция socket() возвращает объект сокета, методы которого реализуют различные системные вызовы сокетов. Типы параметров несколько более высокого уровня, чем в C-интерфейсе: как и при операциях read() и write() с файлами Python, выделение буфера при приёме данных происходит автоматически, а длина буфера при отправке данных подразумевается неявно.
См. также
-
Modulesocketserver -
Классы, которые упрощают создание сетевых серверов.
-
Modulessl -
Обёртка TLS/SSL для объектов сокетов.
Семейства сокетов
В зависимости от системы и параметров сборки, этот модуль поддерживает различные семейства сокетов.
Формат адреса, необходимый для конкретного объекта сокета, автоматически выбирается на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представляются следующим образом:
-
Адрес сокета
AF_UNIX, связанного с узлом файловой системы, представляется строкой, используя кодировку файловой системы и обработчик ошибок'surrogateescape'(см. PEP 383). Адрес в абстрактном пространстве имён Linux возвращается как объект-последовательность байтов с начальным нулевым байтом; обратите внимание, что сокеты в этом пространстве имён могут взаимодействовать с обычными сокетами файловой системы, поэтому программам, предназначенным для работы в Linux, может потребоваться обработать оба типа адресов. Строка или объект-последовательность байтов могут использоваться для обоих типов адресов при их передаче в качестве аргумента.Изменено в версии 3.3: Ранее пути сокетов
AF_UNIXпредполагали кодировку UTF-8.Изменено в версии 3.5: Теперь принимается изменяемая объект-последовательность байтов.
-
Пара
(host, port)используется для семейства адресовAF_INET, где host — строка, представляющая либо имя хоста в обозначении интернет-домена, например,'daring.cwi.nl', либо IPv4-адрес, например,'100.50.200.5', а port — целое число.- Для IPv4-адресов принимаются две специальные формы вместо адреса хоста:
''представляетINADDR_ANY, что используется для привязки ко всем интерфейсам, а строка'<broadcast>'представляетINADDR_BROADCAST. Это поведение несовместимо с IPv6, поэтому, если вы планируете поддержку IPv6 в своих программах Python, следует избегать этих форм.
- Для IPv4-адресов принимаются две специальные формы вместо адреса хоста:
-
Для семейства адресов
AF_INET6используется четвёрка(host, port, flowinfo, scope_id), где flowinfo и scope_id представляют членыsin6_flowinfoиsin6_scope_idвstruct sockaddr_in6в C. Для методов модуляsocketflowinfo и scope_id могут быть опущены для обратной совместимости. Однако следует отметить, что опускание scope_id может вызвать проблемы при манипулировании адресами IPv6 с областью действия.Изменено в версии 3.7: Для адресов мультивещания (с имеющим значением scope_id) часть address может не содержать
%scope_id(илиzone id). Эта информация избыточна и может быть безопасно опущена (рекомендуется). -
AF_NETLINKсокеты представляются как пары(pid, groups). -
Поддержка TIPC (только для Linux) доступна с использованием семейства адресов
AF_TIPC. TIPC — это открытый протокол сети, не основанный на IP, разработанный для использования в кластерных компьютерных средах. Адреса представляются кортежем, а поля зависят от типа адреса. Общий вид кортежа —(addr_type, v1, v2, v3 [, scope]), где:-
addr_type — один из
TIPC_ADDR_NAMESEQ,TIPC_ADDR_NAME, илиTIPC_ADDR_ID. -
scope — один из
TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPE, иTIPC_NODE_SCOPE. -
Если addr_type равен
TIPC_ADDR_NAME, то v1 — тип сервера, v2 — идентификатор порта, а v3 должно быть равно 0.Если addr_type равен
TIPC_ADDR_NAMESEQ, то v1 — тип сервера, v2 — меньший номер порта, а v3 — больший номер порта.Если addr_type равен
TIPC_ADDR_ID, то v1 — узел, v2 — ссылка, а v3 должно быть равно 0.
-
addr_type — один из
-
Кортеж
(interface, )используется для семейства адресовAF_CAN, где interface — строка, представляющая имя сетевого интерфейса, например,'can0'. Имя сетевого интерфейса''можно использовать для получения пакетов со всех сетевых интерфейсов этого семейства.-
Протокол
CAN_ISOTPтребует кортеж(interface, rx_addr, tx_addr), где оба дополнительных параметра являются целыми числами без знака типа unsigned long, представляющими идентификатор CAN (стандартный или расширенный). -
Протокол
CAN_J1939требует кортеж(interface, name, pgn, addr), где дополнительные параметры — 64-битное целое число без знака, представляющее имя ECU, 32-битное целое число без знака, представляющее номер группы параметров (PGN), и 8-битное целое число, представляющее адрес.
-
Протокол
-
Строка или кортеж
(id, unit)используются для протоколаSYSPROTO_CONTROLсемействаPF_SYSTEM. Строка — имя ядра управления с динамически назначенным идентификатором. Кортеж может быть использован, если известны идентификатор и номер устройства ядра управления, или если используется зарегистрированный идентификатор.Добавлено в версии 3.3.
-
AF_BLUETOOTHподдерживает следующие протоколы и форматы адресов:-
BTPROTO_L2CAPпринимает(bdaddr, psm), гдеbdaddr— адрес Bluetooth в виде строки, аpsm— целое число. -
BTPROTO_RFCOMMпринимает(bdaddr, channel), гдеbdaddr— адрес Bluetooth в виде строки, аchannel— целое число. -
BTPROTO_HCIпринимает(device_id,), гдеdevice_id— либо целое число, либо строка с адресом Bluetooth интерфейса. (Это зависит от вашей ОС; NetBSD и DragonFlyBSD ожидают адрес Bluetooth, а всё остальное — целое число.)Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.
-
BTPROTO_SCOпринимаетbdaddr, гдеbdaddr— объектbytes, содержащий адрес Bluetooth в формате строки. (например,b'12:23:34:45:56:67'). Этот протокол не поддерживается в FreeBSD.
-
-
AF_ALG— интерфейс сокетов (только для Linux) для доступа к криптографии ядра. Сокет алгоритма настраивается с кортежем из двух до четырёх элементов(type, name [, feat [, mask]]), где:-
type — тип алгоритма как строка, например,
aead,hash,skcipherилиrng. -
name — имя алгоритма и режим работы как строка, например,
sha256,hmac(sha256),cbc(aes)илиdrbg_nopr_ctr_aes256. - feat и mask — 32-битные целые числа без знака.
Доступность: Linux 2.6.38, некоторые типы алгоритмов требуют более новых ядер.
Добавлено в версии 3.6.
-
type — тип алгоритма как строка, например,
-
AF_VSOCKпозволяет осуществлять взаимодействие между виртуальными машинами и их хостами. Сокеты представляются как кортеж(CID, port), где идентификатор контекста или CID и порт — целые числа.Доступность: Linux >= 4.8 QEMU >= 2.8 ESX >= 4.0 ESX Workstation >= 6.5.
Добавлено в версии 3.7.
-
AF_PACKET— низкоуровневый интерфейс к сетевым устройствам. Пакеты представлены кортежем(ifname, proto[, pkttype[, hatype[, addr]]]), где:- ifname — строка, определяющая имя устройства.
- proto — целое число в сетевом порядке байтов, определяющее номер протокола Ethernet.
-
pkttype — необязательное целое число, определяющее тип пакета:
-
PACKET_HOST(по умолчанию) — пакет, адресованный локальному хосту. -
PACKET_BROADCAST— пакет широковещательной передачи физического уровня. -
PACKET_MULTIHOST— пакет, отправленный на физический многоадресную группу. -
PACKET_OTHERHOST— пакет, отправленный другому хосту, пойманный драйвером устройства в режиме прослушивания. -
PACKET_OUTGOING— пакет, исходящий от локального хоста, который циклически возвращается в сокет пакета.
-
- hatype — необязательное целое число, определяющее тип адреса аппаратного ARP.
- addr — необязательный объект типа bytes-like, определяющий физический адрес аппаратного обеспечения, чья интерпретация зависит от устройства.
Доступность: Linux >= 2.2.
-
AF_QIPCRTR— интерфейс сокетов (только для Linux) для взаимодействия с сервисами, выполняемыми на сопроцессорах в платформах Qualcomm. Семейство адресов представлено кортежем(node, port)где node и port — неотрицательные целые числа.Доступность: Linux >= 4.7.
Добавлено в версии 3.8.
-
IPPROTO_UDPLITE— вариант UDP, который позволяет указать, какая часть пакета покрыта контрольной суммой. Он добавляет два параметра сокета, которые можно изменить.self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)изменит, какая часть исходящих пакетов покрыта контрольной суммой, аself.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)отфильтрует пакеты, которые покрывают слишком малую часть своих данных. В обоих случаяхlengthдолжен быть в форматеrange(8, 2**16, 8).Такой сокет должен быть создан с помощью
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)для IPv4 илиsocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)для IPv6.Доступность: Linux >= 2.6.20, FreeBSD >= 10.1-RELEASE
Добавлено в версии 3.9.
Если вы используете имя хоста в части host адреса сокета IPv4/v6, программа может показать недетерминированное поведение, так как Python использует первый адрес, возвращённый при разрешении DNS. Адрес сокета будет разрешён по-разному в фактический адрес IPv4/v6, в зависимости от результатов разрешения DNS и/или конфигурации хоста. Для детерминированного поведения используйте числовой адрес в части host.
Все ошибки вызывают исключения. Могут быть вызваны стандартные исключения для недопустимых типов аргументов и ситуаций с недостатком памяти. Ошибки, связанные с семантикой сокета или адреса, вызывают OSError или один из его подклассов.
Поддерживается режим без блокировки через setblocking(). Обобщение этого, основанное на тайм-аутах, поддерживается через settimeout().
Содержание модуля
Модуль socket экспортирует следующие элементы.
Исключения
-
exception socket.error -
Устаревший псевдоним
OSError.
-
exception socket.herror -
Подкласс
OSError, это исключение возникает при ошибках, связанных с адресами, т.е. для функций, использующих h_errno в POSIX C API, включаяgethostbyname_ex()иgethostbyaddr(). Сопутствующее значение — пара(h_errno, string), представляющая ошибку, возвращённую вызовом библиотечной функции. h_errno — числовое значение, а string представляет описание h_errno, как возвращает функцияhstrerror()C.Изменено в версии 3.3: Этот класс стал подклассом
OSError.
-
exception socket.gaierror -
Подкласс
OSError, это исключение возникает при ошибках, связанных с адресами, которые генерируютсяgetaddrinfo()иgetnameinfo(). Сопутствующее значение — пара(error, string), представляющая ошибку, возвращённую вызовом библиотечной функции. string представляет описание error, как возвращает функцияgai_strerror()C. Числовое значение error соответствует одному из значений константEAI_*, определённых в этом модуле.Изменено в версии 3.3: Этот класс стал подклассом
OSError.
-
exception socket.timeout -
Устаревший псевдоним
TimeoutError.Подкласс
OSError, это исключение возникает, когда истекает таймаут на сокете, для которого были включены таймауты посредством предварительного вызоваsettimeout()(или неявно черезsetdefaulttimeout()). Сопутствующее значение — строка, значение которой в настоящее время всегда равно “timed out”.Изменено в версии 3.3: Этот класс стал подклассом
OSError.Изменено в версии 3.10: Этот класс стал псевдонимом
TimeoutError.
Константы
Константы AF_* и SOCK_* теперь являются AddressFamily и SocketKind коллекциями IntEnum.
Введено в версии 3.4.
-
socket.AF_UNIX -
socket.AF_INET -
socket.AF_INET6 -
Эти константы представляют семейства адресов (и протоколов), используемые в качестве первого аргумента для
socket(). Если константаAF_UNIXне определена, то данный протокол не поддерживается. В зависимости от системы могут быть доступны и другие константы.
-
socket.SOCK_STREAM -
socket.SOCK_DGRAM -
socket.SOCK_RAW -
socket.SOCK_RDM -
socket.SOCK_SEQPACKET -
Эти константы представляют типы сокетов, используемые в качестве второго аргумента для
socket(). В зависимости от системы могут быть доступны и другие константы. (ТолькоSOCK_STREAMиSOCK_DGRAMкажутся общеполезными.)
-
socket.SOCK_CLOEXEC -
socket.SOCK_NONBLOCK -
Эти две константы, если определены, могут быть объединены с типами сокетов, что позволяет атомарно установить некоторые флаги (тем самым избегая возможных гонок и необходимости отдельных вызовов).
См. также
Обработка безопасных дескрипторов файлов для более подробного объяснения.
Доступность: Linux >= 2.6.27.
Введено в версии 3.2.
-
SO_* -
socket.SOMAXCONN -
MSG_* -
SOL_* -
SCM_* -
IPPROTO_* -
IPPORT_* -
INADDR_* -
IP_* -
IPV6_* -
EAI_* -
AI_* -
NI_* -
TCP_* -
Многие константы таких форм, описанные в документации Unix по сокетам и/или протоколу IP, также определены в модуле socket. Они обычно используются в аргументах к методам
setsockopt()иgetsockopt()объектов сокета. В большинстве случаев определяются только те символы, которые определены в заголовочных файлах Unix; для некоторых символов предоставляются значения по умолчанию.Изменено в версии 3.6:
SO_DOMAIN,SO_PROTOCOL,SO_PEERSEC,SO_PASSSEC,TCP_USER_TIMEOUT,TCP_CONGESTIONбыли добавлены.Изменено в версии 3.6.5: В Windows,
TCP_FASTOPEN,TCP_KEEPCNTпоявляются, если Windows поддерживается во время выполнения.Изменено в версии 3.7:
TCP_NOTSENT_LOWATбыл добавлен.В Windows,
TCP_KEEPIDLE,TCP_KEEPINTVLпоявляются, если Windows поддерживается во время выполнения.Изменено в версии 3.10:
IP_RECVTOSбыл добавлен. ДобавленTCP_KEEPALIVE. В MacOS эта константа может использоваться так же, какTCP_KEEPIDLEиспользуется в Linux.
-
socket.AF_CAN -
socket.PF_CAN -
SOL_CAN_* -
CAN_* -
Многие константы таких форм, описанные в документации Linux, также определены в модуле socket.
Доступность: Linux >= 2.6.25.
Введено в версии 3.3.
-
socket.CAN_BCM -
CAN_BCM_* -
CAN_BCM в семействе протоколов CAN — это протокол менеджера широковещательной рассылки (BCM). Константы менеджера широковещательной рассылки, описанные в документации Linux, также определены в модуле socket.
Доступность: Linux >= 2.6.25.
Примечание
Флаг
CAN_BCM_CAN_FD_FRAMEдоступен только в Linux >= 4.8.Введено в версии 3.4.
-
socket.CAN_RAW_FD_FRAMES -
Включает поддержку CAN FD в сокете CAN_RAW. По умолчанию отключено. Это позволяет вашему приложению отправлять как кадры CAN, так и CAN FD; однако, вы должны принимать как кадры CAN, так и CAN FD при чтении из сокета.
Эта константа описана в документации Linux.
Доступность: Linux >= 3.6.
Введено в версии 3.5.
-
socket.CAN_RAW_JOIN_FILTERS -
Присоединяется к применённым фильтрам CAN таким образом, что в пользовательское пространство передаются только кадры CAN, соответствующие всем заданным фильтрам CAN.
Эта константа описана в документации Linux.
Доступность: Linux >= 4.1.
Введено в версии 3.9.
-
socket.CAN_ISOTP -
CAN_ISOTP в семействе протоколов CAN — это протокол ISO-TP (ISO 15765-2). Константы ISO-TP, описанные в документации Linux.
Доступность: Linux >= 2.6.25.
Введено в версии 3.7.
-
socket.CAN_J1939 -
CAN_J1939 в семействе протоколов CAN — это протокол SAE J1939. Константы J1939, описанные в документации Linux.
Доступность: Linux >= 5.4.
Введено в версии 3.9.
-
socket.AF_PACKET -
socket.PF_PACKET -
PACKET_* -
Многие константы таких форм, описанные в документации Linux, также определены в модуле socket.
Доступность: Linux >= 2.2.
-
socket.AF_RDS -
socket.PF_RDS -
socket.SOL_RDS -
RDS_* -
Многие константы таких форм, описанные в документации Linux, также определены в модуле socket.
Доступность: Linux >= 2.6.30.
Введено в версии 3.3.
-
socket.SIO_RCVALL -
socket.SIO_KEEPALIVE_VALS -
socket.SIO_LOOPBACK_FAST_PATH -
RCVALL_* -
Константы для WSAIoctl() Windows. Константы используются в качестве аргументов к методу
ioctl()объектов сокета.Изменено в версии 3.6:
SIO_LOOPBACK_FAST_PATHбыл добавлен.
-
TIPC_* -
Связанные с TIPC константы, соответствующие экспортируемым C-сокетами API. Для получения дополнительной информации см. документацию TIPC.
-
socket.AF_ALG -
socket.SOL_ALG -
ALG_* -
Константы для криптографии ядра Linux.
Доступность: Linux >= 2.6.38.
Введено в версии 3.6.
-
socket.AF_VSOCK -
socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID -
VMADDR* -
SO_VM* -
Константы для межхостовой/межгостевой коммуникации в Linux.
Доступность: Linux >= 4.8.
Введено в версии 3.7.
-
socket.AF_LINK -
Доступность: BSD, macOS.
Новая в версии 3.4.
-
socket.has_ipv6 -
Это константа, содержащая булево значение, которое указывает, поддерживается ли IPv6 на данной платформе.
-
socket.BDADDR_ANY -
socket.BDADDR_LOCAL -
Это строковые константы, содержащие Bluetooth-адреса со специальными значениями. Например,
BDADDR_ANYможно использовать для указания любого адреса при указании сокета для привязки сBTPROTO_RFCOMM.
-
socket.HCI_FILTER -
socket.HCI_TIME_STAMP -
socket.HCI_DATA_DIR -
Для использования с
BTPROTO_HCI.HCI_FILTERнедоступен для NetBSD или DragonFlyBSD.HCI_TIME_STAMPиHCI_DATA_DIRнедоступны для FreeBSD, NetBSD или DragonFlyBSD.
-
socket.AF_QIPCRTR -
Константа для протокола маршрутизатора IPC Qualcomm, используемого для связи с сервисом, предоставляющим удалённые процессоры.
Доступность: Linux >= 4.7.
Функции
Создание сокетов
Следующие функции создают объекты сокетов.
-
class socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -
Создает новый сокет с указанным семейством адресов, типом сокета и номером протокола. Семейство адресов должно быть
AF_INET(по умолчанию),AF_INET6,AF_UNIX,AF_CAN,AF_PACKETилиAF_RDS. Тип сокета должен бытьSOCK_STREAM(по умолчанию),SOCK_DGRAM,SOCK_RAWили, возможно, одно из другихSOCK_констант. Номер протокола обычно равен нулю и может быть опущен или, в случае, если семейство адресов являетсяAF_CAN, протокол должен быть одним изCAN_RAW,CAN_BCM,CAN_ISOTPилиCAN_J1939.Если указан fileno, значения для family, type и proto автоматически обнаруживаются из указанного дескриптора файла. Автоматическое обнаружение можно переопределить, вызвав функцию с явными аргументами family, type или proto. Это влияет только на то, как Python представляет, например, возвращаемое значение
socket.getpeername(), но не на фактические системные ресурсы. В отличие отsocket.fromfd(), fileno вернет тот же сокет, а не дубликат. Это может помочь закрыть отсоединенный сокет с помощьюsocket.close().Новый созданный сокет является не наследуемым.
Вызывает событие аудита
socket.__new__с аргументамиself,family,type,protocol.Изменено в версии 3.3: Было добавлено семейство AF_CAN. Было добавлено семейство AF_RDS.
Изменено в версии 3.4: Добавлен протокол CAN_BCM.
Изменено в версии 3.4: Возвращаемый сокет теперь не наследуется.
Изменено в версии 3.7: Добавлен протокол CAN_ISOTP.
Изменено в версии 3.7: Когда битовые флаги
SOCK_NONBLOCKилиSOCK_CLOEXECприменяются к type, они сбрасываются, иsocket.typeне будет их отражать. Они всё равно передаются в базовое системноеsocket()вызов. Поэтому,sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK)по-прежнему создаст неблокирующий сокет в системах, поддерживающих
SOCK_NONBLOCK, ноsock.typeбудет установлено вsocket.SOCK_STREAM.Изменено в версии 3.9: Добавлен протокол CAN_J1939.
Изменено в версии 3.10: Добавлен протокол IPPROTO_MPTCP.
-
socket.socketpair([family[, type[, proto]]]) -
Создает пару соединенных объектов сокетов, используя указанное семейство адресов, тип сокета и номер протокола. Семейство адресов, тип сокета и номер протокола такие же, как для функции
socket()выше. По умолчанию семейство являетсяAF_UNIX, если оно определено в платформе; в противном случае по умолчанию являетсяAF_INET.Новорожденные сокеты являются не наследуемыми.
Изменено в версии 3.2: Возвращаемые объекты сокета теперь поддерживают весь API сокетов, а не его подмножество.
Изменено в версии 3.4: Возвращаемые сокеты теперь не наследуемые.
Изменено в версии 3.5: Добавлена поддержка Windows.
-
socket.create_connection(address[, timeout[, source_address]]) -
Подключается к TCP-сервису, слушающему на указанном адресе (кортеж из 2-х элементов
(host, port)), и возвращает объект сокета. Это функция более высокого уровня, чемsocket.connect(): если host является нечисловым именем хоста, он попытается разрешить его дляAF_INETиAF_INET6, а затем попытается подключиться ко всем возможным адресам по очереди до тех пор, пока подключение не будет установлено. Это упрощает создание клиентов, совместимых с IPv4 и IPv6.Передача необязательного параметра timeout установит тайм-аут для экземпляра сокета перед попыткой подключения. Если timeout не указан, используется глобальный параметр тайм-аута по умолчанию, возвращаемый
getdefaulttimeout().Если указан source_address, он должен быть кортежем из 2-х элементов
(host, port)для привязки сокета в качестве адреса источника перед подключением. Если хост или порт являются ‘’ или 0 соответственно, будет использоваться поведение по умолчанию операционной системы.Изменено в версии 3.2: Добавлен source_address.
-
socket.create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False) -
Функция-удобство, которая создает TCP-сокет, привязанный к адресу (кортеж из 2-х элементов
(host, port)) и возвращает объект сокета.family должно быть либо
AF_INET, либоAF_INET6. backlog — это размер очереди, переданный вsocket.listen(); если не указан, выбирается разумное значение по умолчанию. reuse_port определяет, нужно ли установить опцию сокетаSO_REUSEPORT.Если dualstack_ipv6 равно true и платформа его поддерживает, сокет сможет принимать как IPv4, так и IPv6 соединения, в противном случае будет вызвано исключение
ValueError. Большинство POSIX платформ и Windows должны поддерживать эту функциональность. Когда эта функциональность включена, адрес, возвращаемыйsocket.getpeername()при подключении IPv4, будет IPv6-адресом, представленным как IPv4-адрес, сопоставленный с IPv6-адресом. Если dualstack_ipv6 равно false, эта функциональность будет явно отключена на платформах, которые включают её по умолчанию (например, Linux). Этот параметр можно использовать совместно сhas_dualstack_ipv6():import socket addr = ("", 8080) # all interfaces, port 8080 if socket.has_dualstack_ipv6(): s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True) else: s = socket.create_server(addr)Примечание
В POSIX платформах опция сокета
SO_REUSEADDRустанавливается для немедленного повторного использования предыдущих сокетов, которые были привязаны к тому же адресу и оставались в состоянии TIME_WAIT.Новое в версии 3.8.
-
socket.has_dualstack_ipv6() -
Возвращает
True, если платформа поддерживает создание TCP-сокета, который может обрабатывать как IPv4, так и IPv6 соединения.Новое в версии 3.8.
-
socket.fromfd(fd, family, type, proto=0) -
Дублирует дескриптор файла fd (целое число, возвращаемое методом
fileno()объекта файла) и создает объект сокета из результата. Семейство адресов, тип сокета и номер протокола такие же, как для функцииsocket()выше. Дескриптор файла должен ссылаться на сокет, но это не проверяется — последующие операции с объектом могут завершиться ошибкой, если дескриптор файла недействителен. Эта функция редко необходима, но может использоваться для получения или установки параметров сокета для сокета, переданного программе как стандартный ввод или вывод (например, сервера, запущенного демоном inet Unix).Предполагается, что сокет находится в режиме блокировки.
Созданный сокет является не наследуемым.
Изменено в версии 3.4: Возвращаемый сокет теперь не наследуется.
-
Создать сокет из данных, полученных из метода
socket.share(). Предполагается, что сокет находится в режиме блокировки.Доступность: Windows.
Новая функция в версии 3.3.
-
socket.SocketType -
Это объект типа Python, представляющий тип объекта сокета. Он такой же, как
type(socket(...)).
Другие функции
Модуль socket также предоставляет различные сетевые сервисы:
-
socket.close(fd) -
Закрывает дескриптор файла сокета. Аналогично
os.close(), но для сокетов. На некоторых платформах (особенно Windows)os.close()не работает для дескрипторов файлов сокетов.Новая в версии 3.7.
-
socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) -
Преобразует аргумент host/port в последовательность 5-кортежей, содержащих все необходимые аргументы для создания сокета, подключенного к этой службе. host — это доменное имя, строковое представление IPv4/v6 адреса или
None. port — это имя службы, например,'http', числовой номер порта илиNone. ПередавNoneв качестве значения host и port, вы можете передатьNULLв лежащий в основе C API.Аргументы family, type и proto могут быть указаны для сужения списка возвращаемых адресов. Передача нуля в качестве значения каждого из этих аргументов выбирает весь диапазон результатов. Аргумент flags может быть одним или несколькими из констант
AI_*, и повлияет на то, как результаты будут вычислены и возвращены. Например,AI_NUMERICHOSTотключит разрешение доменных имён и выдаст ошибку, если host — это доменное имя.Функция возвращает список 5-кортежей со следующей структурой:
(family, type, proto, canonname, sockaddr)В этих кортежах family, type, proto — целые числа, которые предназначены для передачи функции
socket(). canonname будет строкой, представляющей каноническое имя host, еслиAI_CANONNAMEявляется частью аргумента flags; в противном случае canonname будет пустой строкой. sockaddr — это кортеж, описывающий адрес сокета, формат которого зависит от возвращенного family (кортеж из 2 элементов дляAF_INET, кортеж из 4 элементов дляAF_INET6), и предназначен для передачи методуsocket.connect().Вызывает событие аудита аудита
socket.getaddrinfoс аргументамиhost,port,family,type,protocol.Следующий пример извлекает информацию об адресе для гипотетического TCP-соединения с
example.orgна порте 80 (результаты могут отличаться на вашей системе, если IPv6 не включен):>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP) [(<AddressFamily.AF_INET6: 10>, <AddressFamily.SOCK_STREAM: 1>, 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)), (<AddressFamily.AF_INET: 2>, <AddressFamily.SOCK_STREAM: 1>, 6, '', ('93.184.216.34', 80))]Изменено в версии 3.2: параметры теперь можно передавать с помощью именованных аргументов.
Изменено в версии 3.7: для IPv6-мультиадресных адресов строка, представляющая адрес, не будет содержать часть
%scope_id.
-
socket.getfqdn([name]) -
Возвращает полное доменное имя для name. Если name опущено или пусто, оно интерпретируется как локальный хост. Для поиска полного имени проверяется имя хоста, возвращённое функцией
gethostbyaddr(), а затем алиасы хоста, если они доступны. Выбирается первое имя, которое включает точку. В случае, если полное доменное имя недоступно и name было предоставлено, оно возвращается без изменений. Если name было пустым или равно'0.0.0.0', возвращается имя хоста изgethostname().
-
socket.gethostbyname(hostname) -
Преобразует имя хоста в формат IPv4-адреса. IPv4-адрес возвращается как строка, например,
'100.50.200.5'. Если имя хоста — это сам IPv4-адрес, он возвращается без изменений. См.gethostbyname_ex()для более полного интерфейса.gethostbyname()не поддерживает разрешение имён IPv6, и для поддержки IPv4/v6 следует использоватьgetaddrinfo().Вызывает событие аудита аудита
socket.gethostbynameс аргументомhostname.
-
socket.gethostbyname_ex(hostname) -
Преобразует имя хоста в формат IPv4-адреса, расширенный интерфейс. Возвращает тройку
(hostname, aliaslist, ipaddrlist)где hostname — основное имя хоста, aliaslist — (возможно пустой) список альтернативных имён хоста для одного и того же адреса, а ipaddrlist — список IPv4-адресов для одного и того же интерфейса на одном и том же хосте (часто, но не всегда, один адрес). Для поиска полного доменного имени используйте функциюgetfqdn().gethostbyname_ex()не поддерживает разрешение имён IPv6, и для поддержки IPv4/v6 следует использоватьgetaddrinfo().Вызывает событие аудита аудита
socket.gethostbynameс аргументомhostname.
-
socket.gethostname() -
Возвращает строку, содержащую имя хоста машины, на которой в настоящее время выполняется интерпретатор Python.
Вызывает событие аудита аудита
socket.gethostnameбез аргументов.Примечание:
gethostname()не всегда возвращает полное доменное имя; для этого используйтеgetfqdn().
-
socket.gethostbyaddr(ip_address) -
Возвращает тройку
(hostname, aliaslist, ipaddrlist)где hostname — основное имя хоста, отвечающего на указанный ip_address, aliaslist — (возможно пустой) список альтернативных имён хоста для одного и того же адреса, а ipaddrlist — список IPv4/v6 адресов для одного и того же интерфейса на одном и том же хосте (вероятно, содержащий только один адрес). Для поиска полного доменного имени используйте функциюgetfqdn().gethostbyaddr()поддерживает IPv4 и IPv6.Вызывает событие аудита аудита
socket.gethostbyaddrс аргументомip_address.
-
socket.getnameinfo(sockaddr, flags) -
Преобразует адрес сокета sockaddr в 2-кортеж
(host, port). В зависимости от настроек flags, результат может содержать полное доменное имя или числовое представление адреса в host. Аналогично, port может содержать имя порта в виде строки или числовой номер порта.Для IPv6-адресов
%scope_idдобавляется к части host, если sockaddr содержит значимый scope_id. Обычно это происходит для мультиадресных адресов.Дополнительную информацию об flags можно найти в getnameinfo(3).
Вызывает событие аудита аудита
socket.getnameinfoс аргументомsockaddr.
-
socket.getprotobyname(protocolname) -
Преобразует имя интернет-протокола (например,
'icmp') в константу, подходящую для передачи в качестве (необязательного) третьего аргумента функцииsocket(). Это обычно необходимо только для сокетов, открытых в «сыром» режиме (SOCK_RAW); для обычных режимов сокетов правильный протокол выбирается автоматически, если протокол опущен или равен нулю.
-
socket.getservbyname(servicename[, protocolname]) -
Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если задано, должно быть
'tcp'или'udp', в противном случае будет соответствовать любой протокол.Вызывает событие аудита аудита
socket.getservbynameс аргументамиservicename,protocolname.
-
socket.getservbyport(port[, protocolname]) -
Преобразует номер порта интернет-службы и имя протокола в имя службы для этой службы. Необязательное имя протокола, если задано, должно быть
'tcp'или'udp', в противном случае будет соответствовать любой протокол.Вызывает событие аудита аудита
socket.getservbyportс аргументамиport,protocolname.
-
socket.ntohl(x) -
Преобразует 32-битные целые числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком, это бесполезная операция; в противном случае выполняется операция перестановки 4 байтов.
-
socket.ntohs(x) -
Преобразовать 16-битные целые положительные числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком, эта функция ничего не делает; в противном случае она выполняет обмен двумя байтами.
Изменено в версии 3.10: Вызывает
OverflowError, если x не помещается в 16-битное беззнаковое целое число.
-
socket.htonl(x) -
Преобразовать 32-битные целые положительные числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком, эта функция ничего не делает; в противном случае она выполняет обмен четырьмя байтами.
-
socket.htons(x) -
Преобразовать 16-битные целые положительные числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком, эта функция ничего не делает; в противном случае она выполняет обмен двумя байтами.
Изменено в версии 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 dual stack.
-
socket.inet_ntoa(packed_ip) -
Преобразовать 32-битный упакованный IPv4-адрес (объект типа bytes длиной четыре байта) в его стандартное строковое представление «точка-тире» (например, '123.45.67.89'). Это полезно при общении с программой, использующей стандартную библиотеку C и требующей объекты типа
in_addr, который является типом C для 32-битных упакованных двоичных данных, которые принимает эта функция.Если последовательность байтов, переданная в эту функцию, не имеет длины ровно 4 байта, будет вызвано исключение
OSError.inet_ntoa()не поддерживает IPv6, и вместо него следует использоватьinet_ntop()для поддержки IPv4/v6 dual stack.Изменено в версии 3.5: Теперь принимается записываемый объект типа bytes-like.
-
socket.inet_pton(address_family, ip_string) -
Преобразовать IP-адрес из его семейно-специфического строкового формата в упакованный двоичный формат.
inet_pton()полезно, когда библиотека или сетевой протокол требуют объекта типаin_addr(аналогичноinet_aton()) илиin6_addr.Поддерживаемые значения для address_family —
AF_INETиAF_INET6. Если строка IP-адреса ip_string некорректна, будет вызвано исключениеOSError. Обратите внимание, что точное определение корректности зависит как от значения address_family, так и от реализацииinet_pton().Доступность: Unix (возможно, не на всех платформах), Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
-
socket.inet_ntop(address_family, packed_ip) -
Преобразовать упакованный IP-адрес (объект типа bytes определенной длины) в его стандартное семейно-специфическое строковое представление (например,
'7.10.0.5'или'5aef:2b::8').inet_ntop()полезно, когда библиотека или сетевой протокол возвращает объект типаin_addr(аналогичноinet_ntoa()) илиin6_addr.Поддерживаемые значения для address_family —
AF_INETиAF_INET6. Если объект типа bytes packed_ip имеет неправильную длину для указанного семейства адресов, будет вызвано исключениеValueError.OSErrorвызывается при ошибках в вызовеinet_ntop().Доступность: Unix (возможно, не на всех платформах), Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
Изменено в версии 3.5: Теперь принимается записываемый объект типа bytes-like.
-
socket.CMSG_LEN(length) -
Возвращает общую длину дополнительного элемента данных без последующего заполнения с заданной длиной length. Это значение часто может использоваться в качестве размера буфера для
recvmsg()для приема одного элемента дополнительных данных, но RFC 3542 требует от приложений обеспечить совместимость с использованиемCMSG_SPACE()и, следовательно, включать место для заполнения, даже когда элемент является последним в буфере. ВызываетOverflowError, если length выходит за допустимый диапазон значений.Доступность: большинство платформ Unix, возможно, другие.
Введено в версии 3.3.
-
socket.CMSG_SPACE(length) -
Возвращает размер буфера, необходимый для
recvmsg()для приема элемента дополнительных данных с заданной длиной length, включая любое последующее заполнение. Необходимый размер буфера для приема нескольких элементов — сумма значенийCMSG_SPACE()для длин их связанных данных. ВызываетOverflowError, если length выходит за допустимый диапазон значений.Обратите внимание, что некоторые системы могут поддерживать дополнительные данные без предоставления этой функции. Также обратите внимание, что установка размера буфера с использованием результатов этой функции может не точно ограничивать количество принимаемых дополнительных данных, поскольку дополнительные данные могут уместиться в области заполнения.
Доступность: большинство платформ Unix, возможно, другие.
Введено в версии 3.3.
-
socket.getdefaulttimeout() -
Возвращает значение таймаута по умолчанию в секундах (вещественное число) для новых объектов сокета. Значение
Noneуказывает, что новые объекты сокета не имеют таймаута. При первом импорте модуля socket значение по умолчанию равноNone.
-
socket.setdefaulttimeout(timeout) -
Устанавливает значение таймаута по умолчанию в секундах (вещественное число) для новых объектов сокета. При первом импорте модуля socket значение по умолчанию равно
None. См.settimeout()для возможных значений и их значений.
-
socket.sethostname(name) -
Установите имя узла компьютера на name. Это вызовет
OSError, если у вас недостаточно прав.Вызывает событие аудита аудита
socket.sethostnameс аргументомname.Доступность: Unix.
Новое в версии 3.3.
-
socket.if_nameindex() -
Возвращает список кортежей информации о сетевом интерфейсе (индекс int, имя строки).
OSError, если системный вызов завершился неудачно.Доступность: Unix, Windows.
Новое в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
Примечание
В Windows имена сетевых интерфейсов отличаются в разных контекстах (все имена — примеры):
- UUID:
{FB605B73-AAC2-49A6-9A2F-25416AEA0573} - имя:
ethernet_32770 - дружественное имя:
vEthernet (nat) - описание:
Hyper-V Virtual Ethernet Adapter
Эта функция возвращает имена второго типа из списка,
ethernet_32770в этом примере. - UUID:
-
socket.if_nametoindex(if_name) -
Возвращает номер индекса сетевого интерфейса, соответствующий имени интерфейса.
OSError, если интерфейса с данным именем не существует.Доступность: Unix, Windows.
Новое в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
См. также
«Имя интерфейса» — это имя, как описано в
if_nameindex().
-
socket.if_indextoname(if_index) -
Возвращает имя сетевого интерфейса, соответствующее номеру индекса интерфейса.
OSError, если интерфейса с данным индексом не существует.Доступность: Unix, Windows.
Новое в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
См. также
«Имя интерфейса» — это имя, как описано в
if_nameindex().
-
socket.send_fds(sock, buffers, fds[, flags[, address]]) -
Отправляет список дескрипторов файлов fds по сокету
AF_UNIXsock. Параметр fds — последовательность дескрипторов файлов. Обратитесь кsendmsg()для получения документации по этим параметрам.Доступность: Unix, поддерживающий
sendmsg()иSCM_RIGHTSмеханизм.Новое в версии 3.9.
-
socket.recv_fds(sock, bufsize, maxfds[, flags]) -
Получает до maxfds дескрипторов файлов из сокета
AF_UNIXsock. Возвращает(msg, list(fds), flags, addr). Обратитесь кrecvmsg()для получения документации по этим параметрам.Доступность: Unix, поддерживающий
recvmsg()иSCM_RIGHTSмеханизм.Новое в версии 3.9.
Примечание
Любые обрезаемые целые числа в конце списка дескрипторов файлов.
Объекты сокетов
Объекты сокетов имеют следующие методы. За исключением makefile(), они соответствуют системным вызовам Unix, применимым к сокетам.
Изменено в версии 3.2: Добавлена поддержка протокола менеджера контекста. Выход из менеджера контекста эквивалентен вызову close().
-
socket.accept() -
Принять подключение. Сокет должен быть привязан к адресу и ожидать подключений. Возвращаемое значение — пара
(conn, address), где conn — новый объект сокета, используемый для отправки и получения данных по подключению, а address — адрес, привязанный к сокету на другом конце подключения.Новый созданный сокет не наследуется.
Изменено в версии 3.4: Теперь сокет не наследуется.
Изменено в версии 3.5: Если системный вызов прерван и обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо того, чтобы поднимать исключение
InterruptedError(см. PEP 475 для обоснования).
-
socket.bind(address) -
Привязать сокет к address. Сокет не должен быть уже привязан. (Формат address зависит от семейства адресов — см. выше.)
Вызывает событие аудита аудита
socket.bindс аргументамиself,address.
-
socket.close() -
Отметить сокет как закрытый. Базовый системный ресурс (например, дескриптор файла) также закрывается, когда все файловые объекты из
makefile()закрыты. После этого все последующие операции с объектом сокета завершатся ошибкой. Удаленный конец не будет получать больше данных (после очистки очереди данных).Сокеты автоматически закрываются при сборке мусора, но рекомендуется закрывать их явно или использовать оператор
withвокруг них.Изменено в версии 3.6:
OSErrorтеперь генерируется, если при выполнении базового вызоваclose()возникает ошибка.Примечание
close()освобождает ресурс, связанный с подключением, но не обязательно закрывает подключение немедленно. Если вы хотите закрыть подключение своевременно, вызовитеshutdown()передclose().
-
socket.connect(address) -
Подключиться к удаленному сокету по адресу address. (Формат address зависит от семейства адресов — см. выше.)
Если подключение прервано сигналом, метод ожидает завершения подключения или генерирует
TimeoutErrorпри превышении времени ожидания, если обработчик сигнала не генерирует исключение, а сокет блокируется или имеет тайм-аут. Для сокетов без блокировки метод генерирует исключениеInterruptedError, если подключение прерывается сигналом (или исключение, сгенерированное обработчиком сигнала).Вызывает событие аудита аудита
socket.connectс аргументамиself,address.Изменено в версии 3.5: Метод теперь ожидает завершения подключения вместо того, чтобы генерировать исключение
InterruptedError, если подключение прерывается сигналом, обработчик сигнала не генерирует исключение и сокет блокируется или имеет тайм-аут (см. PEP 475 для обоснования).
-
socket.connect_ex(address) -
Подобно
connect(address), но возвращает индикатор ошибки вместо того, чтобы генерировать исключение для ошибок, возвращаемых системным вызовомconnect()(другие проблемы, такие как «хост не найден», все еще могут генерировать исключения). Индикатор ошибки —0, если операция прошла успешно, в противном случае — значение переменнойerrno. Это полезно, например, для поддержки асинхронных подключений.Вызывает событие аудита аудита
socket.connectс аргументамиself,address.
-
socket.detach() -
Перевести объект сокета в состояние закрытия без фактического закрытия базового дескриптора файла. Дескриптор файла возвращается и может быть повторно использован для других целей.
Добавлена в версии 3.2.
-
socket.dup() -
Дублировать сокет.
Новый созданный сокет не наследуется.
Изменено в версии 3.4: Теперь сокет не наследуется.
-
socket.fileno() -
Возвращает дескриптор файла сокета (маленькое целое число) или -1 при ошибке. Это полезно при работе с
select.select().В Windows возвращаемое этим методом малое целое число нельзя использовать там, где можно использовать дескриптор файла (например,
os.fdopen()). Unix не имеет этого ограничения.
-
socket.get_inheritable() -
Получить флаг наследуемости дескриптора файла сокета или дескриптора ресурса:
True, если сокет может наследоватья дочерними процессами,False, если нет.Добавлена в версии 3.4.
-
socket.getpeername() -
Возвращает удаленный адрес, к которому подключен сокет. Это полезно, например, для определения номера порта удаленного IPv4/v6 сокета. (Формат возвращаемого адреса зависит от семейства адресов — см. выше.) На некоторых системах эта функция не поддерживается.
-
socket.getsockname() -
Возвращает собственный адрес сокета. Это полезно, например, для определения номера порта IPv4/v6 сокета. (Формат возвращаемого адреса зависит от семейства адресов — см. выше.)
-
socket.getsockopt(level, optname[, buflen]) -
Возвращает значение заданного параметра сокета (см. страницу Unix man getsockopt(2)). Необходимые символические константы (
SO_*и т.д.) определены в этом модуле. Если buflen отсутствует, предполагается целочисленный параметр, и его целочисленное значение возвращается функцией. Если buflen присутствует, он задаёт максимальную длину буфера, используемого для получения параметра, и этот буфер возвращается как объект bytes. От вызывающей стороны требуется декодирование содержимого буфера (см. необязательный встроенный модульstructдля способа декодирования C-структур, закодированных как строки байтов).
-
socket.getblocking() -
Возвращает
Trueесли сокет в режиме блокировки,Falseесли в режиме без блокировки.Это эквивалентно проверке
socket.gettimeout() == 0.Добавлена в версии 3.7.
-
socket.gettimeout() -
Возвращает тайм-аут в секундах (вещественное число) для операций с сокетом, или
None, если тайм-аут не установлен. Это отражает последний вызовsetblocking()илиsettimeout().
-
socket.ioctl(control, option) -
- Платформа
-
Windows
Метод
ioctl()— это ограниченный интерфейс к системному интерфейсу WSAIoctl. Для получения дополнительной информации обратитесь к документации Win32.На других платформах можно использовать общие функции
fcntl.fcntl()иfcntl.ioctl(); они принимают объект сокета в качестве первого аргумента.В настоящее время поддерживаются только следующие коды управления:
SIO_RCVALL,SIO_KEEPALIVE_VALS, иSIO_LOOPBACK_FAST_PATH.Изменено в версии 3.6:
SIO_LOOPBACK_FAST_PATHбыл добавлен.
-
socket.listen([backlog]) -
Разрешает серверу принимать подключения. Если задан параметр backlog, он должен быть не меньше 0 (в противном случае устанавливается в 0); он указывает количество неодобренных подключений, которые система позволит перед отказом в новых подключениях. Если не указан, выбирается разумное значение по умолчанию.
Изменено в версии 3.5: Параметр backlog теперь является необязательным.
-
socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None) -
Возвращает объект объект файла, связанный с сокетом. Точный возвращаемый тип зависит от аргументов, переданных методу
makefile(). Эти аргументы интерпретируются так же, как и встроенной функциейopen(), за исключением того, что поддерживаются только значения mode:'r'(по умолчанию),'w'и'b'.Сокет должен быть в режиме блокировки; у него может быть таймаут, но внутренний буфер объекта файла может оказаться в несогласованном состоянии, если произойдет таймаут.
Закрытие объекта файла, возвращаемого методом
makefile(), не закроет исходный сокет, если не будут закрыты все другие объекты файла и на объекте сокета не будет вызван методsocket.close().Примечание
В Windows файл-подобный объект, созданный методом
makefile(), нельзя использовать там, где ожидается объект файла с дескриптором файла, например, в качестве аргументов потока дляsubprocess.Popen().
-
socket.recv(bufsize[, flags]) -
Получение данных из сокета. Возвращаемое значение — объект bytes, представляющий полученные данные. Максимальное количество данных, получаемых за раз, задаётся параметром bufsize. См. страницу руководства Unix recv(2) для понимания необязательного аргумента flags; он по умолчанию равен нулю.
Примечание
Для лучшего соответствия аппаратным и сетевым реалиям значение bufsize должно быть относительно малой степенью двойки, например, 4096.
Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключение, метод теперь повторно выполняет системный вызов вместо того, чтобы генерировать исключение
InterruptedError(см. PEP 475 для обоснования).
-
socket.recvfrom(bufsize[, flags]) -
Получение данных из сокета. Возвращаемое значение — пара
(bytes, address), где bytes — это объект bytes, представляющий полученные данные, а address — адрес сокета, отправляющего данные. См. страницу руководства Unix recv(2) для понимания необязательного аргумента flags; он по умолчанию равен нулю. (Формат address зависит от семейства адресов — см. выше.)Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключение, метод теперь повторно выполняет системный вызов вместо того, чтобы генерировать исключение
InterruptedError(см. PEP 475 для обоснования).Изменено в версии 3.7: Для адресов IPv6 multicast, первая часть 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, представляющий новые дескрипторы файлов как двоичный массив родного типа Cint. Еслиrecvmsg()сгенерирует исключение после возврата системного вызова, оно в первую очередь попытается закрыть любые дескрипторы файлов, полученные с помощью этого механизма.Некоторые системы не указывают усечённую длину элементов дополнительных данных, которые были получены только частично. Если элемент, по-видимому, выходит за пределы конца буфера,
recvmsg()выведет предупреждениеRuntimeWarningи вернёт ту часть, которая находится внутри предоставленного буфера, при условии, что она не была усечена до начала связанных данных.На системах, которые поддерживают механизм
SCM_RIGHTS, следующая функция будет принимать до maxfds дескрипторов файлов, возвращая данные сообщения и список, содержащий дескрипторы (игнорируя неожиданные условия, такие как получение не относящихся к делу управляющих сообщений). См. такжеsendmsg().import socket, array def recv_fds(sock, msglen, maxfds): fds = array.array("i") # Array of ints msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize)) for cmsg_level, cmsg_type, cmsg_data in ancdata: if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS: # Append data, ignoring any truncated integers at the end. fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) return msg, list(fds)Доступность: большинство Unix-платформ, возможно, другие.
Новое в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключение, метод теперь повторно выполняет системный вызов вместо того, чтобы генерировать исключение
InterruptedError(см. PEP 475 для обоснования).
-
socket.recvmsg_into(buffers[, ancbufsize[, flags]]) -
Получение обычных данных и дополнительных данных из сокета, ведя себя так же, как и
recvmsg(), но рассеивая данные, не являющиеся дополнительными, по ряду буферов вместо возврата нового объекта типа bytes. Аргумент buffers должен быть итерируемым объектом, содержащим объекты, экспортирующие записываемые буферы (например,bytearrayобъекты); они будут заполняться последовательными фрагментами данных, не являющимися дополнительными, пока все данные не будут записаны или не закончатся буферы. Операционная система может установить ограничение (sysconf()значениеSC_IOV_MAX) на количество используемых буферов. Аргументы ancbufsize и flags имеют то же значение, что и дляrecvmsg().Значение возврата — кортеж из 4 элементов:
(nbytes, ancdata, msg_flags, address), где nbytes — общее количество байтов не-дополнительных данных, записанных в буферы, а ancdata, msg_flags и address — такие же, как дляrecvmsg().Пример:
>>> import socket >>> s1, s2 = socket.socketpair() >>> b1 = bytearray(b'----') >>> b2 = bytearray(b'0123456789') >>> b3 = bytearray(b'--------------') >>> s1.send(b'Mary had a little lamb') 22 >>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3]) (22, [], 0, None) >>> [b1, b2, b3] [bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]
Доступность: большинство платформ Unix, возможно, и другие.
Введено в версии 3.3.
-
socket.recvfrom_into(buffer[, nbytes[, flags]]) -
Получение данных из сокета, записывая их в buffer вместо создания новой строки байтов. Значение возврата — пара
(nbytes, address), где nbytes — количество полученных байтов, а address — адрес сокета, отправляющего данные. Обратитесь к странице руководства Unix recv(2) для понимания необязательного аргумента flags; он по умолчанию равен нулю. (Формат address зависит от семейства адресов — см. выше.)
-
socket.recv_into(buffer[, nbytes[, flags]]) -
Приём до nbytes байтов из сокета, сохраняя данные в буфере вместо создания новой строки байтов. Если nbytes не указан (или равен 0), принимается до размера, доступного в заданном буфере. Возвращает количество полученных байтов. Обратитесь к странице руководства Unix recv(2) для понимания необязательного аргумента flags; он по умолчанию равен нулю.
-
socket.send(bytes[, flags]) -
Отправка данных в сокет. Сокет должен быть подключен к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и для
recv()выше. Возвращает количество отправленных байтов. Приложения несут ответственность за проверку того, что все данные были отправлены; если была передана только часть данных, приложение должно попытаться доставить оставшиеся данные. Для получения дополнительной информации по этой теме обратитесь к Руководству по программированию сокетов.Изменено в версии 3.5: Если системный вызов прерывается, и обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо вызова исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendall(bytes[, flags]) -
Отправка данных в сокет. Сокет должен быть подключен к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и для
recv()выше. В отличие отsend(), этот метод продолжает отправлять данные из bytes, пока все данные не будут отправлены или не произойдёт ошибка.Noneвозвращается при успехе. При ошибке возникает исключение, и нет способа определить, сколько данных, если таковые имеются, было успешно отправлено.Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается каждый раз, когда данные отправляются успешно. Тайм-аут сокета теперь является максимальной общей продолжительностью отправки всех данных.
Изменено в версии 3.5: Если системный вызов прерывается, и обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо вызова исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendto(bytes, address) -
socket.sendto(bytes, flags, address) -
Отправка данных в сокет. Сокет не должен быть подключен к удаленному сокету, так как целевой сокет задается параметром address. Необязательный аргумент flags имеет то же значение, что и для
recv()выше. Возвращает количество отправленных байтов. (Формат address зависит от семейства адресов — см. выше.)Вызывает событие аудита аудита
socket.sendtoс аргументамиself,address.Изменено в версии 3.5: Если системный вызов прерывается, и обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо вызова исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendmsg(buffers[, ancdata[, flags[, address]]]) -
Отправка обычных и дополнительных данных в сокет, собирая данные, не являющиеся дополнительными, из ряда буферов и конкатенируя их в одно сообщение. Аргумент buffers определяет данные, не являющиеся дополнительными, как итерируемый объект, содержащий байтоподобные объекты (например,
bytesобъекты); операционная система может установить ограничение (sysconf()значениеSC_IOV_MAX) на количество используемых буферов. Аргумент ancdata определяет дополнительные данные (сообщения управления) как итерируемый объект, содержащий ноль или более кортежей(cmsg_level, cmsg_type, cmsg_data), где cmsg_level и cmsg_type — целые числа, определяющие уровень протокола и тип протокола соответственно, а cmsg_data — байтоподобный объект, содержащий связанные данные. Обратите внимание, что некоторые системы (в частности, системы безCMSG_SPACE()) могут поддерживать отправку только одного сообщения управления за один вызов. Аргумент flags по умолчанию равен 0 и имеет то же значение, что и дляsend(). Если address указан и неNone, он устанавливает целевой адрес для сообщения. Значение возврата — количество отправленных байтов данных, не являющихся дополнительными.Следующая функция отправляет список дескрипторов файлов fds по сокету
AF_UNIXна системах, которые поддерживают механизмSCM_RIGHTS. См. такжеrecvmsg().import socket, array def send_fds(sock, msg, fds): return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])Доступность: большинство платформ Unix, возможно, и другие.
Вызывает событие аудита аудита
socket.sendmsgс аргументамиself,address.Введено в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерывается, и обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо вызова исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]]) -
Специализированная версия
sendmsg()для сокетаAF_ALG. Устанавливает режим, IV, длину связанных данных AEAD и флаги для сокетаAF_ALG.Доступность: Linux >= 2.6.38.
Введено в версии 3.6.
-
socket.sendfile(file, offset=0, count=None) -
Отправьте файл до достижения EOF, используя высокопроизводительный метод
os.sendfile, и верните общее количество отправленных байтов. file должен быть объектом файла, открытым в двоичном режиме. Еслиos.sendfileнедоступен (например, в Windows) или file не является обычным файлом, будет использованsend(). offset указывает, с какой позиции начать чтение файла. Если указано, count — общее количество байтов для передачи, а не отправка файла до достижения EOF. Позиция файла обновляется при возврате или в случае ошибки, в этом случаеfile.tell()можно использовать для определения количества отправленных байтов. Сокет должен быть типаSOCK_STREAM. Неблокирующие сокеты не поддерживаются.Добавлена в версии 3.5.
-
socket.set_inheritable(inheritable) -
Установите флаг наследования флага наследования дескриптора файла сокета или дескриптора сокета.
Добавлена в версии 3.4.
-
socket.setblocking(flag) -
Установите режим блокировки или неблокирующий режим сокета: если flag равно false, сокет настраивается на неблокирующий режим, в противном случае — на блокирующий.
Этот метод — сокращение для некоторых вызовов
settimeout():-
sock.setblocking(True)эквивалентноsock.settimeout(None) -
sock.setblocking(False)эквивалентноsock.settimeout(0.0)
Изменено в версии 3.7: Метод больше не применяет флаг
SOCK_NONBLOCKкsocket.type. -
-
socket.settimeout(value) -
Установите таймаут для блокирующих операций сокета. Аргумент value может быть неотрицательным числом с плавающей точкой, представляющим секунды, или
None. Если задано ненулевое значение, последующие операции с сокетом приведут к исключениюtimeout, если период таймаута value истечёт до завершения операции. Если задано значение ноль, сокет переводится в неблокирующий режим. Если заданоNone, сокет переводится в блокирующий режим.Для получения дополнительной информации, пожалуйста, обратитесь к примечаниям о таймаутах сокетов.
Изменено в версии 3.7: Метод больше не переключает флаг
SOCK_NONBLOCKнаsocket.type.
-
socket.setsockopt(level, optname, value: int)
-
socket.setsockopt(level, optname, value: buffer)
-
socket.setsockopt(level, optname, None, optlen: int) -
Установите значение заданного параметра сокета (см. страницу справки Unix setsockopt(2)). Необходимые символические константы определены в модуле
socket(SO_*и т.д.). Значение может быть целым числом,Noneили объектом bytes-like object, представляющим буфер. В последнем случае, вызывающая сторона должна убедиться, что строка байтов содержит правильные биты (см. необязательный встроенный модульstructдля способа кодирования C-структур как строк байтов). Когда value установлено вNone, требуется аргумент optlen. Он эквивалентен вызову функции Csetsockopt()сoptval=NULLиoptlen=optlen.Изменено в версии 3.5: Теперь принимается объект типа bytes-like object, поддерживающий запись.
Изменено в версии 3.6: Добавлена форма setsockopt(level, optname, None, optlen: int).
-
socket.shutdown(how) -
Закрыть одну или обе половины соединения. Если how равно
SHUT_RD, дальнейшие приёмы запрещены. Если how равноSHUT_WR, дальнейшие отправки запрещены. Если how равноSHUT_RDWR, дальнейшие отправки и приёмы запрещены.
-
Создать дубликат сокета и подготовить его для совместного использования с целевым процессом. Целевой процесс должен быть предоставлен с помощью process_id. Результирующий объект bytes может быть передан целевому процессу с помощью какой-либо формы межпроцессного взаимодействия, и сокет может быть там воссоздан с помощью
fromshare(). После вызова этого метода сокет можно безопасно закрыть, так как операционная система уже продублировала его для целевого процесса.Доступность: Windows.
Добавлена в версии 3.3.
Обратите внимание, что методов read() или write() нет; используйте recv() и send() без аргумента flags вместо них.
Объекты сокетов также имеют эти (только для чтения) атрибуты, которые соответствуют значениям, заданным в конструкторе socket.
-
socket.family -
Семейство сокета.
-
socket.type -
Тип сокета.
-
socket.proto -
Протокол сокета.
Примечания о таймаутах сокетов
Объект сокета может находиться в одном из трёх режимов: блокирующий, неблокирующий или с таймаутом. Сокеты по умолчанию всегда создаются в блокирующем режиме, но это можно изменить, вызвав setdefaulttimeout().
- В блокирующем режиме операции блокируются до завершения или возвращения ошибки системой (например, таймаут соединения).
- В неблокирующем режиме операции завершаются ошибкой (к сожалению, зависимой от системы), если они не могут быть завершены немедленно: функции из модуля
selectмогут использоваться для определения того, когда и доступен ли сокет для чтения или записи. - В режиме с таймаутом операции завершаются ошибкой, если они не могут быть завершены в течение заданного таймаута для сокета (они генерируют исключение
timeout) или если система возвращает ошибку.
Примечание
На уровне операционной системы сокеты в режиме с таймаутом внутренне устанавливаются в неблокирующий режим. Кроме того, блокирующий и режим с таймаутом общие для дескрипторов файлов и объектов сокетов, которые ссылаются на один и тот же сетевой конечный пункт. Эта реализация может иметь видимые последствия, например, если вы решите использовать fileno() сокета.
Таймауты и метод connect
Операция connect() также подчиняется настройкам таймаута, и в общем случае рекомендуется вызывать settimeout() перед вызовом connect() или передавать параметр таймаута в create_connection(). Однако, сетевой стек системы может также возвращать ошибку таймаута соединения независимо от любого параметра таймаута сокета Python.
Таймауты и метод accept
Если getdefaulttimeout() не равно None, сокеты, возвращаемые методом accept(), наследуют этот таймаут. В противном случае поведение зависит от настроек сокета прослушивания:
- если сокет прослушивания находится в блокирующем режиме или в режиме с таймаутом, сокет, возвращаемый методом
accept(), находится в блокирующем режиме; - если сокет прослушивания находится в неблокирующем режиме, то находится ли сокет, возвращаемый
accept(), в режиме блокировки или в режиме без блокировки зависит от операционной системы. Чтобы обеспечить кроссплатформенное поведение, рекомендуется вручную переопределить эту настройку.
Пример
Вот четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который эхом возвращает все полученные данные (обслуживает только одного клиента), и клиент, использующий его. Обратите внимание, что сервер должен выполнить последовательность socket(), bind(), listen(), accept() (возможно, повторяя accept() для обслуживания более одного клиента), а клиенту требуется только последовательность socket(), connect(). Также обратите внимание, что сервер не выполняет sendall()/recv() на сокете, который он прослушивает, а на новом сокете, возвращаемом accept().
Два первых примера поддерживают только IPv4.
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
# Echo client program
import socket
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Следующие два примера идентичны двум вышеприведенным, но поддерживают как IPv4, так и IPv6. Серверная сторона будет прослушивать первую доступную семейство адресов (он должен прослушивать вместо этого оба). На большинстве систем с поддержкой IPv6 IPv6 будет иметь приоритет, и сервер может не принимать трафик IPv4. Клиентская сторона попытается подключиться ко всем адресам, полученным в результате разрешения имени, и отправляет трафик первому успешно подключившемуся.
# Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.send(data)
# Echo client program
import socket
import sys
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.connect(sa)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
with s:
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Следующий пример показывает, как написать очень простой сетевой сниффер с сырыми сокетами в Windows. Пример требует прав администратора для изменения интерфейса:
import socket # the public network interface HOST = socket.gethostbyname(socket.gethostname()) # create a raw socket and bind it to the public interface s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) s.bind((HOST, 0)) # Include IP headers s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # receive all packets s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) # receive a packet print(s.recvfrom(65565)) # disabled promiscuous mode s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
Следующий пример показывает, как использовать интерфейс сокета для связи с сетью CAN, используя протокол сырого сокета. Чтобы использовать CAN с протоколом менеджера широковещательной передачи, откройте сокет с:
socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
После привязки (CAN_RAW) или подключения (CAN_BCM) сокета, вы можете использовать операции socket.send() и socket.recv() (и их аналоги) на объекте сокета как обычно.
Этот последний пример может потребовать специальных привилегий:
import socket
import struct
# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)
can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)
def build_can_frame(can_id, data):
can_dlc = len(data)
data = data.ljust(8, b'\x00')
return struct.pack(can_frame_fmt, can_id, can_dlc, data)
def dissect_can_frame(frame):
can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
return (can_id, can_dlc, data[:can_dlc])
# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))
while True:
cf, addr = s.recvfrom(can_frame_size)
print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))
try:
s.send(cf)
except OSError:
print('Error sending CAN frame')
try:
s.send(build_can_frame(0x01, b'\x01\x02\x03'))
except OSError:
print('Error sending CAN frame')
Запуск примера несколько раз с слишком коротким интервалом между запусками может привести к этой ошибке:
OSError: [Errno 98] Address already in use
Это происходит потому, что предыдущее выполнение оставило сокет в состоянии TIME_WAIT, и он не может быть немедленно повторно использован.
Есть флаг socket, чтобы установить его, чтобы предотвратить это, socket.SO_REUSEADDR:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT))
флаг SO_REUSEADDR сообщает ядру использовать локальный сокет в состоянии TIME_WAIT, не ожидая истечения его естественного таймаута.
См. также
Для введения в программирование сокетов (на C), см. следующие статьи:
- Вводный учебник по межпроцессной коммуникации 4.3BSD, Стјуарт Сехрест
- Расширенный учебник по межпроцессной коммуникации 4.3BSD, Сэмюэл Дж. Леффлер и др.
оба в Руководстве программиста UNIX, Дополнительные документы 1 (разделы PS1:7 и PS1:8). Специфические для платформы справочные материалы для различных системных вызовов, связанных с сокетами, также являются ценным источником информации о деталях семантики сокетов. Для Unix см. страницы руководств; для Windows см. спецификацию WinSock (или Winsock 2). Для API с поддержкой IPv6 читатели могут обратиться к RFC 3493 под названием Расширения основного интерфейса сокетов для IPv6.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/socket.html