Документация Python неофициальный перевод
Содержание страницы

17.2. socket – Низкоуровневый сетевой интерфейсsocket – Low-level networking interface

Этот модуль предоставляет доступ к интерфейсу BSD socket. Он доступен на всех современных системах Unix, Windows, Mac OS X, BeOS, OS/2 и, вероятно, на других платформах.

Примечание

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

Для введения в программирование сокетов (на C) см. следующие статьи: «An Introductory 4.3BSD Interprocess Communication Tutorial» (Стюарт Сечрест) и «An Advanced 4.3BSD Interprocess Communication Tutorial» (Сэмюэл Дж. Леффлер и др.), обе в UNIX Programmer’s Manual, Supplementary Documents 1 (разделы PS1:7 и PS1:8). Справочные материалы, специфичные для платформы, по различным системным вызовам сокетов также являются ценным источником информации о деталях семантики сокетов. Для Unix обратитесь к man-страницам; для Windows – к спецификации WinSock (или Winsock 2). Для API, поддерживающих IPv6, читателям рекомендуется обратиться к RFC 3493 под названием «Basic Socket Interface Extensions for IPv6».

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

Сокетные адреса представляются следующим образом: для семейства адресов AF_UNIX используется одна строка. Пара (host, port) используется для семейства адресов AF_INET, где host – это строка, представляющая либо имя хоста в доменной нотации, например 'daring.cwi.nl', либо IPv4-адрес, например '100.50.200.5', а port – целое число. Для семейства адресов AF_INET6 используется кортеж из четырёх элементов (host, port, flowinfo, scopeid), где flowinfo и scopeid представляют члены sin6_flowinfo и sin6_scope_id в struct sockaddr_in6 в C. Для методов модуля socket flowinfo и scopeid могут быть опущены для обратной совместимости. Однако обратите внимание, что опущение scopeid может вызвать проблемы при работе с адресами IPv6 с областью действия. Другие семейства адресов в настоящее время не поддерживаются. Формат адреса, требуемый конкретным сокетным объектом, автоматически выбирается на основе семейства адресов, указанного при создании сокетного объекта.

Для IPv4-адресов вместо адреса хоста принимаются две специальные формы: пустая строка представляет INADDR_ANY, а строка '<broadcast>' представляет INADDR_BROADCAST. Это поведение недоступно для IPv6 для обратной совместимости, поэтому, если вы планируете поддерживать IPv6 в своих программах на Python, возможно, стоит избегать этих форм.

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

Новое в версии 2.5: Сокеты AF_NETLINK представляются в виде пар pid, groups.

Новое в версии 2.6: Поддержка только для 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.

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

Неблокирующий режим поддерживается через setblocking(). Его обобщение на основе тайм-аутов поддерживается через settimeout().

Модуль socket предоставляет следующие константы и функции:

exception socket.error

Это исключение возникает при ошибках, связанных с сокетами. Сопутствующее значение – это либо строка, описывающая ошибку, либо пара (errno, string), представляющая ошибку, возвращённую системным вызовом, аналогично значению, сопровождающему os.error. Смотрите модуль errno, который содержит имена для кодов ошибок, определённых базовой операционной системой.

Изменено в версии 2.6: socket.error теперь является дочерним классом IOError.

exception socket.herror

Это исключение возникает при ошибках, связанных с адресами, т.е. для функций, использующих h_errno в C API, включая gethostbyname_ex() и gethostbyaddr().

Сопутствующее значение – это пара (h_errno, string), представляющая ошибку, возвращённую вызовом библиотеки. string представляет описание h_errno, как возвращено функцией C hstrerror().

exception socket.gaierror

Это исключение возникает при ошибках, связанных с адресами, для getaddrinfo() и getnameinfo(). Сопутствующее значение – это пара (error, string), представляющая ошибку, возвращённую вызовом библиотеки. string представляет описание error, как возвращено функцией C gai_strerror(). Значение error будет соответствовать одной из констант EAI_*, определённых в этом модуле.

