Recvfrom python что это

Сокеты¶

Сокеты (англ. socket — разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения.

Принципы сокетов¶

Каждый процесс может создать слушающий сокет (серверный сокет) и привязать его к какому-нибудь порту операционной системы (в UNIX непривилегированные процессы не могут использовать порты меньше 1024). Слушающий процесс обычно находится в цикле ожидания, то есть просыпается при появлении нового соединения. При этом сохраняется возможность проверить наличие соединений на данный момент, установить тайм-аут для операции и т.д.

Каждый сокет имеет свой адрес. ОС семейства UNIX могут поддерживать много типов адресов, но обязательными являются INET-адрес и UNIX-адрес. Если привязать сокет к UNIX-адресу, то будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём чтения/записи из него (см. Доменный сокет Unix). Сокеты типа INET доступны из сети и требуют выделения номера порта.

Обычно клиент явно подсоединяется к слушателю, после чего любое чтение или запись через его файловый дескриптор будут передавать данные между ним и сервером.

Основные функции¶

Общие
SocketСоздать новый сокет и вернуть файловый дескриптор
SendОтправить данные по сети
ReceiveПолучить данные из сети
CloseЗакрыть соединение
Серверные
BindСвязать сокет с IP-адресом и портом
ListenОбъявить о желании принимать соединения. Слушает порт и ждет когда будет установлено соединение
AcceptПринять запрос на установку соединения
Клиентские
ConnectУстановить соединение

socket()¶

Создаёт конечную точку соединения и возвращает файловый дескриптор. Принимает три аргумента:

domain указывающий семейство протоколов создаваемого сокета

type

protocol

Протоколы обозначаются символьными константами с префиксом IPPROTO_* (например, IPPROTO_TCP или IPPROTO_UDP). Допускается значение protocol=0 (протокол не указан), в этом случае используется значение по умолчанию для данного вида соединений.

Функция возвращает −1 в случае ошибки. Иначе, она возвращает целое число, представляющее присвоенный дескриптор.

Связывает сокет с конкретным адресом. Когда сокет создается при помощи socket(), он ассоциируется с некоторым семейством адресов, но не с конкретным адресом. До того как сокет сможет принять входящие соединения, он должен быть связан с адресом. bind() принимает три аргумента:

Возвращает 0 при успехе и −1 при возникновении ошибки.

Автоматическое получение имени хоста.

listen()¶

Подготавливает привязываемый сокет к принятию входящих соединений. Данная функция применима только к типам сокетов SOCK_STREAM и SOCK_SEQPACKET. Принимает два аргумента:

После принятия соединения оно выводится из очереди. В случае успеха возвращается 0, в случае возникновения ошибки возвращается −1.

accept()¶

Используется для принятия запроса на установление соединения от удаленного хоста. Принимает следующие аргументы:

Функция возвращает дескриптор сокета, связанный с принятым соединением, или −1 в случае возникновения ошибки.

connect()¶

Устанавливает соединение с сервером.

Некоторые типы сокетов работают без установления соединения, это в основном касается UDP-сокетов. Для них соединение приобретает особое значение: цель по умолчанию для посылки и получения данных присваивается переданному адресу, позволяя использовать такие функции как send() и recv() на сокетах без установления соединения.

Загруженный сервер может отвергнуть попытку соединения, поэтому в некоторых видах программ необходимо предусмотреть повторные попытки соединения.

Возвращает целое число, представляющее код ошибки: 0 означает успешное выполнение, а −1 свидетельствует об ошибке.

Передача данных¶

Для передачи данных можно пользоваться стандартными функциями чтения/записи файлов read и write, но есть специальные функции для передачи данных через сокеты:

Нужно обратить внимание, что при использовании протокола TCP (сокеты типа SOCK_STREAM) есть вероятность получить меньше данных, чем было передано, так как ещё не все данные были переданы, поэтому нужно либо дождаться, когда функция recv возвратит 0 байт, либо выставить флаг MSG_WAITALL для функции recv, что заставит её дождаться окончания передачи. Для остальных типов сокетов флаг MSG_WAITALL ничего не меняет (например, в UDP весь пакет = целое сообщение).

Источник

Recvfrom python что это

Recvfrom python что это. Смотреть фото Recvfrom python что это. Смотреть картинку Recvfrom python что это. Картинка про Recvfrom python что это. Фото Recvfrom python что это

ОБЗОР

ОПИСАНИЕ

При успешном выполнении все три вызова возвращают длину сообщения. Если сообщение слишком длинное и не поместилось в предоставленный буфер, лишние байты могут быть отброшены, в зависимости от типа сокета, на котором принимаются сообщения.

Для определения появления новых данных в сокете приложение может использовать select(2), poll(2) или epoll(7).

Аргумент флагов

Ошибка передаётся в виде структуры sock_extended_err:

В ee_errno содержится значение errno для ожидающей ошибки. В ee_origin содержится источник происхождения ошибки. Смысл остальных полей зависит от протокола. Макрос SOCK_EE_OFFENDER возвращает указатель на адрес сетевого объекта, породившего ошибку. Если этот адрес неизвестен, то поле sa_family структуры sockaddr содержит значение AF_UNSPEC, а прочие поля структуры sockaddr не определены. Содержимое пакета, вызвавшего ошибку, передаётся в виде обычных данных. Для локальных ошибок адрес не передаётся (это можно выяснить, проверив поле cmsg_len структуры cmsghdr). Для ошибок при приёме устанавливается флаг MSG_ERRQUEUE в msghdr. После того, как ошибка передана программе, следующая ошибка в очереди ошибок становится ожидающей ошибкой и передается программе при следующей операции на сокете. MSG_OOB Этот флаг запрашивает приём внеполосных данных, которые в противном случае не были бы получены в обычном потоке данных. Некоторые протоколы помещают данные повышенной срочности в начало очереди с обычными данными, и поэтому этот флаг не может использоваться с такими протоколами. MSG_PEEK Этот флаг заставляет выбрать данные из начала очереди приёма, но не удалять их оттуда. Таким образом, последующий вызов вернёт те же самые данные. MSG_TRUNC (начиная с Linux 2.2) Для «сырых» данных (AF_PACKET), дейтаграмм Интернета (начиная с Linux 2.4.27/2.6.8), netlink (начиная с Linux 2.6.22) и дейтаграмм UNIX (начиная с Linux 3.4) возвращает реальную длину пакета или дейтаграммы, даже если она была больше, чем предоставленный буфер.

Описание использования с потоковым сокетами Интернета смотрите в tcp(7).

MSG_WAITALL (начиная с Linux 2.2) Этим флагом включается блокирование операции до полной обработки запроса. Однако, этот вызов всё равно может вернуть меньше данных, чем было запрошено, если был пойман сигнал, произошла ошибка или разрыв соединения, или если начали поступать данные другого типа, не того, который был сначала.

recvfrom()

Если значение src_addr не равно NULL, и в нижележащем протоколе используется адрес источника сообщения, то адрес источника помещается в буфер, указанный в src_addr. В этом случае addrlen является аргументом-результатом. Перед вызовом ему должно быть присвоено значение длины буфера, связанного с src_addr. При возврате addrlen обновляется и содержит действительный размер адреса источника. Возвращаемый адрес обрезается, если предоставленный буфер слишком мал; в этом случае addrlen будет содержать значение большее, чем указывалось в вызове.

Если вызывающему адрес источника не нужен, то значение src_addr и addrlen должно быть равно NULL.

recvfrom(fd, buf, len, flags, NULL, 0));

