Все методы объекта Socket
, за исключением метода Socket.makefile()
, соответствуют системным вызовам Unix, применимым к сокетам.
Объекты Socket
поддерживают протокол диспетчера контекста. Выход из диспетчера контекста эквивалентен вызову функции socket.close()
.
Socket.accept()
принимает соединение,Socket.bind()
привязывает сокет к адресу,Socket.close()
закрывает сокет,Socket.connect()
подключает к удаленному сокету,Socket.connect_ex()
работает подобно методу Socket.connect(address)
,Socket.detach()
переводит сокет в закрытое состояние,Socket.dup()
дублирует объект сокета,Socket.fileno()
возвращает файловый дескриптор сокета,Socket.get_inheritable()
получает наследуемый флаг дескриптора сокета,Socket.getpeername()
возвращает удаленный адрес,Socket.getsockname()
возвращает собственный адрес,Socket.getsockopt()
возвращает значение заданной опции сокета,Socket.getblocking()
проверяет режим блокировки,Socket.gettimeout()
возвращает значение тайм-аут,Socket.ioctl()
ограниченный интерфейс для WSAIoctl
,Socket.listen()
переводит сервер для приема подключений,Socket.makefile()
возвращает объект файла, связанный с сокетом,Socket.recv()
получает данные из сокета,Socket.recvfrom()
получает данные из сокета,Socket.recvmsg()
получает обычные и вспомогательные данные из сокета,Socket.recvmsg_into()
получает нормальные и вспомогательные данные из сокета,Socket.recvfrom_into()
получает данные из сокета,Socket.recv_into()
получает от сокета до nbytes
байтов,Socket.send()
отправляет данные в сокет,Socket.sendall()
отправляет данные в сокет,Socket.sendto()
отправляет данные в сокет,Socket.sendmsg()
отправляет обычные и вспомогательные данные в сокет,Socket.sendmsg_afalg()
специализированная версия Socket.sendmsg()
,Socket.send_fds()
отправляет через сокет список файловых дескрипторов,Socket.recv_fds()
получает до maxfds
файловых дескрипторов,Socket.sendfile()
отправляет файл до достижения EOF,Socket.set_inheritable()
устанавливает наследуемый флаг файлового дескриптора,Socket.setblocking()
устанавливает блокирующий или неблокирующий режим сокета,Socket.settimeout()
устанавливает тайм-аут для сокета,Socket.setsockopt()
устанавливает значение опции сокета,Socket.shutdown()
отключает одну или обе половины соединения,Socket.share()
копирует сокет и подготавливает его для использования с процессом,Socket.family
возвращает семейство сокетов,Socket.type
возвращает тип сокета,Socket.proto
возвращает протокол сокета,Socket.accept()
:Метод Socket.accept()
принимает соединение.
Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение - это пара (conn, address)
, где
conn
- это новый объект сокета, который можно использовать для отправки и получения данных в соединении, address
- это адрес, привязанный к сокету на другом конце соединения.Вновь созданный сокет не наследуется.
Socket.bind(address)
:Метод Socket.bind()
привязывает сокет к адресу address
. Сокет еще не должен быть привязан.
Формат адреса зависит от семейства адресов.
Вызывает событие аудита socket.bind
с аргументами self
, address
.
Socket.close()
:Метод Socket.close()
закрывает сокет.
Базовый системный ресурс (например, файловый дескриптор) также закрывается, когда закрываются все файловые объекты из Socket.makefile()
. Как только это произойдет, все будущие операции с объектом сокета завершатся ошибкой.
После того, как данные из очереди будут сброшены, удаленный сокет не будет получать больше данных.
Сокеты автоматически закрываются, когда они собираются сборщиком мусора, но рекомендуется явно закрыть их Socket.close()
или использовать для них оператор with
.
Изменено в Python 3.6: Если возникает ошибка при выполнении базового вызова Socket.close()
, то возникает исключение OSError
.
Обратите внимание, что Socket.close()
освобождает ресурс, связанный с соединением, но не обязательно немедленно закрывает соединение. Если необходимо своевременно закрыть соединение, то перед закрытием сокета Socket.close()
вызовите метод Socket.shutdown()
.
Socket.connect(address)
:Метод Socket.connect()
подключается к удаленному сокету по адресу address
. Формат адреса address
зависит от семейства адресов.
Если соединение прерывается сигналом, а обработчик сигнала не вызывает исключение и сокет блокируется или имеет тайм-аут, то метод ожидает завершения соединения или вызывает исключение Socket.timeout
.
Для неблокирующих сокетов, если соединение прерывается сигналом или исключением, созданным обработчиком сигнала, то метод вызывает исключение InterruptedError
, .
Вызывает событие аудита socket.connect
с аргументами self
, address
.
Изменено в Python 3.5: теперь метод ожидает завершения соединения вместо вызова исключения InterruptedError
, если соединение прерывается сигналом, а обработчик сигнала не вызывает исключения и сокет блокируется или имеет тайм-аут.
Socket.connect_ex(address)
:Метод Socket.connect_ex()
работает подобно методу Socket.connect(address)
, но вместо вызова исключения (возвращаемых вызовом connect()
языка C) возвращает индикатор ошибки (Исключение может возникнуть, если не найден хост - "host not found").
Индикатор ошибки равен 0, если операция прошла успешно, в противном случае, индикатор ошибки равен значению переменной errno
. Метод Socket.connect_ex()
полезен для поддержки, например, асинхронных подключений.
Вызывает событие аудита socket.connect
с аргументами self
, address
.
Socket.detach()
:Метод Socket.detach()
переводит объект сокета в закрытое состояние, не закрывая дескриптор файла.
Возвращает дескриптор файла, который может быть повторно использован для других целей.
Socket.dup()
:Метод Socket.dup()
дублирует объект сокета Socket
. Вновь созданный сокет не наследуется.
Socket.fileno()
:Метод Socket.fileno()
возвращает файловый дескриптор сокета (небольшое целое число) или -1 в случае ошибки.
Метод Socket.fileno()
полезен с системным вызовом Unix select.select()
.
В Windows возвращаемое этим методом малое целое число, нельзя использовать там, где можно использовать дескриптор файла, например os.fdopen()
. Unix не имеет этого ограничения.
Socket.get_inheritable()
:Метод Socket.get_inheritable()
получает наследуемый флаг дескриптора файла или дескриптора сокета.
Метод возвращает True
, если сокет может быть унаследован в дочерних процессах, False
, если нет.
Socket.getpeername()
:Метод Socket.getpeername()
возвращает удаленный адрес, к которому подключен сокет.
Метод полезен, например, для определения номера порта удаленного сокета IPv4/v6. Формат возвращаемого адреса зависит от семейства адресов.
В некоторых системах эта функция не поддерживается.
Socket.getsockname()
:Метод Socket.getsockname()
возвращает собственный адрес и порт сокета.
Метод полезен, например, для определения номера порта сокета IPv4/v6. Формат возвращаемого адреса зависит от семейства адресов.
import socket s = socket.socket() s.bind(('localhost', 12345)) # распаковать кортеж host, port = s.getsockname() >>> host # '127.0.0.1' >>> port # 12345
Если компьютер имеет маршрут, подключенный к Интернету с белым IP-адресом, то код ниже вернет этот IP-адрес, Если компьютер подключен к интернету при помощи серого IP-адреса, то в результате выполнения кода получим адрес подсети провайдера:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) host, port = s.getsockname() >>> host # '10.10.10.13'
Можно использовать эту функцию для определения адреса компьютера в подсети провайдера, для которой не требуется маршрутизируемый доступ в Интернет.
import socket def extract_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: s.connect(('10.255.255.255', 1)) ip = st.getsockname()[0] except Exception: ip = '127.0.0.1' finally: st.close() return ip >>> extract_ip() # '10.10.10.13'
Socket.getsockopt(level, optname[, buflen])
:Метод Socket.getsockopt()
возвращает значение заданной опции сокета (смотрите man-страницу Unix командой $ man getsockopt
).
Необходимые символьные константы socket.SO_*
и т. д. определены в модуле socket
.
buflen
отсутствует, то предполагается целочисленный параметр, и метод возвращает его целое значение. buflen
присутствует, то он указывает максимальную длину буфера, используемого для приема опции, и этот буфер возвращается как байтовый объект. Вызывающий объект должен декодировать содержимое возвращаемого буфера. Чтобы узнать, как декодировать структуры языка С, закодированные как байтовые строки смотрите встроенный модуль struct
.
Socket.getblocking()
:Метод Socket.getblocking()
возвращает True
, если сокет находится в режиме блокировки, False
, если в неблокирующем режиме.
Вызов метода эквивалентен проверке Socket.gettimeout() == 0
.
Новое в Python 3.7.
Socket.gettimeout()
:Метод Socket.gettimeout()
возвращает значение тайм-аут float
в секундах или None
, если тайм-аут не установлен.
Метод отражает последний вызов Socket.setblocking()
или Socket.settimeout()
.
Socket.ioctl(control, option)
:Только для операционной системы Windows.
Метод Socket.ioctl()
- это ограниченный интерфейс для системного интерфейса WSAIoctl
. Для получения дополнительной информации, обратитесь к документации Win32
.
На других платформах могут использоваться общие функции fcntl.fcntl()
и fcntl.ioctl()
. Они принимают объект сокета в качестве своего первого аргумента.
В настоящее время поддерживаются только следующие управляющие коды: socket.SIO_RCVALL
, socket.SIO_KEEPALIVE_VALS
и socket.SIO_LOOPBACK_FAST_PATH
.
Изменено в Python 3.6: добавлен socket.SIO_LOOPBACK_FAST_PATH
.
Socket.listen([backlog])
:Метод Socket.listen()
переводит сервер для приема подключений.
Если задан необязательный аргумент backlog
, то он должен быть не менее 0 (если меньше, то это равно 0).
Аргумент backlog
указывает количество подключений, которые система поставит в очередь, перед отказом от новых подключений. Если не указано, то выбирается разумное значение по умолчанию.
Socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None)
:Метод Socket.makefile()
возвращает объект файла, связанный с сокетом. Точный возвращаемый тип зависит от аргументов, переданных в метод Socket.makefile()
. Эти аргументы интерпретируются так же, как и встроенной функцией функции open()
, за исключением того, что поддерживаются только значения mode
'r'
(по умолчанию), 'w'
и 'b'
.
Сокет должен находиться в режиме блокировки. У него может быть установлен тайм-аут, но при этом, внутренний буфер файлового объекта может оказаться в несогласованном состоянии, если произойдет этот тайм-аут.
Закрытие файлового объекта, Socket.makefile()
, не приведет к закрытию исходного сокета, если все остальные файловые объекты не были закрыты и Socket.close()
не был вызван для объекта сокета.
Примечание. В Windows файловый объект, созданный методом Socket.makefile()
, нельзя использовать там, где ожидается файловый объект с файловым дескриптором, например как потоковые аргументы функции subprocess.Popen()
.
Socket.recv(bufsize[, flags])
:Метод Socket.recv()
получает данные из сокета. Возвращаемое значение - байтовый объект, представляющий полученные данные.
bufsize
. flags
(по умолчанию он равен нулю) смотрите на справочной странице по recv(2)
Unix, командой $ man recv
.Примечание. Для наилучшего соответствия с аппаратными и сетевыми реалиями значение bufsize
должно быть относительно небольшим, например 4096.
Socket.recvfrom(bufsize[, flags])
:Метод Socket.recvfrom()
получает данные из сокета. Возвращаемое значение - это парный кортеж (bytes, address)
, где bytes
- это байтовый объект, представляющий полученные данные, а address
- это адрес сокета, отправляющего данные. Формат адреса address
зависит от семейства адресов.
Информацию о значении необязательного аргумента flags
(по умолчанию он равен нулю) смотрите на справочной странице по recv(2)
Unix, командой $ man recv
.
Изменено в Python 3.7: для адреса IPv6, первый элемент адреса больше не содержит части %scope_id
. Чтобы получить полный IPv6-адрес, используйте функцию socket.getnameinfo()
.
Socket.recvmsg(bufsize[, ancbufsize[, flags]])
:Метод Socket.recvmsg()
получает обычные данные до bufsize
байтов и вспомогательные данные из сокета.
Аргумент ancbufsize
устанавливает размер в байтах внутреннего буфера, используемого для приема вспомогательных данных. По умолчанию он равен 0, это означает, что дополнительные данные не будут получены. Соответствующие размеры буфера для вспомогательных данных можно вычислить с помощью socket.CMSG_SPACE()
или socket.CMSG_LEN()
, а элементы, которые не помещаются в буфер, могут быть усечены или отброшены.
Информацию о значении необязательного аргумента flags
(по умолчанию он равен нулю) смотрите на справочной странице по recv(2)
Unix, командой $ man recv
.
Возвращаемое значение метода Socket.recvmsg()
- это 4-кортеж: (data, ancdata, msg_flags, address)
.
data
- это байтовый объект, содержащий полученные основные данные. ancdata
представляет собой список из нуля или более кортежей (cmsg_level, cmsg_type, cmsg_data)
, представляющих полученные вспомогательные данные (управляющие сообщения):cmsg_level
и cmsg_type
- это целые числа, определяющие уровень протокола и специфичный для протокола тип соответственно, cmsg_data
- это байтовый объект, содержащий связанные данные. msg_flags
- это побитовое ИЛИ различных флагов, указывающих условия в полученном сообщении. подробности смотрите в документации к вашей системы. address
является адресом отправляющего сокета, если он доступен, в противном случае его значение не указано.В некоторых системах методы Socket.sendmsg()
и Socket.recvmsg()
могут использоваться для передачи файловых дескрипторов между процессами через сокет socket.AF_UNIX
. Когда это средство используется (оно часто ограничивается сокетами socket.SOCK_STREAM
), то метод Socket.recvmsg()
будет возвращать в своих вспомогательных данных элементы формы (socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)
, где fds
- байтовый объект, представляющий новые файловые дескрипторы как двоичный массив собственного типа языка C int
. Если метод Socket.sendmsg()
вызывает исключение после возврата из системного вызова, то он сначала попытается закрыть все файловые дескрипторы, полученные через этот механизм.
Некоторые системы не указывают усеченную длину элементов вспомогательных данных, которые были получены только частично. Если кажется, что элемент выходит за пределы конца буфера, то Socket.recvmsg()
выдаст RuntimeWarning
и вернет его часть, которая находится внутри буфера, при условии, что элемент не был усечен до начала связанных с ним данных.
В системах, поддерживающих механизм socket.SCM_RIGHTS
, функция recv_fds()
(смотрите ниже) будет получать дескрипторы файлов maxfds
, возвращая данные сообщения и список, содержащий дескрипторы при игнорировании неожиданных условий, таких как получение несвязанных управляющих сообщений. Смотрите также метод объекта сокета Socket.sendmsg()
.
import socket, array def recv_fds(sock, msglen, maxfds): fds = array.array("i") # Array of ints msg, ancdata, flags, addr = sock.recvmsg(msglen, Socket.CMSG_LEN(maxfds * fds.itemsize)) for cmsg_level, cmsg_type, cmsg_data in ancdata: if cmsg_level == Socket.SOL_SOCKET and cmsg_type == Socket.SCM_RIGHTS: # Append data, ignoring any truncated integers at the end. fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) return msg, list(fds)
Доступность: большинство платформ Unix, возможно, и другие.
Socket.recvmsg_into(buffers[, ancbufsize[, flags]])
:Метод Socket.recvmsg_into()
получает нормальные и вспомогательные данные из сокета, ведя себя как метод Socket.recvmsg()
, но разбрасывает нормальные данные в ряд буферов вместо того, чтобы возвращать новый байтовый объект.
Аргумент buffers
должен быть итерацией объектов, экспортирующих записываемые буферы, например объекты bytearray
). Они будут заполняться последовательными фрагментами нормальных данных до тех пор, пока все они не будут записаны или пока buffers
больше не останется. Операционная система может установить ограничение (os.sysconf()
со значением SC_IOV_MAX
) на количество буферов, которые могут быть использованы.
Аргументы ancbufsize
имеет то же значение, что и для метода Socket.recvmsg()
.
Информацию о значении необязательного аргумента flags
(по умолчанию он равен нулю) смотрите на справочной странице по recv(2)
Unix, командой $ man recv
.
Возвращаемое значение Socket.recvmsg_into()
представляет собой 4-кортеж: (nbytes, ancdata, msg_flags, address)
, где
nbytes
- это общее количество байтов нормальных данных, записанных в буферы, ancdata
, msg_flags
и address
такие же, как для Socket.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, возможно, и другие.
Socket.recvfrom_into(buffer[, nbytes[, flags]])
:Метод Socket.recvfrom_into()
получает данные из сокета, записывая их в буфер вместо создания новой строки байтов.
Возвращаемое значение - это парный кортеж (nbytes, address)
, где
nbytes
- это количество полученных байтов, address
- адрес сокета, отправляющего данные. Формат адреса address
зависит от семейства адресов.Информацию о значении необязательного аргумента flags
(по умолчанию он равен нулю) смотрите на справочной странице по recv(2)
Unix, командой $ man recv
.
Socket.recv_into(buffer[, nbytes[, flags]])
:Метод Socket.recv_into()
получает от сокета до nbytes
байтов, сохраняя данные в буфере buffer
, а не создавая новую строку байтов.
Если nbytes
не указан или равен 0, то получает до размера, доступного в данном буфере. Возвращает количество полученных байтов.
Информацию о значении необязательного аргумента flags
(по умолчанию он равен нулю) смотрите на справочной странице по recv(2)
Unix, командой $ man recv
.
Socket.send(bytes[, flags])
:Метод Socket.send()
отправляет данные в сокет. Отправляющий сокет должен быть подключен к удаленному сокету.
Необязательный аргумент flags
имеет то же значение, что и для метода Socket.recv()
выше.
Возвращает количество отправленных байтов. Приложения несут ответственность за проверку того, что все данные были отправлены. Если была передана только часть данных, то приложению необходимо попытаться доставить оставшиеся данные.
Для получения дополнительной информации по этой теме обратитесь к разделу "Рекомендации по программированию сокетов".
Socket.sendall(bytes[, flags])
:Метод Socket.sendall()
отправляет данные в сокет. Отправляющий сокет должен быть подключен к удаленному сокету.
Необязательный аргумент flags
имеет то же значение, что и для метода Socket.recv()
выше.
В отличие от метода Socket.send()
, этот метод продолжает отправлять байтовые данные до тех пор, пока не будут отправлены все данные или не возникнет ошибка. В случае успеха ничего не возвращается. При ошибке возникает исключение и невозможно определить, сколько данных было успешно отправлено.
Socket.sendto(bytes, address)
Socket.sendto(bytes, flags, address)
:Метод Socket.sendto()
отправляет данные в сокет. Отправляющий сокет не должен быть подключен к удаленному сокету, поскольку сокет назначения указан в аргументе address
. Формат адреса address
зависит от семейства адресов.
Необязательный аргумент flags
имеет то же значение, что и для метода Socket.recv()
выше.
Метод Socket.sendto()
возвращает количество отправленных байтов. Вызывает событие аудита socket.sendto
с аргументами self
, address
.
Socket.sendmsg(buffers[, ancdata[, flags[, address]]])
:Метод Socket.sendmsg()
отправляет обычные и вспомогательные данные в сокет, собирая обычные данные из ряда буферов и объединяя их в одно сообщение.
Аргумент buffers
определяет обычные данные как итерацию байтоподобных объектов (например, объектов bytes
); Операционная система может установить ограничение (os.sysconf()
со значением SC_IOV_MAX
) на количество buffers
, которые могут использоваться.
Аргумент ancdata
указывает вспомогательные данные (управляющие сообщения) как итерацию из нуля или более кортежей (cmsg_level, cmsg_type, cmsg_data)
, где
cmsg_level
и cmsg_type
- целые числа, определяющие уровень протокола и тип, специфичный для протокола соответственно, cmsg_data
- это байтоподобный объект, содержащий связанные данные. Обратите внимание, что некоторые системы (в частности, системы без socket.CMSG_SPACE()
) могут поддерживать отправку только одного управляющего сообщения за вызов.
Необязательный аргумент flags
имеет то же значение, что и для метода Socket.recv()
выше.
Если аргумент address
не равен None
, то он устанавливает адрес назначения для сообщения.
Метод Socket.sendmsg()
возвращает количество отправленных байтов обычных данных.
В примере ниже функция send_fds()
отправляет список файловых дескрипторов fds
через сокет socket.AF_UNIX
в системах, поддерживающих механизм socket.SCM_RIGHTS
. Смотрите также метод Socket.recvmsg()
.
import socket, array def send_fds(sock, msg, fds): return sock.sendmsg([msg], [(Socket.SOL_SOCKET, Socket.SCM_RIGHTS, array.array("i", fds))])
Доступность: большинство платформ Unix, возможно, другие.
Вызывает событие аудита socket.sendmsg
с аргументами self
, address
.
Socket.sendmsg_afalg([msg, ]*, op[, iv[, assoclen[, flags]]])
:Метод Socket.sendmsg_afalg()
это специализированная версия Socket.sendmsg()
для сокета socket.AF_ALG
.
Устанавливает режим, IV, AEAD, связанную длину данных и флаги для сокета socket.AF_ALG
.
Доступность: Linux >= 2.6.38.
Новое в Python 3.6.
Socket.send_fds(sock, buffers, fds[, flags[, address]])
:Метод Socket.send_fds()
отправляет список файловых дескрипторов fds
через сокет socket.AF_UNIX
.
Параметр fds
представляет собой последовательность файловых дескрипторов.
Значение и поведение остальных аргументов метода смотрите в Socket.sendmsg()
.
Доступность: Unix поддерживает механизм Socket.sendmsg()
и SCM_RIGHTS
.
Новое в Python 3.9.
Socket.recv_fds(sock, bufsize, maxfds[, flags])
:Метод Socket.recv_fds()
получает до maxfds
файловых дескрипторов. Возвращает (msg, list(fds), flags, addr)
.
Значение и поведение аргументов метода смотрите в Socket.recvmsg()
.
Доступность: Unix поддерживает механизм Socket.recvmsg()
и SCM_RIGHTS
.
Новое в Python 3.9.
Обратите внимание на любые усеченные целые числа в конце списка файловых дескрипторов.
Socket.sendfile(file, offset=0, count=None)
:Метод Socket.sendfile()
отправляет файл до тех пор, пока не будет достигнут EOF
с помощью высокопроизводительной системной функции os.sendfile
и возвращает общее количество отправленных байтов.
Аргумент file
должен быть обычным файловым объектом, открытым в двоичном режиме mode='rb'
.
Если системная функция os.sendfile
недоступна (например, Windows) или файл не является обычным файлом, вместо него будет использоваться метод Socket.send()
.
Аргумент offset
указывает, откуда начать чтение файла.
Аргумент count
, если указан, то это общее количество байтов для передачи в отличие от отправки файла до достижения EOF. Положение файла обновляется при возврате или также в случае ошибки, в этом случае file.tell()
можно использовать для определения количества отправленных байтов.
Сокет должен быть типа socket.SOCK_STREAM
. Неблокирующие сокеты не поддерживаются.
Socket.set_inheritable(inheritable)
:Метод Socket.set_inheritable()
устанавливает наследуемый флаг inheritable
файлового дескриптора сокета или дескриптора сокета.
Socket.setblocking(flag)
:Метод Socket.setblocking()
устанавливает блокирующий или неблокирующий режим сокета: если флаг False
, то сокет установлен в неблокирующий режим, в противном случае - в режим блокировки.
Этот метод является сокращением для некоторых вызовов Socket.settimeout()
:
Socket.setblocking(True)
эквивалентен Socket.settimeout(None)
;Socket.setblocking(False)
эквивалентен Socket.settimeout(0.0)
.Изменено в Python 3.7: метод больше не применяет флаг socket.SOCK_NONBLOCK
к Socket.type
.
Socket.settimeout(value)
:Метод Socket.settimeout()
устанавливает тайм-аут для блокировки операций сокета.
Аргумент value
может быть неотрицательным числом float
, выражающим секунды, или None
.
value
задано ненулевое значение, то последующие операции сокета вызовут исключение socket.timeout
, если значение периода тайм-аута истекло до завершения операции.value=0
, то сокет переводится в неблокирующий режим. value=None
, то сокет переводится в режим блокировки.Для получения дополнительной информации смотрите "Примечания о тайм-аутах сокетов".
Изменено в Python 3.7: метод больше не переключает флаг socket.SOCK_NONBLOCK
на Socket.type
.
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.SO_*
и т. д. определены в модуле socket
. Значение value
может быть целым числом, None
или байтовым объектом, представляющим буфер. В последнем случае вызывающая сторона должна убедиться, что строка байтов содержит правильные биты (как кодировать структуры языка С в байтовые строки, смотрите встроенный модуль struct
). Если установлено значение None
, то требуется аргумент optlen
. Это эквивалентно вызову функции C setsockopt()
с optval=NULL и
optlen=optlen`.
Изменено Python 3.6: добавлена форма Socket.setsockopt(level, optname, None, optlen: int)
.
Socket.shutdown(how)
:Метод Socket.shutdown()
отключает одну или обе половины соединения.
how=socket.SHUT_RD
, то дальнейшее получение запрещено. how=socket.SHUT_WR
, то дальнейшая отправка запрещена. how=socket.SHUT_RDWR
, то дальнейшая отправка и получение запрещены.Socket.share(process_id)
:Метод Socket.share()
копирует сокет и подготавливает его для совместного использования с целевым процессом.
Целевой процесс должен быть предоставлен с идентификатором процесса process_id
. Результирующий объект bytes
затем может быть передан целевому процессу с использованием некоторой формы межпроцессного взаимодействия и сокет может быть воссоздан там с помощью функции socket.fromshare()
.
После вызова этого метода можно безопасно закрыть сокет, поскольку операционная система уже продублировала его для целевого процесса.
Обратите внимание, что нет методов read()
или write()
, вместо них используйте методы Socket.recv()
и Socket.send()
без аргумента flags.
Доступность: Windows.
Socket.family
:Атрибут Socket.family
возвращает семейство сокетов (только для чтения).
Socket.type
:Атрибут Socket.type
возвращает тип сокета (только для чтения).
Socket.proto
:Атрибут Socket.proto
возвращает протокол на котором работает сокет (только для чтения).
Объект сокета может находиться в одном из трех режимов: блокирующий, неблокирующий или тайм-аут. По умолчанию сокеты всегда создаются в режиме блокировки, но это можно изменить, вызвав функцию socket.setdefaulttimeout()
.
select
для определения того, когда и доступен ли сокет для чтения или записи.socket.timeout
) или если система возвращает ошибку.Примечание. На уровне операционной системы сокеты в режиме тайм-аута внутренне устанавливаются в неблокирующий режим. Кроме того, режимы блокировки и тайм-аута используются совместно дескрипторами файлов и объектами сокетов, которые относятся к одной и той же конечной точке сети. Эта деталь реализации может иметь видимые последствия, если, например, вы решили использовать метод сокета Socket.fileno()
.
Операция соединения Socket.connect()
также зависит от установки тайм-аута, и в целом рекомендуется вызвать Socket.settimeout()
перед вызовом Socket.connect()
или передать параметр timeout
в функцию socket.create_connection()
.
Однако системный сетевой стек может также возвращать собственную ошибку тайм-аута соединения независимо от любого параметра тайм-аута сокета Python.
Socket.accept()
.Если результат функции socket.getdefaulttimeout()
не равен None
, то сокеты, возвращаемые методом Socket.accept()
, наследуют этот тайм-аут. В противном случае поведение зависит от настроек прослушивающего сокета:
Socket.accept()
, находится в режиме блокировки;Socket.accept()
, полностью зависит от операционной системы. Если необходимо обеспечить кросс-платформенное поведение, то рекомендуется вручную переопределить этот параметр.