Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 28, 2013 04:43:47

xxnikolayxx
От:
Зарегистрирован: 2011-12-05
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

conn.recv() timeout

Есть серверное приложение, принимает данные с клиентов.
В приложении есть несколько conn.recv().
Время от времени ожидание данных сильно затягивается и тормозит весь процесс.
Подскажите, есть ли какой-то вариант закрыть коннект через какое-то время?

Отредактировано xxnikolayxx (Июнь 28, 2013 04:44:05)

Офлайн

#2 Июнь 28, 2013 17:22:19

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

conn.recv() timeout

Офлайн

#3 Июнь 29, 2013 06:15:41

xxnikolayxx
От:
Зарегистрирован: 2011-12-05
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

conn.recv() timeout

s0rg
Это?
Не совсем.
Разве это можно использовать на сервере?
У меня открыт сокет и в режиме нон стоп принимает коннекты:
conn, addr = s.accept()
Иногда в момент передачи данных бывает большая задержка, мне нужно отключить такого клиента и опять вернутся в
conn, addr = s.accept()
А эта приблуда вырубит мне весь сокет если что. Или я не прав?

Отредактировано xxnikolayxx (Июнь 29, 2013 06:16:09)

Офлайн

#4 Июнь 29, 2013 08:29:52

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

conn.recv() timeout

Так таймаут предлагается ставить не на слушающий сокет, а на подключение к клиенту

conn, addr = s.accept()
conn.settimeout(3.0)

Офлайн

#5 Июнь 29, 2013 10:19:25

xxnikolayxx
От:
Зарегистрирован: 2011-12-05
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

conn.recv() timeout

reclosedev
.recv()
В этом случае таймаут отдается при ожидании коннекта клиента.
С коннектом все нормуль.
Проблемма возникает после отправки чего-то клиенту.
Выполняется метод .recv()
И вот тут, нужно прервать работу и вернутся к ожиданию коннекта клиента.

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

Если я туплю и совсем не прав, пришлите пожалуйста не большой пример.
Можно ли задать этот параметр на 10 секунд к примеру и если коннект не будет закрыт сам через это время закрыть его автоматически, прекратив операции?

Отредактировано xxnikolayxx (Июнь 29, 2013 11:16:59)

Офлайн

#6 Июнь 29, 2013 12:09:12

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

conn.recv() timeout

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


Отредактировано reclosedev (Июнь 29, 2013 12:10:36)

Офлайн

#7 Июнь 29, 2013 14:12:44

xxnikolayxx
От:
Зарегистрирован: 2011-12-05
Сообщения: 161
Репутация: +  0  -
Профиль   Отправить e-mail  

conn.recv() timeout

reclosedev
Прекрассный ответ, наверно самый лучший, который я когда либо получал на форумах =)
С примером, исчерпывающе, да еще и книгу посоветовали… Спасибо =)
Книжка кстати эта есть, еще никак руки не дошли.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version