recvmsg()

Поле msg_name указывает на выделенный вызывающим буфер, который используется для возврата адреса источника, если сокет не соединён. Вызывающий должен указать в msg_namelen размер этого буфера перед вызовом; при успешном выполнении вызова в msg_namelen будет содержаться длина возвращаемого адреса. Если приложению не нужно знать адрес источника, то в msg_name можно указать NULL.

В полях msg_iov и msg_iovlen описываются место приёма/передачи, обсуждаемые в readv(2).

Поле msg_control длиной msg_controllen указывает на буфер для других сообщений, связанных с управлением протоколом или на буфер для разнообразных вспомогательных данных. При вызове recvmsg() в поле msg_controllen должен указываться размер доступного буфера, чей адрес передан в msg_control; при успешном выполнении вызова в этом параметре будет находиться длина последовательности контрольных сообщений.

Сообщения имеют следующий вид:

К вспомогательным данным нужно обращаться только с помощью макросов, определённых в cmsg(3).

Например, этот механизм вспомогательных данных используется в Linux для передачи расширенных ошибок, флагов IP и файловых дескрипторов через доменные сокеты Unix.

При возврате из recvmsg() устанавливается значение поля msg_flags в msghdr. Оно может содержать несколько флагов:

MSG_EOR означает конец записи: возвращённые данные заканчивают запись (обычно используется вместе с сокетами типа SOCK_SEQPACKET). MSG_TRUNC означает, что хвостовая часть датаграммы была отброшена, потому что датаграмма была больше, чем предоставленный буфер. MSG_CTRUNC означает, что часть управляющих данных была отброшена из-за недостатка места в буфере вспомогательных данных. MSG_OOB возвращается для индикации получения внеполосных данных. MSG_ERRQUEUE означает, что были получены не данные, а расширенное сообщение об ошибке из очереди ошибок сокета.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Когда ответная сторона потока выполняет корректное отключение (shutdown), то возвращается 0 (обычный возврат «конец файла»).

В датаграмных сокетах некоторых доменов (например, доменах UNIX и Internet) разрешены датаграммы нулевой длины. При получении такой датаграммы возвращается значение 0.

