Найти - Пользователи
Полная версия: conn.recv() timeout
Начало » Network » conn.recv() timeout
1
xxnikolayxx
Есть серверное приложение, принимает данные с клиентов.
В приложении есть несколько conn.recv().
Время от времени ожидание данных сильно затягивается и тормозит весь процесс.
Подскажите, есть ли какой-то вариант закрыть коннект через какое-то время?
s0rg
Это?
xxnikolayxx
s0rg
Это?
Не совсем.
Разве это можно использовать на сервере?
У меня открыт сокет и в режиме нон стоп принимает коннекты:
conn, addr = s.accept()
Иногда в момент передачи данных бывает большая задержка, мне нужно отключить такого клиента и опять вернутся в
conn, addr = s.accept()
А эта приблуда вырубит мне весь сокет если что. Или я не прав?
reclosedev
Так таймаут предлагается ставить не на слушающий сокет, а на подключение к клиенту
conn, addr = s.accept()
conn.settimeout(3.0)
xxnikolayxx
reclosedev
.recv()
В этом случае таймаут отдается при ожидании коннекта клиента.
С коннектом все нормуль.
Проблемма возникает после отправки чего-то клиенту.
Выполняется метод .recv()
И вот тут, нужно прервать работу и вернутся к ожиданию коннекта клиента.

Пример:
while True:
	conn, addr = s.accept()
	data = conn.recv(1024)
        # Тут может быть большая задержка и нужно в случае задержки закрыть коннект
        conn.send('что-то')
	data = conn.recv(1024)
        # Тут может быть большая задержка и нужно в случае задержки закрыть коннект
        conn.close()

Если я туплю и совсем не прав, пришлите пожалуйста не большой пример.
Можно ли задать этот параметр на 10 секунд к примеру и если коннект не будет закрыт сам через это время закрыть его автоматически, прекратив операции?
reclosedev
xxnikolayxx
С коннектом все нормуль.
Проблемма возникает после отправки чего-то клиенту.
Под подключением клиента я имел ввиду его сокет, который conn.
xxnikolayxx
]пришлите пожалуйста не большой пример.
server.py
import socket
import time
 
timeout = 2.0
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 11000))
s.listen(1)
while True:
    conn, addr = s.accept()
    conn.settimeout(timeout)
    try:
        data = conn.recv(1024)
        conn.send('ok')
    except socket.timeout:
        print addr, 'timeout'
    else:
        print addr, 'doing something with', data
    finally:
        conn.close()

client.py
import socket
import time
 
delay = 3.0
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 11000))
time.sleep(delay)
s.sendall('hello')
resp = s.recv(512)
print resp
Если поставить в клиенте delay больше чем timeout сервера, сервер будет закрывать этого клиента по истечению timeout'a. Но в это время остальные клиенты будут ждать.
Стоит посмотреть в сторону потоков, неблокирующих сокетов или асинхронных фреймворков.

Еще есть хорошая книга
“Foundations of Python Network Programming
The comprehensive guide to building network applications with Python”
John Goerzen , Brandon Rhodes


xxnikolayxx
reclosedev
Прекрассный ответ, наверно самый лучший, который я когда либо получал на форумах =)
С примером, исчерпывающе, да еще и книгу посоветовали… Спасибо =)
Книжка кстати эта есть, еще никак руки не дошли.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB