socket — Интерфейс низкого уровня для сетевых соединений
Исходный код: Lib/socket.py
Этот модуль предоставляет доступ к интерфейсу сокетов BSD. Он доступен на всех современных Unix-системах, Windows, MacOS и, вероятно, на дополнительных платформах.
Примечание
Некоторые особенности поведения могут зависеть от платформы, так как вызовы выполняются через системные API сокетов операционной системы.
Интерфейс Python представляет собой непосредственный перевод интерфейса системных вызовов и библиотек сокетов Unix в объектно-ориентированный стиль Python: функция socket() возвращает объект сокета, методы которого реализуют различные системные вызовы сокета. Типы параметров несколько более высокого уровня, чем в C-интерфейсе: как и при операциях read() и write() с файлами Python, выделение буфера при приеме данных выполняется автоматически, а длина буфера при отправке данных подразумевается неявно.
См. также
-
Modulesocketserver -
Классы, упрощающие написание сетевых серверов.
-
Modulessl -
Обёртка TLS/SSL для объектов сокета.
18.1.1. Семейства сокетов
В зависимости от системы и параметров сборки, этот модуль поддерживает различные семейства сокетов.
Формат адреса, требуемый для конкретного объекта сокета, автоматически выбирается на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представляются следующим образом:
-
Адрес сокета
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, scopeid), где flowinfo и scopeid представляют членыsin6_flowinfoиsin6_scope_idвstruct sockaddr_in6на C. Для методов модуляsocketчлены flowinfo и scopeid могут быть опущены исключительно для совместимости со старыми версиями. Тем не менее, пропуск scopeid может вызвать проблемы при манипулировании скопированными IPv6-адресами. -
AF_NETLINKсокеты представляются парами(pid, groups). -
Только для Linux доступна поддержка TIPC с использованием семейства адресов
AF_TIPC. TIPC — это открытый, не основанный на IP сетевой протокол, предназначенный для использования в кластерных компьютерных средах. Адреса представляются кортежем, а поля зависят от типа адреса. Общий формат кортежа —(addr_type, v1, v2, v3 [, scope]), где:-
addr_type — это один из
TIPC_ADDR_NAMESEQ,TIPC_ADDR_NAME, илиTIPC_ADDR_ID. -
scope — это один из
TIPC_ZONE_SCOPE,TIPC_CLUSTER_SCOPE, иTIPC_NODE_SCOPE. -
Если addr_type —
TIPC_ADDR_NAME, то v1 — тип сервера, v2 — идентификатор порта, а v3 должно быть 0.Если addr_type —
TIPC_ADDR_NAMESEQ, то v1 — тип сервера, v2 — нижнее значение порта, а v3 — верхнее значение порта.Если addr_type —
TIPC_ADDR_ID, то v1 — узел, v2 — ссылка, а v3 должно быть 0.
-
addr_type — это один из
- Кортеж
(interface, )используется для семейства адресовAF_CAN, где interface — строка, представляющая имя сетевого интерфейса, например,'can0'. Имя сетевого интерфейса''может использоваться для приема пакетов со всех сетевых интерфейсов этого семейства. -
Строка или кортеж
(id, unit)используется для протоколаSYSPROTO_CONTROLсемействаPF_SYSTEM. Строка — это имя ядра управления, использующее динамически назначенный идентификатор. Кортеж может быть использован, если известны ID и номер единицы ядра управления, или если используется зарегистрированный ID.Новое в версии 3.3.
-
AF_BLUETOOTHподдерживает следующие протоколы и форматы адресов:-
BTPROTO_L2CAPпринимает(bdaddr, psm)гдеbdaddr— Bluetooth-адрес в виде строки, аpsm— целое число. -
BTPROTO_RFCOMMпринимает(bdaddr, channel)гдеbdaddr— Bluetooth-адрес в виде строки, аchannel— целое число. -
BTPROTO_HCIпринимает(device_id,)гдеdevice_id— это либо целое число, либо строка с Bluetooth-адресом интерфейса. (Это зависит от вашей ОС; NetBSD и DragonFlyBSD ожидают Bluetooth-адрес, в то время как все остальные ожидают целое число.)Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.
-
BTPROTO_SCOпринимаетbdaddrгдеbdaddr— объектbytes, содержащий Bluetooth-адрес в формате строки. (например,b'12:23:34:45:56:67') Этот протокол не поддерживается под FreeBSD.
-
-
AF_ALG— это интерфейс сокета для криптографии ядра, доступный только на Linux. Сокет алгоритма настроен с кортежем от двух до четырёх элементов(type, name [, feat [, mask]]), где:-
type — тип алгоритма в виде строки, например,
aead,hash,skcipherилиrng. -
name — имя алгоритма и режим работы в виде строки, например,
sha256,hmac(sha256),cbc(aes)илиdrbg_nopr_ctr_aes256. - feat и mask — целые 32-битные беззнаковые числа.
Доступность Linux 2.6.38, некоторые типы алгоритмов требуют более новых ядер.
Новое в версии 3.6.
-
type — тип алгоритма в виде строки, например,
-
AF_PACKET— это интерфейс низкого уровня для непосредственного взаимодействия с сетевыми устройствами. Пакеты представляются кортежем(ifname, proto[, pkttype[, hatype[, addr]]]), где:- ifname — строка, определяющая имя устройства.
- proto — целое число в сетевом порядке байтов, определяющее номер протокола Ethernet.
-
pkttype — необязательное целое число, определяющее тип пакета:
-
PACKET_HOST(по умолчанию) — пакет, адресованный локальному хосту. -
PACKET_BROADCAST— пакет широковещательной передачи физического уровня. -
PACKET_MULTIHOST— пакет, отправленный на физический многоадресную группу. -
PACKET_OTHERHOST— пакет, отправленный другому хосту, который был перехвачен драйвером устройства в режиме прослушивания всех пакетов. -
PACKET_OUTGOING— пакет, исходящий из локального хоста, который возвращается на сокет пакета.
-
- hatype — необязательное целое число, определяющее тип адреса аппаратного ARP.
- addr — необязательный объект последовательности байтов, определяющий аппаратный физический адрес, чья интерпретация зависит от устройства.
Если вы используете имя хоста в части host IPv4/v6-адреса сокета, поведение программы может быть непредсказуемым, так как Python использует первый адрес, возвращенный результатом разрешения DNS. Адрес сокета будет разрешаться в фактический IPv4/v6-адрес по-разному в зависимости от результатов разрешения DNS и/или конфигурации хоста. Для получения детерминированного поведения используйте числовой адрес в части host.
Все ошибки генерируют исключения. Могут быть вызваны обычные исключения для неверных типов аргументов и ситуаций недостатка памяти; начиная с Python 3.3, ошибки, связанные с семантикой сокета или адреса, генерируют OSError или один из его подклассов (раньше они генерировали socket.error).
Режим без блокировки поддерживается через setblocking(). Обобщение этого на основе таймаутов поддерживается через settimeout().
18.1.2. Содержание модуля
Модуль socket экспортирует следующие элементы.
18.1.2.1. Исключения
-
exception socket.error -
Устаревшее псевдоним класса
OSError.
-
exception socket.herror -
Подкласс
OSError. Это исключение генерируется для ошибок, связанных с адресом, т. е. для функций, использующих h_errno в POSIX C API, включаяgethostbyname_ex()иgethostbyaddr(). Сопутствующее значение — пара(h_errno, string), представляющая ошибку, возвращённую библиотечной функцией. h_errno — числовое значение, а string — описание h_errno, возвращённое функциейhstrerror()C.Изменено в версии 3.3: Этот класс был сделан подклассом
OSError.
-
exception socket.gaierror -
Подкласс
OSError. Это исключение генерируется при возникновении ошибок, связанных с адресом, при вызовеgetaddrinfo()иgetnameinfo(). Сопутствующее значение — пара(error, string), представляющая ошибку, возвращённую библиотечной функцией. string — описание error, возвращённое функциейgai_strerror()C. Числовое значение error соответствует одному изEAI_*констант, определённых в этом модуле.Изменено в версии 3.3: Этот класс был сделан подклассом
OSError.
-
exception socket.timeout -
Подкласс
OSError. Это исключение генерируется, когда таймаут истекает для сокета, у которого таймауты включены с помощью предыдущего вызоваsettimeout()(или неявно черезsetdefaulttimeout()). Сопутствующее значение — строка, значение которой в настоящее время всегда равно «timed out».Изменено в версии 3.3: Этот класс был сделан подклассом
OSError.
18.1.2.2. Константы
Константы 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, также определены в модуле сокетов. Они обычно используются в аргументах методов объектов сокета
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.
-
socket.AF_CAN -
socket.PF_CAN -
SOL_CAN_* -
CAN_* -
Многие константы этих форм, документированные в Linux-документации, также определены в модуле сокетов.
Доступность: Linux >= 2.6.25.
Добавлена в версии 3.3.
-
socket.CAN_BCM -
CAN_BCM_* -
CAN_BCM в семействе протоколов CAN — это протокол менеджера широковещательной рассылки (BCM). Константы менеджера широковещательной рассылки, документированные в Linux-документации, также определены в модуле сокетов.
Доступность: Linux >= 2.6.25.
Добавлена в версии 3.4.
-
socket.CAN_RAW_FD_FRAMES -
Включает поддержку CAN FD в сокете CAN_RAW. По умолчанию выключено. Это позволяет вашему приложению отправлять как кадровые данные CAN, так и CAN FD; однако при чтении из сокета необходимо принять как кадры CAN, так и CAN FD.
Эта константа документирована в Linux-документации.
Доступность: Linux >= 3.6.
Добавлена в версии 3.5.
-
socket.AF_PACKET -
socket.PF_PACKET -
PACKET_* -
Многие константы этих форм, документированные в Linux-документации, также определены в модуле сокетов.
Доступность: Linux >= 2.2.
-
socket.AF_RDS -
socket.PF_RDS -
socket.SOL_RDS -
RDS_* -
Многие константы этих форм, документированные в Linux-документации, также определены в модуле сокетов.
Доступность: 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_LINK -
Доступность: BSD, OSX.
Новая в версии 3.4.
-
socket.has_ipv6 -
Эта константа содержит булево значение, которое указывает, поддерживается ли IPv6 на этой платформе.
-
socket.BDADDR_ANY -
socket.BDADDR_LOCAL -
Это строковые константы, содержащие Bluetooth-адреса со специальными значениями. Например,
BDADDR_ANYможет использоваться для обозначения любого адреса при указании сокета для привязки сBTPROTO_RFCOMM.
-
socket.HCI_FILTER -
socket.HCI_TIME_STAMP -
socket.HCI_DATA_DIR -
Для использования с
BTPROTO_HCI.HCI_FILTERнедоступна для NetBSD или DragonFlyBSD.HCI_TIME_STAMPиHCI_DATA_DIRнедоступны для FreeBSD, NetBSD или DragonFlyBSD.
18.1.2.3. Функции
18.1.2.3.1. Создание сокетов
Следующие функции создают объекты сокета.
-
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. Если указан fileno, остальные аргументы игнорируются, что приводит к возвращению сокета с указанным дескриптором файла. В отличие отsocket.fromfd(), fileno вернет тот же сокет, а не дубликат. Это может помочь закрыть отсоединенный сокет с помощьюsocket.close().Новый созданный сокет не наследуется.
Изменено в версии 3.3: Была добавлена семейство AF_CAN. Была добавлена семейство AF_RDS.
Изменено в версии 3.4: Было добавлено протокол CAN_BCM.
Изменено в версии 3.4: Возвращаемый сокет теперь не наследуется.
-
socket.socketpair([family[, type[, proto]]]) -
Создаёт пару соединённых объектов сокета, используя заданное семейство адресов, тип сокета и номер протокола. Семейство адресов, тип сокета и номер протокола такие же, как и для функции
socket()выше. По умолчанию семейство —AF_UNIX, если оно определено на платформе; в противном случае по умолчанию —AF_INET.Созданные сокеты не наследуются.
Изменено в версии 3.2: Возвращаемые объекты сокетов теперь поддерживают весь API сокетов, а не подмножество.
Изменено в версии 3.4: Возвращаемые сокеты теперь не наследуются.
Изменено в версии 3.5: Добавлена поддержка Windows.
-
socket.create_connection(address[, timeout[, source_address]]) -
Подключается к TCP-сервису, слушающему на сетевом адресе (кортеж из 2 элементов
(host, port)), и возвращает объект сокета. Эта функция более высокого уровня, чемsocket.connect(): если host — не числовое имя хоста, будет попытка разрешить его для обоихAF_INETиAF_INET6, а затем попытка подключения ко всем возможным адресам по очереди до тех пор, пока подключение не будет выполнено успешно. Это упрощает написание клиентов, совместимых с IPv4 и IPv6.Передача необязательного параметра timeout установит таймаут для объекта сокета перед попыткой подключения. Если параметр timeout не указан, используется глобальный параметр таймаута по умолчанию, возвращаемый функцией
getdefaulttimeout().Если указан source_address, он должен быть кортежем из 2 элементов
(host, port)для привязки сокета к нему в качестве адреса источника перед подключением. Если host или порт равны '' или 0 соответственно, будет использовано поведение по умолчанию ОС.Изменено в версии 3.2: Добавлен параметр source_address.
-
socket.fromfd(fd, family, type, proto=0) -
Создаёт дубликат дескриптора файла fd (целое число, возвращаемое методом
fileno()объекта файла) и создаёт объект сокета из результата. Семейство адресов, тип сокета и номер протокола такие же, как и для функцииsocket()выше. Дескриптор файла должен ссылаться на сокет, но это не проверяется — последующие операции с объектом могут завершиться ошибкой, если дескриптор файла недействителен. Данная функция редко используется, но может быть применена для получения или установки параметров сокета для сокета, переданного программе в качестве стандартного ввода или вывода (например, сервер, запущенный демоном Unix inet). Предполагается, что сокет находится в режиме блокировки.Созданный сокет не наследуется.
Изменено в версии 3.4: Возвращаемый сокет теперь не наследуется.
-
Инициализирует сокет из данных, полученных из метода
socket.share(). Предполагается, что сокет находится в режиме блокировки.Доступность: Windows.
Новая в версии 3.3.
-
socket.SocketType -
Это объект типа Python, который представляет тип объекта сокета. Он такой же, как
type(socket(...)).
18.1.2.3.2. Другие функции
Модуль socket также предлагает различные сетевые сервисы:
-
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().Следующий пример извлекает информацию об адресе для гипотетического TCP-соединения с
example.orgна порту 80 (результаты могут отличаться на вашей системе, если IPv6 не включен):>>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP) [(<AddressFamily.AF_INET6: 10>, <SocketType.SOCK_STREAM: 1>, 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)), (<AddressFamily.AF_INET: 2>, <SocketType.SOCK_STREAM: 1>, 6, '', ('93.184.216.34', 80))]Изменено в версии 3.2: параметры теперь можно передавать с помощью именованных аргументов.
-
socket.getfqdn([name]) -
Возвращает полное доменное имя для name. Если name опущено или пусто, оно интерпретируется как локальный хост. Для поиска полного имени проверяется имя хоста, возвращённое функцией
gethostbyaddr(), а затем — псевдонимы хоста, если они доступны. Выбирается первое имя, включающее точку. В случае отсутствия полного доменного имени возвращается имя хоста, возвращённое функциейgethostname().
-
socket.gethostbyname(hostname) -
Преобразует имя хоста в формат IPv4-адреса. IPv4-адрес возвращается в виде строки, например
'100.50.200.5'. Если имя хоста — это сам IPv4-адрес, оно возвращается без изменений. Для более полной функциональности см.gethostbyname_ex().gethostbyname()не поддерживает разрешение имён IPv6, и вместо этого следует использоватьgetaddrinfo()для поддержки двойного стека IPv4/v6.
-
socket.gethostbyname_ex(hostname) -
Преобразует имя хоста в формат IPv4-адреса, расширенный интерфейс. Возвращает тройку
(hostname, aliaslist, ipaddrlist), где hostname — основное имя хоста, отвечающее заданному ip_address, aliaslist — (возможно пустой) список альтернативных имён хоста для того же адреса, а ipaddrlist — список IPv4-адресов для того же интерфейса на том же хосте (часто, но не всегда, один адрес).gethostbyname_ex()не поддерживает разрешение имён IPv6, и вместо этого следует использоватьgetaddrinfo()для поддержки двойного стека IPv4/v6.
-
socket.gethostname() -
Возвращает строку, содержащую имя хоста машины, на которой в данный момент выполняется интерпретатор Python.
Примечание:
gethostname()не всегда возвращает полное доменное имя; для этого используйтеgetfqdn().
-
socket.gethostbyaddr(ip_address) -
Возвращает тройку
(hostname, aliaslist, ipaddrlist), где hostname — основное имя хоста, отвечающее заданному ip_address, aliaslist — (возможно пустой) список альтернативных имён хоста для того же адреса, а ipaddrlist — список IPv4/v6-адресов для того же интерфейса на том же хосте (скорее всего, содержащий только один адрес). Для поиска полного доменного имени используйте функциюgetfqdn().gethostbyaddr()поддерживает как IPv4, так и IPv6.
-
socket.getnameinfo(sockaddr, flags) -
Преобразует адрес сокета sockaddr в 2-кортеж
(host, port). В зависимости от настроек flags, результат может содержать полное доменное имя или числовое представление адреса в host. Аналогично, port может содержать имя порта в виде строки или числовой номер порта.
-
socket.getprotobyname(protocolname) -
Преобразует имя интернет-протокола (например,
'icmp') в константу, подходящую для передачи в качестве (необязательного) третьего аргумента функцииsocket(). Это обычно необходимо только для сокетов, открытых в «сыром» режиме (SOCK_RAW); для обычных режимов сокетов корректный протокол выбирается автоматически, если протокол опущен или равен нулю.
-
socket.getservbyname(servicename[, protocolname]) -
Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если оно указано, должно быть
'tcp'или'udp', в противном случае любой протокол будет соответствовать.
-
socket.getservbyport(port[, protocolname]) -
Преобразует номер интернет-порта и имя протокола в имя службы для этой службы. Необязательное имя протокола, если оно указано, должно быть
'tcp'или'udp', в противном случае любой протокол будет соответствовать.
-
socket.ntohl(x) -
Преобразует 32-битные целые положительные числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это бесполезная операция; в противном случае выполняется операция перестановки 4 байтов.
-
socket.ntohs(x) -
Преобразует 16-битные целые положительные числа из сетевого порядка байтов в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это бесполезная операция; в противном случае выполняется операция перестановки 2 байтов.
-
socket.htonl(x) -
Преобразует 32-битные целые положительные числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это бесполезная операция; в противном случае выполняется операция перестановки 4 байтов.
-
socket.htons(x) -
Преобразует 16-битные целые положительные числа из порядка байтов хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с сетевым порядком байтов, это бесполезная операция; в противном случае выполняется операция перестановки 2 байтов.
-
socket.inet_aton(ip_string) -
Преобразует IPv4-адрес из строкового формата с точками (например, ‘123.45.67.89’) в 32-битный упакованный двоичный формат в виде объекта bytes длиной в четыре символа. Это полезно при общении с программой, использующей стандартную библиотеку C и требующей объекты типа
struct in_addr, что является C-типом для 32-битного упакованного двоичного объекта, возвращаемого этой функцией.inet_aton()также принимает строки с менее чем тремя точками; см. страницу руководства Unix inet(3) для получения подробностей.Если строка IPv4-адреса, переданная этой функции, неверна, будет поднята ошибка
OSError. Обратите внимание, что точное значение «действительного» зависит от реализации Cinet_aton().inet_aton()не поддерживает IPv6, и для поддержки двойного стека IPv4/v6 следует использоватьinet_pton().
-
socket.inet_ntoa(packed_ip) -
Преобразовать 32-битный упакованный IPv4-адрес (объект типа bytes-подобный объект длиной четыре байта) в его стандартное строковое представление с точками (например, ‘123.45.67.89’). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и нуждающейся в объектах типа
struct in_addr, который является типом C для 32-битных упакованных двоичных данных, принимаемых этой функцией в качестве аргумента.Если последовательность байтов, переданная в эту функцию, не имеет ровно 4 байта, будет поднято исключение
OSError.inet_ntoa()не поддерживает IPv6, и для поддержки IPv4/v6 двойной стековой архитектуры следует использоватьinet_ntop().Изменено в версии 3.5: Теперь принимаются изменяемые bytes-подобные объекты.
-
socket.inet_pton(address_family, ip_string) -
Преобразовать IP-адрес из его семейно-специфичного строкового формата в упакованный двоичный формат.
inet_pton()полезна, когда библиотека или сетевой протокол требуют объект типаstruct in_addr(аналогичноinet_aton()) илиstruct in6_addr.Поддерживаемые значения для address_family в настоящее время —
AF_INETиAF_INET6. Если строка IP-адреса ip_string некорректна, будет поднято исключениеOSError. Обратите внимание, что то, что именно является корректным, зависит как от значения address_family, так и от реализацииinet_pton().Доступность: Unix (возможно, не на всех платформах), Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
-
socket.inet_ntop(address_family, packed_ip) -
Преобразовать упакованный IP-адрес (объект типа bytes-подобный объект некоторой длины в байтах) в его стандартное семейно-специфичное строковое представление (например,
'7.10.0.5'или'5aef:2b::8').inet_ntop()полезна, когда библиотека или сетевой протокол возвращает объект типаstruct in_addr(аналогичноinet_ntoa()) илиstruct in6_addr.Поддерживаемые значения для address_family в настоящее время —
AF_INETиAF_INET6. Если объект типа bytes packed_ip не имеет правильной длины для указанного семейства адресов, будет поднято исключениеValueError.OSErrorподнимается при ошибках из вызоваinet_ntop().Доступность: Unix (возможно, не на всех платформах), Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
Изменено в версии 3.5: Теперь принимаются изменяемые bytes-подобные объекты.
-
socket.CMSG_LEN(length) -
Возвращает полную длину, без конечного заполнения, элемента вспомогательных данных с ассоциированными данными заданной длины. Это значение часто может использоваться в качестве размера буфера для
recvmsg()для приема одного элемента вспомогательных данных, но RFC 3542 требует, чтобы портативные приложения использовалиCMSG_SPACE()и, следовательно, включали место для заполнения, даже когда элемент будет последним в буфере. Возвращает исключениеOverflowError, если length выходит за допустимый диапазон значений.Доступность: большинство платформ Unix, возможно, и другие.
Введено в версии 3.3.
-
socket.CMSG_SPACE(length) -
Возвращает размер буфера, необходимый для
recvmsg()для приема элемента вспомогательных данных с ассоциированными данными заданной длины, а также любое конечное заполнение. Необходимый размер буфера для приема нескольких элементов — сумма значенийCMSG_SPACE()для длин их ассоциированных данных. Возвращает исключениеOverflowError, если length выходит за допустимый диапазон значений.Обратите внимание, что некоторые системы могут поддерживать вспомогательные данные без предоставления этой функции. Также обратите внимание, что установка размера буфера с помощью результатов этой функции может не точно ограничивать количество принимаемых вспомогательных данных, поскольку дополнительные данные могут уместиться в области заполнения.
Доступность: большинство платформ Unix, возможно, и другие.
Введено в версии 3.3.
-
socket.getdefaulttimeout() -
Возвращает значение таймаута по умолчанию в секундах (вещественное число) для новых сокетов. Значение
Noneуказывает, что новые сокеты не имеют таймаута. При первом импорте модуля socket значение по умолчанию равноNone.
-
socket.setdefaulttimeout(timeout) -
Устанавливает значение таймаута по умолчанию в секундах (вещественное число) для новых сокетов. При первом импорте модуля socket значение по умолчанию равно
None. См.settimeout()для возможных значений и их соответствующих значений.
-
socket.sethostname(name) -
Устанавливает имя хоста машины на name. Это вызовет исключение
OSError, если у вас недостаточно прав.Доступность: Unix.
Введено в версии 3.3.
-
socket.if_nameindex() -
Возвращает список кортежей с информацией о сетевом интерфейсе (индекс int, имя строки).
OSErrorпри ошибке системного вызова.Доступность: Unix.
Введено в версии 3.3.
-
socket.if_nametoindex(if_name) -
Возвращает номер индекса сетевого интерфейса, соответствующий имени интерфейса.
OSErrorесли интерфейса с заданным именем не существует.Доступность: Unix.
Введено в версии 3.3.
-
socket.if_indextoname(if_index) -
Возвращает имя сетевого интерфейса, соответствующее номеру индекса интерфейса.
OSErrorесли интерфейса с заданным индексом не существует.Доступность: Unix.
Введено в версии 3.3.
18.1.3. Объекты сокетов
Объекты сокетов имеют следующие методы. За исключением makefile(), они соответствуют системным вызовам Unix, применимым к сокетам.
Изменено в версии 3.2: Добавлена поддержка протокола менеджера контекста. Выход из менеджера контекста эквивалентен вызову close().
-
socket.accept() -
Принять подключение. Сокет должен быть привязан к адресу и ожидать подключений. Возвращаемое значение — пара
(conn, address), где conn — новый объект сокета, пригодный для отправки и получения данных по подключению, а address — адрес, привязанный к сокету на другом конце соединения.Новый созданный сокет не наследуется.
Изменено в версии 3.4: Сокет теперь не наследуется.
Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо того, чтобы генерировать исключение
InterruptedError(см. PEP 475 для обоснования).
-
socket.bind(address) -
Привязать сокет к address. Сокет не должен быть уже привязан. (Формат address зависит от семейства адресов — см. выше.)
-
socket.close() -
Отметить сокет как закрытый. Базовый системный ресурс (например, дескриптор файла) также закрывается, когда все объекты файлов из
makefile()закрываются. После этого все дальнейшие операции с объектом сокета завершатся ошибкой. Удаленный конец больше не будет получать данные (после того, как очереди данных будут сброшены).Сокеты автоматически закрываются при сборке мусора, но рекомендуется явно закрывать их с помощью
close()или использовать инструкциюwith.Изменено в версии 3.6: Теперь генерируется исключение
OSError, если при выполнении базовогоclose()вызова произошла ошибка.Примечание
close()освобождает ресурсы, связанные с подключением, но не обязательно закрывает подключение немедленно. Если вы хотите закрыть подключение в разумные сроки, вызовитеshutdown()передclose().
-
socket.connect(address) -
Подключиться к удалённому сокету по адресу address. (Формат address зависит от семейства адресов — см. выше.)
Если подключение прерывается сигналом, метод ждёт завершения подключения или генерирует исключение
socket.timeoutпри таймауте, если обработчик сигнала не генерирует исключение, а сокет блокирующий или имеет таймаут. Для неблокирующих сокетов метод генерирует исключениеInterruptedError, если подключение прерывается сигналом (или исключение, сгенерированное обработчиком сигнала).Изменено в версии 3.5: Метод теперь ждёт завершения подключения вместо генерации исключения
InterruptedError, если подключение прерывается сигналом, обработчик сигнала не генерирует исключение и сокет блокирующий или имеет таймаут (см. PEP 475 для обоснования).
-
socket.connect_ex(address) -
Аналогично
connect(address), но возвращает индикатор ошибки вместо генерации исключения для ошибок, возвращаемых системным вызовомconnect()(другие проблемы, такие как «хост не найден», всё ещё могут вызывать исключения). Индикатор ошибки —0в случае успеха, в противном случае — значение переменнойerrno. Это полезно для поддержки, например, асинхронных подключений.
-
socket.detach() -
Перевести объект сокета в состояние закрытия без фактического закрытия базового дескриптора файла. Дескриптор файла возвращается и может быть повторно использован для других целей.
Добавлена в версии 3.2.
-
socket.dup() -
Дублировать сокет.
Новый созданный сокет не наследуется.
Изменено в версии 3.4: Сокет теперь не наследуется.
-
socket.fileno() -
Возвращает дескриптор файла сокета (целое число), или -1 при ошибке. Это полезно при работе с
select.select().В Windows возвращаемое целое число не может быть использовано там, где используется дескриптор файла (например,
os.fdopen()). В Unix нет такого ограничения.
-
socket.get_inheritable() -
Получить флаг наследования дескриптора файла сокета или дескриптора объекта сокета:
Trueесли сокет может быть унаследован дочерними процессами,Falseесли нет.Добавлена в версии 3.4.
-
socket.getpeername() -
Возвращает удалённый адрес, к которому подключён сокет. Это полезно для получения номера порта удалённого IPv4/v6 сокета, например. (Формат возвращаемого адреса зависит от семейства адресов — см. выше.) На некоторых системах эта функция не поддерживается.
-
socket.getsockname() -
Возвращает собственный адрес сокета. Это полезно для получения номера порта IPv4/v6 сокета, например. (Формат возвращаемого адреса зависит от семейства адресов — см. выше.)
-
socket.getsockopt(level, optname[, buflen]) -
Возвращает значение заданного параметра сокета (см. страницу руководства Unix getsockopt(2)). Необходимые символьные константы (
SO_*и т.д.) определены в этом модуле. Если buflen отсутствует, предполагается целочисленный параметр, и его целочисленное значение возвращается функцией. Если buflen присутствует, оно задаёт максимальную длину буфера, используемого для получения параметра, и этот буфер возвращается как объект bytes. Отзывающемуся необходимо самостоятельно декодировать содержимое буфера (см. необязательный встроенный модульstructдля способа декодирования C-структур, закодированных в строках байтов).
-
socket.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. Значение необязательного аргумента flags см. в странице руководства Unix recv(2); по умолчанию он равен нулю.
Примечание
Для наилучшего соответствия аппаратным и сетевым реалиям значение bufsize должно быть относительно малой степенью двойки, например, 4096.
Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо повышения исключения
InterruptedError(см. PEP 475 для обоснования).
-
socket.recvfrom(bufsize[, flags]) -
Получает данные из сокета. Результат — пара
(bytes, address), где bytes — объект типа bytes, представляющий полученные данные, а address — адрес сокета, отправившего данные. Значение необязательного аргумента flags см. в странице руководства Unix recv(2); по умолчанию он равен нулю. (Формат address зависит от семейства адресов — см. выше).Изменено в версии 3.5: Если системный вызов прерывается, а обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо повышения исключения
InterruptedError(см. PEP 475 для обоснования).
-
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.fromstring(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 вместо создания новой строки bytes. Возвращаемое значение — пара
(nbytes, address), где nbytes — количество полученных байт, а address — адрес сокета, отправившего данные. Значение необязательного аргумента flags см. в странице руководства Unix recv(2); по умолчанию он равен нулю. (Формат address зависит от семейства адресов — см. выше.)
-
socket.recv_into(buffer[, nbytes[, flags]]) -
Получает до nbytes байт из сокета, сохраняя данные в буфере, а не создавая новую строку bytes. Если nbytes не указан (или равен 0), получает данные до размера, доступного в данном буфере. Возвращает количество полученных байт. Значение необязательного аргумента flags см. в странице руководства Unix recv(2); по умолчанию он равен нулю.
-
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 зависит от семейства адресов — см. выше).Изменено в версии 3.5: Если системный вызов прерывается, и обработчик сигнала не вызывает исключение, метод теперь повторно пытается выполнить системный вызов вместо того, чтобы генерировать исключение
InterruptedError(см. PEP 475 для обоснования).
-
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 — bytes-подобный объект, содержащий связанные данные. Обратите внимание, что некоторые системы (в частности, системы безCMSG_SPACE()) могут поддерживать отправку только одного управляющего сообщения за вызов. Аргумент flags по умолчанию равен 0 и имеет такое же значение, как дляsend(). Если address указан и неNone, он задаёт целевой адрес для сообщения. Возвращаемое значение — количество отправленных байтов не-дополнительных данных.Следующая функция отправляет список дескрипторов файлов fds через сокет
AF_UNIXна системах, которые поддерживают механизмSCM_RIGHTS. См. такжеrecvmsg().import socket, array def send_fds(sock, msg, fds): return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])Доступность: большинство платформ Unix, возможно, и другие.
Введено в версии 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 — ложь, сокет устанавливается в неблокирующий режим, иначе — в блокирующий режим.
Этот метод является сокращением для определённых вызовов
settimeout():-
sock.setblocking(True)эквивалентноsock.settimeout(None) -
sock.setblocking(False)эквивалентноsock.settimeout(0.0)
-
-
socket.settimeout(value) -
Установка таймаута для блокирующих операций с сокетом. Аргумент value может быть неотрицательным числом с плавающей точкой, выражающим секунды, или
None. Если задано ненулевое значение, последующие операции с сокетом сгенерируют исключениеtimeout, если истечёт заданный таймаут value до завершения операции. Если задано ноль, сокет переведён в неблокирующий режим. ЕслиNoneзадано, сокет переведён в блокирующий режим.Дополнительную информацию можно найти в примечаниях о таймаутах сокетов.
-
socket.setsockopt(level, optname, value: int)
-
socket.setsockopt(level, optname, value: buffer)
-
socket.setsockopt(level, optname, None, optlen: int) -
Установите значение заданного параметра сокета (см. страницу руководства Unix setsockopt(2)). Необходимые символьные константы определены в модуле
socket(SO_*и т. д.). Значение может быть целым числом,Noneили объектом типа байты, представляющим буфер. В последнем случае вызывающая сторона должна убедиться, что строка байтов содержит правильные биты (см. необязательный встроенный модульstructдля способа кодирования C-структур в строки байтов). Когда значение устанавливается вNone, аргумент optlen требуется. Он эквивалентен вызову C-функции setsockopt с optval=NULL и optlen=optlen.Изменено в версии 3.5: Теперь принимается изменяемый объект типа байты.
Изменено в версии 3.6: Добавлена форма setsockopt(level, optname, None, optlen: int).
-
socket.shutdown(how) -
Закрыть одну или обе половины соединения. Если how равно
SHUT_RD, дальнейшие приёмы запрещены. Если how равноSHUT_WR, дальнейшие отправки запрещены. Если how равноSHUT_RDWR, дальнейшие отправки и приёмы запрещены.
-
Создать дубликат сокета и подготовить его для совместного использования с целевым процессом. Целевой процесс должен быть предоставлен с помощью process_id. Полученный объект байтов можно затем передать целевому процессу с помощью какой-либо формы межпроцессного взаимодействия, и сокет можно восстановить там с помощью
fromshare(). После вызова этого метода сокет можно безопасно закрыть, так как операционная система уже продублировала его для целевого процесса.Доступность: Windows.
Введено в версии 3.3.
Обратите внимание, что нет методов read() или write(); используйте recv() и send() без аргумента flags вместо них.
Объекты сокетов также имеют эти (только для чтения) атрибуты, соответствующие значениям, переданным конструктору socket.
-
socket.family -
Семейство сокетов.
-
socket.type -
Тип сокета.
-
socket.proto -
Протокол сокета.
18.1.4. Замечания о тайм-аутах сокета
Объект сокета может быть в одном из трёх режимов: блокирующем, неблокирующем или с тайм-аутом. Сокеты по умолчанию всегда создаются в блокирующем режиме, но это можно изменить, вызвав setdefaulttimeout().
- В блокирующем режиме операции блокируются до завершения или возвращения ошибки системой (например, истечения времени ожидания соединения).
- В неблокирующем режиме операции завершаются ошибкой (к сожалению, зависящей от системы), если они не могут быть завершены немедленно: функции из модуля
selectмогут использоваться для определения того, когда и доступен ли сокет для чтения или записи. - В режиме тайм-аута операции завершаются ошибкой, если они не могут быть завершены в течение заданного тайм-аута для сокета (они генерируют исключение
timeout) или если система возвращает ошибку.
Примечание
На уровне операционной системы сокеты в режиме тайм-аута внутренне устанавливаются в неблокирующий режим. Кроме того, блокирующий и режимы тайм-аута совместно используются между дескрипторами файлов и объектами сокетов, которые ссылаются на один и тот же сетевой конечный пункт. Эта деталь реализации может иметь видимые последствия, например, если вы решили использовать fileno() сокета.
18.1.4.1. Тайм-ауты и метод connect
Операция connect() также подчиняется настройке тайм-аута, и в общем случае рекомендуется вызывать settimeout() перед вызовом connect() или передавать параметр тайм-аута в create_connection(). Однако, сетевой стек системы также может возвращать ошибку тайм-аута соединения независимо от любой настройки тайм-аута сокета Python.
18.1.4.2. Тайм-ауты и метод accept
Если getdefaulttimeout() не равно None, сокеты, возвращаемые методом accept(), наследуют этот тайм-аут. В противном случае поведение зависит от настроек сокета прослушивания:
- если сокет прослушивания находится в блокирующем режиме или в режиме тайм-аута, сокет, возвращённый методом
accept(), находится в блокирующем режиме; - если сокет прослушивания находится в неблокирующем режиме, режим сокета, возвращённого методом
accept(), зависит от операционной системы. Если вы хотите обеспечить кроссплатформенное поведение, рекомендуется вручную переопределить эту настройку.
18.1.5. Пример
Вот четыре минимальных примера программ с использованием протокола TCP/IP: сервер, который эхом отражает все полученные данные (обслуживающий только одного клиента), и клиент, использующий его. Обратите внимание, что сервер должен выполнить последовательность socket(), bind(), listen(), accept() (возможно, повторяя accept(), чтобы обслуживать более одного клиента), а клиенту нужно только последовательность socket(), connect(). Также обратите внимание, что сервер не выполняет sendall()/recv() на сокете прослушивания, а на новом сокете, возвращенном методом accept().
Первые два примера поддерживают только IPv4.
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
# Echo client program
import socket
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Следующие два примера идентичны вышеупомянутым, но поддерживают как IPv4, так и IPv6. Сторона сервера будет прослушивать первую доступную семейство адресов (она должна вместо этого прослушивать оба). На большинстве систем, готовых к IPv6, IPv6 будет иметь приоритет, и сервер может не принимать трафик IPv4. Клиентская сторона будет пытаться подключиться ко всем адресам, полученным в результате разрешения имени, и отправляет трафик первому успешно подключившемуся.
# Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.send(data)
# Echo client program
import socket
import sys
HOST = 'daring.cwi.nl' # The remote host
PORT = 50007 # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except OSError as msg:
s = None
continue
try:
s.connect(sa)
except OSError as msg:
s.close()
s = None
continue
break
if s is None:
print('could not open socket')
sys.exit(1)
with s:
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
Следующий пример показывает, как написать очень простой сетевой сниффер с сырыми сокетами в Windows. Для изменения интерфейса пример требует привилегий администратора:
import socket # the public network interface HOST = socket.gethostbyname(socket.gethostname()) # create a raw socket and bind it to the public interface s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) s.bind((HOST, 0)) # Include IP headers s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # receive all packages s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) # receive a package print(s.recvfrom(65565)) # disabled promiscuous mode s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
Последний пример показывает, как использовать интерфейс сокетов для связи с CAN-сетью, используя протокол сырого сокета. Чтобы использовать CAN с протоколом диспетчера широковещательной передачи вместо этого, откройте сокет с:
socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
После привязки (CAN_RAW) или подключения (CAN_BCM) сокета, вы можете использовать операции socket.send() и socket.recv() (и их аналоги) на объекте сокета как обычно.
Этот пример может потребовать специальных привилегий:
import socket
import struct
# CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)
can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)
def build_can_frame(can_id, data):
can_dlc = len(data)
data = data.ljust(8, b'\x00')
return struct.pack(can_frame_fmt, can_id, can_dlc, data)
def dissect_can_frame(frame):
can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
return (can_id, can_dlc, data[:can_dlc])
# create a raw socket and bind it to the 'vcan0' interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(('vcan0',))
while True:
cf, addr = s.recvfrom(can_frame_size)
print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))
try:
s.send(cf)
except OSError:
print('Error sending CAN frame')
try:
s.send(build_can_frame(0x01, b'\x01\x02\x03'))
except OSError:
print('Error sending CAN frame')
Запуск примера несколько раз с слишком коротким интервалом между запусками может привести к этой ошибке:
OSError: [Errno 98] Address already in use
Это происходит потому, что предыдущее выполнение оставило сокет в состоянии TIME_WAIT, и его нельзя немедленно повторно использовать.
Существует флаг socket для установки, чтобы предотвратить это, socket.SO_REUSEADDR:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT))
Флаг SO_REUSEADDR сообщает ядру о повторном использовании локального сокета в состоянии TIME_WAIT без ожидания его естественного тайм-аута.
См. также
Для введения в программирование сокетов (на C), см. следующие статьи:
- Вводный учебник по межпроцессной связи 4.3BSD, автором которого является Stuart Sechrest
- Расширенный учебник по межпроцессной связи 4.3BSD, авторами которого являются Samuel J. Leffler и др,
обе в Руководстве программиста UNIX, Дополнительные документы 1 (разделы PS1:7 и PS1:8). Платформенно-специфические справочные материалы по различным системным вызовам, связанным с сокетами, также являются ценным источником информации о деталях семантики сокетов. Для Unix, обратитесь к страницам руководства; для Windows, см. спецификацию WinSock (или Winsock 2). Для IPv6-совместимых API, читатели могут обратиться к RFC 3493 с названием «Основные расширения интерфейса сокетов для IPv6».
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/socket.html