Как установить тайм-аут на методе pyv для сокета recv?

Мне нужно установить тайм-аут в методе pyv для сокета recv. Как это сделать?

86 голосов | спросил Thoreller 27 AMpTue, 27 Apr 2010 09:51:46 +040051Tuesday 2010, 09:51:46

8 ответов


0

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

import select

mysocket.setblocking(0)

ready = select.select([mysocket], [], [], timeout_in_seconds)
if ready[0]:
    data = mysocket.recv(4096)

Если у вас много открытых файловых дескрипторов, poll () является более эффективной альтернативой select().

Другой вариант - установить тайм-аут для всех операций в сокете, используя socket.settimeout(), но я вижу, что вы явно отклонили это Решение в другом ответе.

ответил Daniel Stutzbach 27 PMpTue, 27 Apr 2010 17:49:30 +040049Tuesday 2010, 17:49:30
0
ответил nosklo 27 AMpTue, 27 Apr 2010 09:56:30 +040056Tuesday 2010, 09:56:30
0

Как уже упоминалось, оба select.select() и socket.settimeout() будет работать.

Обратите внимание, что вам может потребоваться дважды вызвать settimeout для ваших нужд, например

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# accept can throw socket.timeout
sock.settimeout(5.0)
conn, addr = sock.accept()

# recv can throw socket.timeout
conn.settimeout(5.0)
conn.recv(1024)
ответил ubershmekel 27 PM00000090000005231 2014, 21:15:52
0

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

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.settimeout(5.0)
data = sock.recv(1024)
sock.settimeout(None)
ответил noriko 8 AMpWed, 08 Apr 2015 11:32:04 +030032Wednesday 2015, 11:32:04
0

Время ожидания, которое вы ищете, - это время ожидания сокета соединения, а не основного сокета, если вы реализуете на стороне сервера. Другими словами, существует другой тайм-аут для объекта сокета соединения, который является выходом метода socket.accept(). Поэтому:

sock.listen(1)
connection, client_address = sock.accept()
connection.settimeout(5)    # This is the one that affects recv() method.
connection.gettimeout()     # This should result 5
sock.gettimeout()           # This outputs None when not set previously, if I remember correctly.

Если бы вы реализовали клиентскую часть, это было бы просто.

sock.connect(server_address)
sock.settimeout(3)
ответил V123 23 Maypm18 2018, 20:36:44
0

попробуйте это, он использует базовый C.

timeval = struct.pack('ll', 2, 100)

s.setsockopt(socket.SOL_SOCKET,SO_RCVTIMEO, timeval)
ответил Mohammad Alkhaldi 29 PM000000120000003931 2017, 12:00:39
0

Как упоминалось в предыдущих ответах, вы можете использовать что-то вроде: .settimeout() Например:

import socket

s = socket.socket()

s.settimeout(1) # Sets the socket to timeout after 1 second of no activity

host, port = "somehost", 4444
s.connect((host, port))

s.send("Hello World!\r\n")

try:
    rec = s.recv(100) # try to receive 100 bytes
except socket.timeout: # fail after 1 second of no activity
    print("Didn't receive data! [Timeout]")
finally:
    s.close()

Надеюсь, это поможет !!

ответил petrexxy 30 52018vEurope/Moscow11bEurope/MoscowFri, 30 Nov 2018 18:13:23 +0300 2018, 18:13:23
0

Вы можете использовать socket.settimeout(), который принимает целочисленный аргумент, представляющий количество секунд. Например, socket.settimeout(1) установит время ожидания на 1 секунду

ответил Being A Nerd Sounds Good 13 ThuEurope/Moscow2018-12-13T23:40:41+03:00Europe/Moscow12bEurope/MoscowThu, 13 Dec 2018 23:40:41 +0300 2018, 23:40:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132