Также значение 0 может возвращаться, если запрошенное количество принимаемых байт из потокового сокета равно 0.

ОШИБКИ

СООТВЕТСТВИЕ СТАНДАРТАМ

В POSIX.1 описаны только флаги MSG_OOB, MSG_PEEK и MSG_WAITALL.

ЗАМЕЧАНИЯ

В соответствие с POSIX.1 поле msg_controllen структуры msghdr должно иметь тип socklen_t, но в настоящее время в glibc оно имеет тип size_t.

В recvmmsg(2) можно найти информацию о специальном системном вызове Linux, который можно использовать для приёма нескольких датаграмм за один вызов.

Источник

recv и recvfrom, программирование сокетов с использованием python

Я новичок в Python и плохо знаком с программированием сокетов.

Я не совсем понимаю насчет socket.recvfrom() и socket.recv()

Как видно из приведенного выше примера, меня смущают цифры. Почему 2048 и 1024 для разных протоколов? Что представляют собой эти цифры? Пожалуйста, объясни. Я надеюсь, что я был достаточно ясен. Спасибо.

3 ответа

Почему 2048 и 1024 для разных протоколов?

Это очень произвольные числа и зависят от внедряемого протокола. И хотя номер TCP работает, указанный вами номер UDP, скорее всего, неверен.

Что касается 1024/2048, они представляют количество байтов, которые вы хотите принять. Вообще говоря, UDP имеет меньше накладных расходов, чем TCP, что позволяет получать больше данных, но это не является строгим правилом и в этом контексте практически ничтожно. Вы можете получить столько, сколько захотите. 4096 также распространено (для обоих).

Я думаю, что люди обычно используют recvfrom для UDP. Поскольку в TCP после установления соединения информация об адресе не изменяется и, следовательно, recvfrom всегда возвращает None для поля информации о соединении.

И в приведенном выше коде это будет ошибка в этой строке:

Потому что: recvfrom () возвращает (data, connection_information), а recv () возвращает только данные. Так что это вызовет ValueError, потому что вы пытаетесь распаковать не-кортежное значение.

1024 или 2048 просто определяет размер буфера, но он не ожидает именно столько данных перед возвратом. Например:

Очевидно, что данные, отправленные «отправителем», имеют длину менее 2048 байт, но вызов «recv» вернется сразу после получения данных, отправленных ему от «отправителя».

Источник

Объект Socket модуля socket в Python.

Атрибуты и методы, определяемые объектом Socket.

Содержание:

Socket.accept() :

Метод Socket.accept() принимает соединение.

Вновь созданный сокет не наследуется.

Socket.bind(address) :

Формат адреса зависит от семейства адресов.

Socket.close() :

Метод Socket.close() закрывает сокет.

После того, как данные из очереди будут сброшены, удаленный сокет не будет получать больше данных.

Socket.connect(address) :

Socket.connect_ex(address) :

Socket.detach() :

Метод Socket.detach() переводит объект сокета в закрытое состояние, не закрывая дескриптор файла.

Возвращает дескриптор файла, который может быть повторно использован для других целей.

Socket.dup() :

Socket.fileno() :

Socket.get_inheritable() :

Метод Socket.get_inheritable() получает наследуемый флаг дескриптора файла или дескриптора сокета.

Socket.getpeername() :

Метод Socket.getpeername() возвращает удаленный адрес, к которому подключен сокет.

Метод полезен, например, для определения номера порта удаленного сокета IPv4/v6. Формат возвращаемого адреса зависит от семейства адресов.

В некоторых системах эта функция не поддерживается.

Socket.getsockname() :

Метод Socket.getsockname() возвращает собственный адрес сокета.

Метод полезен, например, для определения номера порта сокета IPv4/v6. Формат возвращаемого адреса зависит от семейства адресов.

Socket.getsockopt(level, optname[, buflen]) :

Socket.getblocking() :

Socket.gettimeout() :

Socket.ioctl(control, option) :

Только для операционной системы Windows.

На других платформах могут использоваться общие функции | fcntl.fcntl() | и | fcntl.ioctl() |. Они принимают объект сокета в качестве своего первого аргумента.

Socket.listen([backlog]) :

Метод Socket.listen() переводит сервер для приема подключений.

Аргумент backlog указывает количество подключений, которые система поставит в очередь, перед отказом от новых подключений. Если не указано, то выбирается разумное значение по умолчанию.

Socket.makefile(mode=’r’, buffering=None, *, encoding=None, errors=None, newline=None) :

Сокет должен находиться в режиме блокировки. У него может быть установлен тайм-аут, но при этом, внутренний буфер файлового объекта может оказаться в несогласованном состоянии, если произойдет этот тайм-аут.

Socket.recv(bufsize[, flags]) :

Примечание. Для наилучшего соответствия с аппаратными и сетевыми реалиями значение bufsize должно быть относительно небольшим, например 4096.