exception socket.timeout

Это исключение возникает при тайм-ауте на сокете, на котором тайм-ауты были включены предыдущим вызовом settimeout(). Сопутствующее значение – это строка, значение которой в настоящее время всегда «timed out».

Новое в версии 2.3.

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.)

SO_*
socket.SOMAXCONN
MSG_*
SOL_*
IPPROTO_*
IPPORT_*
INADDR_*
IP_*
IPV6_*
EAI_*
AI_*
NI_*
TCP_*

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

SIO_*
RCVALL_*

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

Новое в версии 2.6.

TIPC_*

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

Новое в версии 2.6.

socket.has_ipv6

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

Новое в версии 2.3.

socket.create_connection(address[, timeout[, source_address]])

Подключается к TCP-службе, прослушивающей адрес в интернете (кортеж из двух элементов (host, port)), и возвращает объект сокета. Это функция более высокого уровня, чем socket.connect(): если host – нечисловое имя узла, он будет пытаться разрешить его как для AF_INET, так и для AF_INET6, а затем пытаться подключаться ко всем возможным адресам по очереди, пока подключение не установится. Это упрощает написание клиентов, совместимых как с IPv4, так и с IPv6.

Передача необязательного параметра timeout установит тайм-аут для экземпляра сокета перед попыткой подключения. Если timeout не указан, используется глобальная настройка тайм-аута по умолчанию, возвращаемая getdefaulttimeout().

Если указан, source_address должен быть кортежем из двух элементов (host, port), к которому сокет должен привязаться как к своему исходному адресу перед подключением. Если хост или порт равны '' или 0 соответственно, будет использовано поведение ОС по умолчанию.

Новое в версии 2.6.

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

socket.getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]])

Преобразует аргументы host/port в последовательность кортежей из 5 элементов, содержащих все необходимые аргументы для создания сокета, подключенного к этому сервису. host – это доменное имя, строковое представление IPv4/v6-адреса или None. port – это строковое имя службы, такое как 'http', числовой номер порта или None. Передавая None в качестве значения host и port, можно передать NULL в базовый C API.

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

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

(family, socktype, proto, canonname, sockaddr)

В этих кортежах family, socktype, proto – целые числа и предназначены для передачи в функцию socket(). canonname будет строкой, представляющей каноническое имя хоста, если AI_CANONNAME является частью аргумента flags; в противном случае canonname будет пустым. sockaddr – это кортеж, описывающий сокетный адрес, формат которого зависит от возвращаемого family (кортеж из 2 элементов (address, port) для AF_INET, кортеж из 4 элементов (address, port, flow info, scope id) для AF_INET6), и предназначен для передачи в метод socket.connect().

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

>>> socket.getaddrinfo("example.org", 80, 0, 0, socket.IPPROTO_TCP)
[(10, 1, 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),
 (2, 1, 6, '', ('93.184.216.34', 80))]

Новое в версии 2.2.

socket.getfqdn([name])

Возвращает полностью определённое доменное имя для name. Если name опущен или пуст, он интерпретируется как локальный хост. Для поиска полного имени сначала проверяется имя хоста, возвращаемое gethostbyaddr(), затем, если доступны, псевдонимы хоста. Выбирается первое имя, содержащее точку. Если полностью определённое доменное имя недоступно, возвращается имя хоста, полученное от gethostname().

Новое в версии 2.0.

socket.gethostbyname(hostname)

Преобразует имя хоста в формат IPv4-адреса. IPv4-адрес возвращается в виде строки, например '100.50.200.5'. Если имя хоста само является IPv4-адресом, оно возвращается без изменений. См. gethostbyname_ex() для более полного интерфейса. gethostbyname() не поддерживает разрешение имён IPv6, вместо него для поддержки двойного стека IPv4/v6 следует использовать getaddrinfo().

socket.gethostbyname_ex(hostname)

