Форум сайта python.su
Создаю клиентский сокет для соединения с устройстовом.
Необходимо считывать с устройства информацию и в зависимости от того, что присылает “железка” слать в ответ данные.
Т.к. данные приходят порциями и с интервалами я должен в цикле считывать до конца пакета. Проблема состоит в том, что когда в клиентском сокете вызывается два раза подряд функция recv() то программа зависает. Как можно обойти эту проблему (заставить клиентский сокет считывать recv() несколько раз подряд)? Что самое интересное в серверном функция recv() работает отлично.
=================
import socket,time
HOST = '192.168.10.99'
PORT = 23
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((HOST,PORT))
#блок авторизации
sock.send("enter\n")
sock.send("login\n")
sock.send("password\n")
#конец блока авторизации
sock.send("status\n")
while 1:
bufsock=sock.recv(1024) # здесь зависает
if not bufsock:
break
print bufsock
time.sleep(0.2)
#я пробовал заменить цикл while() на несколько подряд идущих sock.recv() но проблема осталась
sock.send("logout\n")
sock.close()
Офлайн
sock.recv(1024) - тут вы ожидаете получить 1024 байт информации, и пока вы их все не получите, будете ждать (зависание) до конца света или до разъединения связи. Используйте таймаут sock.settimeout(0.2) для блокирующих операций.
Отредактировано (Апрель 24, 2008 18:36:14)
Офлайн
Ага, и теряете накопленные а буфере данные.
Скорее так: http://pydev.ru/forum/viewtopic.php?id=242
Отредактировано (Апрель 25, 2008 01:03:56)
Офлайн
poltergeist и ZZZ, спасибо большое за помощь)
Отредактировано (Апрель 25, 2008 08:35:47)
Офлайн
попробуйте добавить к флагам socket.MSG_DONTWAIT
а еще рекомендуемый размер буфера - такойже как размер страницы на железе (подозреваю что 4096)
по 1му байту читать это негодица никуда
Офлайн
redixinТ.е. не ждать вообще? Эквивалентно settimeout(0)? Это означает, что процессор будет загружен постоянным циклом. Можно воткнуть в него time.sleep(0.13), но какой в этом тогда смысл?
попробуйте добавить к флагам socket.MSG_DONTWAIT
Офлайн
ZZZsocket.MSG_DONTWAIT или setblocking решает проблему “зависания”. все остальное сами решайте как делать. а вообще по-хорошему (так сказать по ГОСТам) юзайте select
Т.е. не ждать вообще? Эквивалентно settimeout(0)? Это означает, что процессор будет загружен постоянным циклом. Можно воткнуть в него time.sleep(0.13), но какой в этом тогда смысл?
Офлайн
А еще можно пользовать select
Офлайн
юзал с таймаутом в треде
незнаю насколько это хорошо, но работает
Офлайн
poltergeistдостаточно 1-го пришедшего байта что-б recv отпустил
sock.recv(1024) - тут вы ожидаете получить 1024 байт информации, и пока вы их все не получите, будете ждать (зависание) до конца света или до разъединения связи.
Офлайн