Socket.recvfrom(bufsize[, flags]) :

Socket.recvmsg(bufsize[, ancbufsize[, flags]]) :

Метод Socket.recvmsg() получает обычные данные до bufsize байтов и вспомогательные данные из сокета.

Некоторые системы не указывают усеченную длину элементов вспомогательных данных, которые были получены только частично. Если кажется, что элемент выходит за пределы конца буфера, то Socket.recvmsg() выдаст RuntimeWarning и вернет его часть, которая находится внутри буфера, при условии, что элемент не был усечен до начала связанных с ним данных.

Доступность: большинство платформ Unix, возможно, и другие.

Socket.recvmsg_into(buffers[, ancbufsize[, flags]]) :

Аргумент buffers должен быть итерацией объектов, экспортирующих записываемые буферы, например объекты bytearray ). Они будут заполняться последовательными фрагментами нормальных данных до тех пор, пока все они не будут записаны или пока buffers больше не останется. Операционная система может установить ограничение ( os.sysconf() со значением SC_IOV_MAX ) на количество буферов, которые могут быть использованы.

Доступность: большинство платформ Unix, возможно, и другие.

Socket.recvfrom_into(buffer[, nbytes[, flags]]) :

Метод Socket.recvfrom_into() получает данные из сокета, записывая их в буфер вместо создания новой строки байтов.

Socket.recv_into(buffer[, nbytes[, flags]]) :

Если nbytes не указан или равен 0, то получает до размера, доступного в данном буфере. Возвращает количество полученных байтов.

Socket.send(bytes[, flags]) :

Метод Socket.send() отправляет данные в сокет. Отправляющий сокет должен быть подключен к удаленному сокету.

Необязательный аргумент flags имеет то же значение, что и для метода Socket.recv() выше.

Возвращает количество отправленных байтов. Приложения несут ответственность за проверку того, что все данные были отправлены. Если была передана только часть данных, то приложению необходимо попытаться доставить оставшиеся данные.

Для получения дополнительной информации по этой теме обратитесь к разделу «Рекомендации по программированию сокетов».

Socket.sendall(bytes[, flags]) :

Метод Socket.sendall() отправляет данные в сокет. Отправляющий сокет должен быть подключен к удаленному сокету.

Необязательный аргумент flags имеет то же значение, что и для метода Socket.recv() выше.

Socket.sendto(bytes, address)
Socket.sendto(bytes, flags, address) :

Необязательный аргумент flags имеет то же значение, что и для метода Socket.recv() выше.

Socket.sendmsg(buffers[, ancdata[, flags[, address]]]) :

Метод Socket.sendmsg() отправляет обычные и вспомогательные данные в сокет, собирая обычные данные из ряда буферов и объединяя их в одно сообщение.

Обратите внимание, что некоторые системы (в частности, системы без socket.CMSG_SPACE() ) могут поддерживать отправку только одного управляющего сообщения за вызов.

Необязательный аргумент flags имеет то же значение, что и для метода Socket.recv() выше.

Метод Socket.sendmsg() возвращает количество отправленных байтов обычных данных.

Доступность: большинство платформ Unix, возможно, другие.

Socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]]) :

Доступность: Linux >= 2.6.38.

Socket.send_fds(sock, buffers, fds[, flags[, address]]) :

Параметр fds представляет собой последовательность файловых дескрипторов.

Socket.recv_fds(sock, bufsize, maxfds[, flags]) :

Обратите внимание на любые усеченные целые числа в конце списка файловых дескрипторов.

Socket.sendfile(file, offset=0, count=None) :

Метод Socket.sendfile() отправляет файл до тех пор, пока не будет достигнут EOF с помощью высокопроизводительной системной функции os.sendfile и возвращает общее количество отправленных байтов.

Аргумент offset указывает, откуда начать чтение файла.

Socket.set_inheritable(inheritable) :

Метод Socket.set_inheritable() устанавливает наследуемый флаг inheritable файлового дескриптора сокета или дескриптора сокета.

Socket.setblocking(flag) :

Этот метод является сокращением для некоторых вызовов Socket.settimeout() :

Socket.settimeout(value) :

Метод Socket.settimeout() устанавливает тайм-аут для блокировки операций сокета.

Для получения дополнительной информации смотрите «Примечания о тайм-аутах сокетов».

Socket.setsockopt(level, optname, value: int)
Socket.setsockopt(level, optname, value: buffer)
Socket.setsockopt(level, optname, None, optlen: int) :

Метод Socket.setsockopt() устанавливает значение value данной опции optname сокета (см. Страницу руководства Unix setsockopt (2)).

Socket.shutdown(how) :

Метод Socket.shutdown() отключает одну или обе половины соединения.

Socket.share(process_id) :

Метод Socket.share() копирует сокет и подготавливает его для совместного использования с целевым процессом.