Преобразует имя хоста в формат IPv4-адреса (расширенный интерфейс). Возвращает тройку (hostname, aliaslist, ipaddrlist), где hostname – основное имя хоста, отвечающее на заданный ip_address; aliaslist – (возможно пустой) список альтернативных имён хоста для того же адреса; и ipaddrlist – список IPv4-адресов для того же интерфейса на том же хосте (часто, но не всегда, один адрес). gethostbyname_ex() не поддерживает разрешение имён IPv6, а для поддержки IPv4/IPv6 двойного стека следует использовать getaddrinfo().

socket.gethostname()

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

Если вы хотите узнать IP-адрес текущей машины, можно использовать gethostbyname(gethostname()). Эта операция предполагает, что для хоста существует допустимое отображение адреса на хост, однако это предположение не всегда выполняется.

Примечание: 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 в кортеж из двух элементов (host, port). В зависимости от настроек flags результат может содержать полное доменное имя или числовое представление адреса в host. Аналогично, port может содержать строковое имя порта или числовой номер порта.

Новое в версии 2.2.

socket.getprotobyname(protocolname)

Преобразует имя интернет-протокола (например, 'icmp') в константу, пригодную для передачи в качестве (необязательного) третьего аргумента функции socket(). Обычно это требуется только для сокетов, открытых в «сыром» режиме (SOCK_RAW); для обычных режимов сокетов правильный протокол выбирается автоматически, если протокол опущен или равен нулю.

socket.getservbyname(servicename[, protocolname])

Преобразует имя интернет-службы и имя протокола в номер порта для этой службы. Необязательное имя протокола, если указано, должно быть 'tcp' или 'udp', в противном случае подойдет любой протокол.

socket.getservbyport(port[, protocolname])

Преобразует номер порта интернет-службы и имя протокола в имя службы для этой службы. Необязательное имя протокола, если указано, должно быть 'tcp' или 'udp', в противном случае подойдет любой протокол.

socket.socket([family[, type[, proto]]])

Создаёт новый сокет с указанным семейством адресов, типом сокета и номером протокола. Семейство адресов должно быть AF_INET (по умолчанию), AF_INET6 или AF_UNIX. Тип сокета должен быть SOCK_STREAM (по умолчанию), SOCK_DGRAM или, возможно, одной из других констант SOCK_. Номер протокола обычно равен нулю и в этом случае может быть опущен.

socket.socketpair([family[, type[, proto]]])

Создаёт пару связанных объектов сокета, используя заданные семейство адресов, тип сокета и номер протокола. Семейство адресов, тип сокета и номер протокола такие же, как для функции socket() выше. Семейство по умолчанию – AF_UNIX, если оно определено на платформе; в противном случае по умолчанию используется AF_INET. Доступность: Unix.

Новое в версии 2.4.

socket.fromfd(fd, family, type[, proto])

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

socket.ntohl(x)

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

socket.ntohs(x)

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

socket.htonl(x)

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

socket.htons(x)

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

socket.inet_aton(ip_string)

Преобразует IPv4-адрес из точечно-десятичного строкового формата (например, '123.45.67.89') в 32-битный упакованный двоичный формат в виде строки длиной четыре символа. Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа struct in_addr, который является типом C для 32-битных упакованных двоичных данных, возвращаемых этой функцией.

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

Если переданная функции строка IPv4-адреса недопустима, будет возбуждено socket.error. Обратите внимание: что именно считается допустимым, зависит от нижележащей C-реализации inet_aton().

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

socket.inet_ntoa(packed_ip)

Преобразует 32-битный упакованный IPv4-адрес (строку длиной четыре символа) в его стандартное точечно-десятичное строковое представление (например, '123.45.67.89'). Это полезно при взаимодействии с программой, использующей стандартную библиотеку C и требующей объекты типа struct in_addr, который является типом C для 32-битных упакованных двоичных данных, принимаемых этой функцией в качестве аргумента.