После вызова этого метода можно безопасно закрыть сокет, поскольку операционная система уже продублировала его для целевого процесса.

Socket.family :

Атрибут Socket.family возвращает семейство сокетов (только для чтения).

Socket.type :

Атрибут Socket.type возвращает тип сокета (только для чтения).

Socket.proto :

Атрибут Socket.proto возвращает протокол на котором работает сокет (только для чтения).

Примечания о тайм-аутах сокетов.

Тайм-ауты и метод подключения.

Однако системный сетевой стек может также возвращать собственную ошибку тайм-аута соединения независимо от любого параметра тайм-аута сокета Python.

Источник

socket — Низкоуровневый сетевой интерфейс¶

Исходный код: Lib/socket.py

Модуль предоставляет доступ к сокетному BSD интерфейсу. Он доступен во всех современных системах Unix, Windows, MacOS и, возможно, на других платформах.

Незначительное отличие в поведении может зависеть от платформы, поскольку выполняются вызовы API-интерфейсов сокетов ОС.

Интерфейс Python представляет собой прямую транслитерацию системного вызова Unix и интерфейса библиотеки socket в объектно-ориентированный стиль Python: функция socket() возвращает объект сокета, методы которого реализуют различные системные вызовы сокетов. Типы параметров несколько более высокоуровневые, чем в интерфейсе C: как и в случае операций read() и write() с файлами Python, распределение буфера при операциях приёма происходит автоматически, а длина буфера неявна при операциях отправки.

Модуль socketserver Классы, упрощающие запись на сетевые серверы. Модуль ssl Обёртка TLS/SSL для сокетных объектов.

Семейства сокета¶

В зависимости от системы и параметров сборки данный модуль поддерживает различные семейства сокетов.

Формат адреса, требуемый конкретным объектом сокета, выбирается автоматически на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представлены следующим образом:

Изменено в версии 3.3: Ранее предполагалось, что пути сокетов AF_UNIX используют кодировку UTF-8.

Изменено в версии 3.7: Для многоадресных адресов (со значимым scopeid) address может не содержать части %scope (или zone id ). Эта информация является излишней и может пропускаться (рекомендуется).

Добавлено в версии 3.3.

AF_BLUETOOTH поддерживает следующие протоколы и форматы адресов:

Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.

Доступность : В Linux 2.6.38 для некоторых типов алгоритмов требуются более свежие ядра.

Добавлено в версии 3.6.

Доступность : Linux >= 4.8 QEMU >= 2.8 ESX >= 4.0 ESX Workstation >= 6.5.

Добавлено в версии 3.7.

Добавлено в версии 3.8.

Если вы используете имя хоста в части host адреса сокета IPv4/v6, программа может показывать недетерминированное поведение, поскольку Python использует первый адрес, возвращенный из разрешения DNS. Адрес сокета будет по-разному преобразован в фактический адрес IPv4/v6, в зависимости от результатов разрешения DNS и/или конфигурации хоста. Для детерминированного поведения использовать числовой адрес в части host.

Все ошибки вызывают исключения. Могут возникать обычные исключения для недопустимых типов аргументов и состояний нехватки памяти; начиная с Python 3.3, ошибки, связанные с семантикой сокета или адреса, вызывают OSError или один из его подклассов (раньше они вызывали socket.error ).

Содержание модуля¶

Модуль socket экспортирует следующие элементы.

Исключения¶

Константы¶

Добавлено в версии 3.4.

socket. SOCK_STREAM ¶ socket. SOCK_DGRAM ¶ socket. SOCK_RAW ¶ socket. SOCK_RDM ¶ socket. SOCK_SEQPACKET ¶

socket. SOCK_CLOEXEC ¶ socket. SOCK_NONBLOCK ¶

Две константы, если они определены, могут объединяться с типами сокетов и позволяют атомарно устанавливать некоторые флаги (что позволяет избежать возможных состояний гонки и необходимости в отдельных вызовах).

Добавлено в версии 3.2.

Многие константы этих форм, задокументированные в документации Unix по сокетам и/или протоколу IP, также определены в модуле socket. Обычно они используются в аргументах методов setsockopt() и getsockopt() объектов сокета. В большинстве случаев определяются только те символы, которые определены в файлах заголовков Unix; для нескольких символов предусмотрены значения по умолчанию.

Многие константы этих форм, задокументированные в документации Linux, также определены в модуле socket.

Добавлено в версии 3.3.

CAN_BCM, в семействе протоколов CAN, является протоколом менеджера вещания (BCM). Константы менеджера вещания, задокументированные в документации Linux, также определены в модуле socket.

Флаг CAN_BCM_CAN_FD_FRAME доступен только в Linux >= 4.8.

Добавлено в версии 3.4.

Включает поддержку CAN FD в сокете CAN_RAW. По умолчанию отключено. Позволяет вашему приложению отправлять кадры CAN и CAN FD; однако вы должны принимать кадры CAN и CAN FD при чтении из сокета.