Если переданная этой функции строка имеет длину не ровно 4 байта, будет вызвано исключение socket.error. Функция inet_ntoa() не поддерживает IPv6, для поддержки двух стеков IPv4/v6 вместо неё следует использовать inet_ntop().

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 недопустима, будет возбуждено socket.error. Обратите внимание: что именно считается допустимым, зависит как от значения address_family, так и от нижележащей реализации inet_pton().

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

Новое в версии 2.3.

socket.inet_ntop(address_family, packed_ip)

Преобразует упакованный IP-адрес (строку из некоторого количества символов) в его стандартное строковое представление, зависящее от семейства (например, '7.10.0.5' или '5aef:2b::8'). Функция inet_ntop() полезна, когда библиотека или сетевой протокол возвращает объект типа struct in_addr (аналогичного inet_ntoa()) или struct in6_addr.

Поддерживаемые значения для параметра address_family в настоящее время: AF_INET и AF_INET6. Если строка packed_ip имеет неверную длину для указанного семейства адресов, будет вызвано исключение ValueError. Исключение socket.error вызывается при ошибках вызова inet_ntop().

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

Новое в версии 2.3.

socket.getdefaulttimeout()

Возвращает тайм-аут по умолчанию в секундах (число с плавающей запятой) для новых объектов сокетов. Значение None означает, что новые объекты сокетов не имеют тайм-аута. При первом импорте модуля socket значение по умолчанию равно None.

Новое в версии 2.3.

socket.setdefaulttimeout(timeout)

Устанавливает таймаут по умолчанию в секундах (число с плавающей точкой) для новых объектов сокета. Значение None означает, что новые объекты сокета не имеют таймаута. При первом импорте модуля socket значение по умолчанию равно None.

Новое в версии 2.3.

socket.SocketType

Это объект типа Python, представляющий тип объекта сокета. Он аналогичен type(socket(...)).

См. также

Модуль SocketServer

Классы, упрощающие написание сетевых серверов.

Модуль ssl

Обёртка TLS/SSL для объектов сокетов.

17.2.1. Сокетные объектыSocket Objects

Объекты сокета имеют следующие методы. За исключением makefile(), они соответствуют системным вызовам Unix, применимым к сокетам.

socket.accept()

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

socket.bind(address)

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

Примечание

Исторически этот метод принимал пару параметров для адресов AF_INET вместо одного кортежа. Это никогда не было задумано и больше не поддерживается в Python 2.0 и более поздних версиях.

socket.close()

Закрывает сокет. Все последующие операции с объектом сокета будут завершаться ошибкой. Удаленная сторона не получит больше данных (после сброса находящихся в очереди данных). Сокеты автоматически закрываются при сборке мусора.

Примечание

close() освобождает ресурс, связанный с соединением, но не обязательно немедленно закрывает соединение. Если требуется своевременно закрыть соединение, вызовите shutdown() перед close().

socket.connect(address)

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

Примечание

Исторически этот метод принимал пару параметров для адресов AF_INET вместо одного кортежа. Это никогда не было задумано и больше не поддерживается в Python 2.0 и более поздних версиях.

socket.connect_ex(address)

Как и connect(address), но возвращает индикатор ошибки вместо возбуждения исключения для ошибок, возвращаемых вызовом connect() на уровне C (другие проблемы, например «хост не найден», по-прежнему могут вызывать исключения). Индикатор ошибки равен 0, если операция выполнена успешно, в противном случае – значению переменной errno. Это удобно, например, для поддержки асинхронных подключений.

Примечание

Исторически этот метод принимал пару параметров для адресов AF_INET вместо одного кортежа. Это никогда не было задумано и больше не поддерживается в Python 2.0 и более поздних версиях.

socket.fileno()

Возвращает файловый дескриптор сокета (небольшое целое число). Это полезно совместно с select.select().

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

socket.getpeername()

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

socket.getsockname()

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

socket.getsockopt(level, optname[, buflen])