Данная константа задокументирована в документации Linux.

Добавлено в версии 3.5.

CAN_ISOTP в семействе протоколов CAN является протоколом ISO-TP (ISO 15765-2). Константы ISO-TP, задокументированные в документации Linux.

Добавлено в версии 3.7.

Многие константы этих форм, задокументированные в документации Linux, также определены в модуле socket.

socket. AF_RDS ¶ socket. PF_RDS ¶ socket. SOL_RDS ¶ RDS_*

Многие константы этих форм, задокументированные в документации Linux, также определены в модуле socket.

Добавлено в версии 3.3.

Константы для Windows WSAIoctl(). Константы используются в качестве аргументов метода ioctl() для объектов сокета.

Константы, связанные с TIPC, совпадающие с константами, экспортируемыми API- интерфейсом C. См. документацию TIPC для получения дополнительной информации.

socket. AF_ALG ¶ socket. SOL_ALG ¶ ALG_*

Константы для криптографии ядра Linux.

Добавлено в версии 3.6.

Константы для связи хоста/гостя Linux.

Добавлено в версии 3.7.

Добавлено в версии 3.4.

Константа содержит логическое значение, которое указывает, поддерживается ли IPv6 на этой платформе.

socket. BDADDR_ANY ¶ socket. BDADDR_LOCAL ¶

socket. HCI_FILTER ¶ socket. HCI_TIME_STAMP ¶ socket. HCI_DATA_DIR ¶

Константа для протокола маршрутизатора IPC Qualcomm, используемая для связи с удаленными процессорами, предоставляющими услуги.

Функции¶

Создание сокета¶

socket. socket ( family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None ) ¶

Изменено в версии 3.3: Было добавлено семейство AF_CAN. Добавлено семейство AF_RDS.

Изменено в версии 3.4: Добавлен протокол CAN_BCM.

Изменено в версии 3.4: Возвращенный сокет теперь не наследуется.

Изменено в версии 3.7: Добавлен протокол CAN_ISOTP.

Изменено в версии 3.2: Возвращенные объекты сокета теперь поддерживают весь API сокета, а не его подмножество.

Изменено в версии 3.4: Возвращенные сокеты теперь не наследуются.

Изменено в версии 3.5: Добавлена поддержка Windows.

Изменено в версии 3.2: Был добавлен source_address.

Удобная функция, которая создаёт TCP сокет, привязанный к address (2-кортеж (host, port) ), и возвращает объект сокета.

На платформах POSIX параметр сокета SO_REUSEADDR устанавливается для немедленного повторного использования предыдущих сокетов, которые были привязаны к тому же address и оставались в состоянии TIME_WAIT.

Добавлено в версии 3.8.

Добавлено в версии 3.8.

Дубликат файлового дескриптора fd (целое число, возвращаемое методом fileno() файлового объекта) и создать объект сокета из результата. Семейство адресов, тип сокета и номер протокола такие же, как для функции socket() выше. Дескриптор файла должен ссылаться на сокет, но это не проверяется — последующие операции над объектом могут завершиться неудачно, если дескриптор файла недействителен. Данная функция редко требуется, но может использоваться для получения или установки параметров сокета для сокета, передаваемого программе в качестве стандартного ввода или вывода (например, сервера, запущенного демоном inet Unix). Предполагается, что сокет находится в режиме блокировки.

Изменено в версии 3.4: Возвращенный сокет теперь не наследуется.

Добавлено в версии 3.3.

Прочие функции¶

Модуль socket также предлагает различные сетевые сервисы:

Добавлено в версии 3.7.

Аргументы family, type и proto могут дополнительно указываться, чтобы сузить список возвращаемых адресов. Передача нуля в качестве значения для каждого из этих аргументов выбирает полный диапазон результатов. Аргумент flags может быть одной или несколькими константами AI_* и будет влиять на то, как вычисляются и возвращаются результаты. Например, AI_NUMERICHOST отключит разрешение доменного имени и вызовет ошибку, если host — доменное имя.

Функция возвращает список из 5 кортежей со следующей структурой:

(family, type, proto, canonname, sockaddr)

В следующем примере выполняется выборка адресной информации для гипотетического TCP-соединения с example.org через порт 80 (результаты могут отличаться в вашей системе, если IPv6 не включён):

Изменено в версии 3.2: параметры теперь можно передавать с помощью ключевых аргументов.

socket. gethostbyname ( hostname ) ¶

socket. gethostbyname_ex ( hostname ) ¶

Вернуть строку, содержащую имя хоста компьютера, на котором в настоящее время выполняется интерпретатор Python.

Поднимает событие аудита socket.gethostname без аргументов.

socket. gethostbyaddr ( ip_address ) ¶

socket. getnameinfo ( sockaddr, flags ) ¶

Для адресов IPv6 %scope добавляется к части хоста, если sockaddr содержит значимый scopeid. Обычно это происходит с многоадресными адресами.

Для получения дополнительной информации о flags вы можете обратиться к getnameinfo(3).

socket. getprotobyname ( protocolname ) ¶

Преобразовать 32-битные положительные целые числа из сети в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с порядком байтов в сети, это не работает; в противном случае выполняется операция перестановки 4 байтов.

Преобразовать 16-битные положительные целые числа из сети в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с порядком байтов в сети, это не работает; в противном случае он выполняет 2-байтовую операцию обмена.

Не рекомендуется, начиная с версии 3.7: В случае, если x не помещается в 16-битное целое число без знака, но подходит к положительному C int, оно автоматически усекается до 16-битного целого числа без знака. Эта функция тихого усечения устарела и вызовет исключение в будущих версиях Python.

Преобразовать 32-битные положительные целые числа из хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с порядком байтов в сети, это не работает; в противном случае выполняется операция перестановки 4 байтов.

Преобразовать 16-битные положительные целые числа из хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с порядком байтов в сети, это не работает; в противном случае он выполняет 2-байтовую операцию обмена.

Не рекомендуется, начиная с версии 3.7: В случае, если x не помещается в 16-битное целое число без знака, но подходит к положительному C int, оно автоматически усекается до 16-битного целого числа без знака. Эта функция тихого усечения устарела и вызовет исключение в будущих версиях Python.

inet_aton() также принимает строки с менее чем тремя точками; подробности см. на странице руководства Unix inet(3).

inet_aton() не поддерживает IPv6, и вместо него следует использовать inet_pton() для поддержки двойного стека IPv4/v6.

socket. inet_ntoa ( packed_ip ) ¶

Доступность : Unix (возможно, не все платформы), Windows.

Изменено в версии 3.4: Добавлена поддержка Windows

Доступность : Unix (возможно, не все платформы), Windows.

Изменено в версии 3.4: Добавлена поддержка Windows

Доступность : большинство платформ Unix, возможно, другие.

Добавлено в версии 3.3.

Обратите внимание, что некоторые системы могут поддерживать вспомогательные данные без предоставления этой функции. Также обратите внимание, что установка размера буфера с использованием результатов этой функции может не точно ограничивать объем вспомогательных данных, которые могут быть получены, поскольку дополнительные данные могут уместиться в области заполнения.

Доступность : большинство платформ Unix, возможно, другие.

Добавлено в версии 3.3.

socket. setdefaulttimeout ( timeout ) ¶

socket. sethostname ( name ) ¶

Добавлено в версии 3.3.

Возвращает список кортежей с информацией о сетевом интерфейсе (индекс int, строка имени). OSError в случае сбоя системного вызова.

Добавлено в версии 3.3.

Изменено в версии 3.8: Добавлена поддержка Windows.

В Windows у сетевых интерфейсов разные имена в разных контекстах (все имена являются примерами):

Добавлено в версии 3.3.

Изменено в версии 3.8: Добавлена поддержка Windows.

Добавлено в версии 3.3.

Изменено в версии 3.8: Добавлена поддержка Windows.

Объекты сокета¶

Изменено в версии 3.4: Сокет теперь не наследуется.

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).

Привязать сокет к address. Сокет ещё не должен быть привязан. (Формат address зависит от семейства адресов, см. выше.)

Подключиться к удаленному сокету по address. (Формат address зависит от семейства адресов, см. выше.)

Перевести объект сокета в закрытое состояние, не закрывая дескриптор файла. Возвращается файловый дескриптор, который может повторно использоваться для других целей.

Добавлено в версии 3.2.

Изменено в версии 3.4: Сокет теперь не наследуется.

В Windows малое целое число, возвращаемое этим методом, нельзя использовать там, где можно использовать дескриптор файла (например, os.fdopen() ). Unix не содержит этого ограничения.

Добавлено в версии 3.4.

Вернуть удаленный адрес, к которому подключён сокет. Полезно, например, для определения номера порта удаленного сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов, см. выше.) В некоторых системах функция не поддерживается.

Вернуть собственный адрес сокета. Полезно, например, для определения номера порта сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов, см. выше.)

Добавлено в версии 3.7.

socket. ioctl ( control, option ) ¶

Platform:Windows

Метод ioctl() — ограниченный интерфейс для системного интерфейса WSAIoctl. Пожалуйста, обратитесь к документации по Win32 для получения дополнительной информации.

На других платформах могут использоваться общие функции fcntl.fcntl() и fcntl.ioctl() ; они принимают объект сокета в качестве своего первого аргумента.

Разрешить серверу принимать соединения. Если указано backlog, оно должно быть не менее 0 (если меньше, устанавливается на 0); он определяет количество неприемлемых подключений, которое система разрешит до отказа от новых подключений. Если не указано, выбирается разумное значение по умолчанию.