Возвращает значение заданной опции сокета (см. man-страницу Unix getsockopt(2)). Необходимые символические константы (SO_* и т.д.) определены в этом модуле. Если параметр buflen отсутствует, предполагается целочисленная опция, и функция возвращает её целое значение. Если параметр buflen присутствует, он задаёт максимальную длину буфера для получения опции, и этот буфер возвращается в виде строки. Разбор содержимого буфера возлагается на вызывающий код (см. опциональный встроенный модуль struct для декодирования структур C, закодированных в виде строк).

socket.ioctl(control, option)
Платформа

Windows

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

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

Новое в версии 2.6.

socket.listen(backlog)

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

socket.makefile([mode[, bufsize]])

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

Сокет должен быть в блокирующем режиме (не может иметь таймаут). Необязательные аргументы mode и bufsize интерпретируются так же, как и встроенной функцией file().

Примечание

В Windows файлоподобный объект, созданный makefile(), нельзя использовать там, где ожидается файловый объект с дескриптором файла, например, в аргументах потока subprocess.Popen().

socket.recv(bufsize[, flags])

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

Примечание

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

socket.recvfrom(bufsize[, flags])

Получает данные из сокета. Возвращаемое значение – пара (string, address), где string – строка с полученными данными, а address – адрес сокета, отправившего данные. См. страницу руководства Unix recv(2) для пояснения необязательного аргумента flags; по умолчанию он равен нулю. (Формат address зависит от семейства адресов – см. выше.)

socket.recvfrom_into(buffer[, nbytes[, flags]])

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

Новое в версии 2.5.

socket.recv_into(buffer[, nbytes[, flags]])

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

Новое в версии 2.5.

socket.send(string[, flags])

Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и для recv() выше. Возвращает количество отправленных байтов. Приложения должны проверять, что все данные отправлены; если передана только часть данных, приложению необходимо попытаться доставить оставшиеся данные. Дополнительную информацию об этой концепции см. в Socket Programming HOWTO.

socket.sendall(string[, flags])

Отправляет данные в сокет. Сокет должен быть подключён к удалённому сокету. Необязательный аргумент flags имеет то же значение, что и для recv() выше. В отличие от send(), этот метод продолжает отправлять данные из string до тех пор, пока не будут отправлены все данные или не возникнет ошибка. В случае успеха возвращается None. При ошибке возникает исключение, и нет способа определить, сколько данных (если вообще какие-то) было успешно отправлено.

socket.sendto(string, address)
socket.sendto(string, flags, address)

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

socket.setblocking(flag)

Устанавливает блокирующий или неблокирующий режим сокета: если flag равен 0, сокет переводится в неблокирующий режим, иначе – в блокирующий. Изначально все сокеты находятся в блокирующем режиме. В неблокирующем режиме, если вызов recv() не находит данных, или если вызов send() не может немедленно отправить данные, возникает исключение error; в блокирующем режиме вызовы блокируются, пока не смогут продолжить. s.setblocking(0) эквивалентно s.settimeout(0.0); s.setblocking(1) эквивалентно s.settimeout(None).

socket.settimeout(value)

Устанавливает тайм-аут для блокирующих операций с сокетом. Аргумент value может быть неотрицательным числом с плавающей точкой, задающим секунды, или None. Если передано число с плавающей точкой, последующие операции с сокетом будут вызывать исключение timeout, если время тайм-аута value истекло до завершения операции. Установка тайм-аута в None отключает тайм-ауты для операций с сокетом. s.settimeout(0.0) эквивалентно s.setblocking(0); s.settimeout(None) эквивалентно s.setblocking(1).

Новое в версии 2.3.

socket.gettimeout()

Возвращает тайм-аут в секундах (число с плавающей точкой), связанный с операциями с сокетом, или None, если тайм-аут не установлен. Это значение отражает последний вызов setblocking() или settimeout().

Новое в версии 2.3.

Некоторые замечания о блокировке сокетов и тайм-аутах: объект сокета может находиться в одном из трёх режимов: блокирующий, неблокирующий или с тайм-аутом. Сокеты всегда создаются в блокирующем режиме. В блокирующем режиме операции блокируются до завершения или до возврата системой ошибки (например, истекло время соединения). В неблокирующем режиме операции завершаются ошибкой (к сожалению, зависящей от системы), если их невозможно выполнить немедленно. В режиме тайм-аута операции завершаются ошибкой, если их невозможно выполнить за время тайм-аута, заданное для сокета, или если система возвращает ошибку. Метод setblocking() – это просто краткая форма для определённых вызовов settimeout().

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

Обратите внимание, что операция connect() подчиняется настройке тайм-аута, и в целом рекомендуется вызывать settimeout() перед вызовом connect() или передавать параметр тайм-аута в create_connection(). Системный сетевой стек может вернуть собственную ошибку тайм-аута соединения независимо от любых настроек тайм-аута сокета Python.

socket.setsockopt(level, optname, value)

Устанавливает значение указанной опции сокета (см. страницу руководства Unix setsockopt(2)). Необходимые символические константы определены в модуле socket (SO_* и т.д.). Значение может быть целым числом или строкой, представляющей буфер. В последнем случае вызывающий должен убедиться, что строка содержит правильные биты (см. опциональный встроенный модуль struct для способа кодирования C-структур в строки).

socket.shutdown(how)

Завершает одну или обе половины соединения. Если how равно SHUT_RD, дальнейший приём запрещён. Если how равно SHUT_WR, дальнейшая отправка запрещена. Если how равно SHUT_RDWR, дальнейшие отправка и приём запрещены. В зависимости от платформы, завершение одной половины соединения может также закрыть противоположную половину (например, на Mac OS X shutdown(SHUT_WR) не позволяет дальнейшее чтение на другом конце соединения).

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

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

socket.family

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

Новое в версии 2.5.

socket.type

Тип сокета.

Новое в версии 2.5.

socket.proto

Протокол сокета.

Новое в версии 2.5.

17.2.2. ПримерExample

Вот четыре минимальных примера программ, использующих протокол TCP/IP: сервер, который отправляет обратно все полученные данные (обслуживая только одного клиента), и использующий его клиент. Обратите внимание, что сервер должен выполнить последовательность socket(), bind(), listen(), accept() (возможно, повторяя accept() для обслуживания более одного клиента), в то время как клиенту нужна только последовательность socket(), connect(). Также обратите внимание, что сервер не вызывает sendall()/recv() на сокете, который слушает, а на новом сокете, возвращённом accept().

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

# Программа эхо-сервера
import socket

HOST = ''                 # Символическое имя, обозначающее все доступные интерфейсы
PORT = 50007              # Произвольный непривилегированный порт
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.sendall(data)
conn.close()
# Программа эхо-клиента
import socket

HOST = 'daring.cwi.nl'    # Удалённый хост
PORT = 50007              # Тот же порт, что и у сервера
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)

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

# Программа эхо-сервера
import socket
import sys

HOST = None               # Символическое имя, обозначающее все доступные интерфейсы
PORT = 50007              # Произвольный непривилегированный порт
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 socket.error as msg:
        s = None
        continue
    try:
        s.bind(sa)
        s.listen(1)
    except socket.error as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print 'could not open socket'
    sys.exit(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()
# Программа эхо-клиента
import socket
import sys

HOST = 'daring.cwi.nl'    # Удалённый хост
PORT = 50007              # Тот же порт, что и у сервера
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 socket.error as msg:
        s = None
        continue
    try:
        s.connect(sa)
    except socket.error as msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print 'could not open socket'
    sys.exit(1)
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)

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

import socket

# общедоступный сетевой интерфейс
HOST = socket.gethostbyname(socket.gethostname())

# создать сырой сокет и привязать его к общедоступному интерфейсу
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

# Включать IP-заголовки
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# принять все пакеты
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# принять пакет
print s.recvfrom(65565)

# неразборчивый режим отключён
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

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

socket.error: [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, не дожидаясь истечения его естественного тайм-аута.