Изменено в версии 3.5: Параметр backlog теперь необязателен.

Сокет должен находиться в режиме блокировки; у него может быть тайм-аут, но внутренний буфер файлового объекта может оказаться в несогласованном состоянии, если произойдёт тайм-аут.

Получать данные из сокета. Возвращаемое значение — байтовый объект, представляющий полученные данные. Максимальный объем данных, который должен быть получен за один раз, определяется параметром bufsize. См. страницу руководства Unix recv(2) для получения информации о значениях необязательных аргументов flags; по умолчанию он равен нулю.

Для наилучшего соответствия с аппаратными и сетевыми реалиями значение bufsize должно быть относительно небольшим, равным 2, например 4096.

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).

Некоторые системы не указывают усеченную длину элементов вспомогательных данных, которые были получены только частично. Если кажется, что элемент выходит за пределы буфера, recvmsg() поднимет RuntimeWarning и вернёт его часть, которая находится внутри буфера, при условии, что она не была усечена до начала связанных с ним данных.

Доступность : большинство платформ Unix, возможно, другие.

Добавлено в версии 3.3.

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).

Доступность : большинство платформ Unix, возможно, другие.

Добавлено в версии 3.3.

Получать до nbytes байт из сокета, сохраняя данные в буфере, а не создавая новую строку байтов. Если nbytes не указан (или 0), получить до размера, доступного в данном буфере. Возвращает количество полученных байтов. См. страницу руководства Unix recv(2), чтобы узнать о значениях необязательных аргументов flags; по умолчанию он равен нулю.

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).

Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается каждый раз, когда данные отправляются успешно. Тайм-аут сокета теперь является максимальной общей продолжительностью отправки всех данных.

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).

Отправить данные в сокет. Сокет не должен подключаться к удаленному сокету, т. к. сокет назначения указан по address. У необязательного аргумента flags то же значение, что и для recv() выше. Возвращает количество отправленных байтов. (Формат address зависит от семейства адресов, см. выше.)

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).

Доступность : большинство платформ Unix, возможно, другие.

Добавлено в версии 3.3.

Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (объяснение см. в PEP 475).

Добавлено в версии 3.6.

Добавлено в версии 3.5.

Установить наследуемый флаг дескриптора файла сокета или дескриптора сокета.

Добавлено в версии 3.4.

Установить блокирующий или неблокирующий режим сокета: если flag ложен, сокет установлен в неблокирующий режим, в противном случае — в режим блокировки.

Метод является сокращением для некоторых вызовов settimeout() :

Изменено в версии 3.6: Добавлена форма setsockopt(level, optname, None, optlen: int).

socket. share ( process_id ) ¶

Добавлено в версии 3.3.

Обратите внимание, что нет методов read() или write() ; вместо этого использовать recv() и send() без аргумента flags.

Примечания относительно тайм-аутов сокетов¶

Таймауты и метод connect ¶

Таймауты и метод accept ¶

Пример¶

Первые два примера поддерживают только IPv4.

Следующие два примера идентичны двум предыдущим, но поддерживают как IPv4, так и IPv6. Сторона сервера будет прослушивать первое доступное семейство адресов (вместо этого она должна прослушивать оба). В большинстве систем с поддержкой IPv6 IPv6 будет приоритетнее, и сервер может не принимать трафик IPv4. Клиентская сторона попытается подключиться ко всем адресам, полученным в результате разрешения имён, и отправит трафик на первый успешно подключенный.

В следующем примере показано, как написать очень простой сетевой сниффер с необработанными (сырыми) сокетами в Windows. В примере требуются права администратора для изменения интерфейса:

В следующем примере показано, как использовать интерфейс сокета для связи с сетью CAN с использованием протокола сырых сокетов. Чтобы вместо этого использовать CAN с протоколом менеджера вещания, открыть сокет с помощью:

После привязки ( CAN_RAW ) или подключения ( CAN_BCM ) сокета вы можете использовать операции socket.send() и socket.recv() (и их аналоги) для объекта сокета как обычно.

В этом последнем примере могут потребоваться особые привилегии:

Выполнение примера несколько раз со слишком малой задержкой между выполнениями может привести к этой ошибке:

Это связано с тем, что предыдущее выполнение оставило сокет в состоянии TIME_WAIT и не может немедленно повторно использовано.

Введение в программирование сокетов (на C) см. в следующих статьях:

оба в руководстве программиста UNIX, дополнительные документы 1 (разделы PS1: 7 и PS1: 8). Справочные материалы для различных платформ, относящиеся к системным вызовам, связанным с сокетами, также являются ценным источником информации о деталях семантики сокетов. Для Unix см. справочные страницы; для Windows см. спецификацию WinSock (или Winsock 2). Для интерфейсов API с поддержкой IPv6 читатели могут захотеть обратиться к RFC 3493, озаглавленному «Расширения базового интерфейса сокетов для IPv6».

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *