Найти - Пользователи
Полная версия: проблема с повторным вызовом socket.recv() в клиентсом сокете
Начало » Network » проблема с повторным вызовом socket.recv() в клиентсом сокете
1
gOn
Создаю клиентский сокет для соединения с устройстовом.
Необходимо считывать с устройства информацию и в зависимости от того, что присылает “железка” слать в ответ данные.

Т.к. данные приходят порциями и с интервалами я должен в цикле считывать до конца пакета. Проблема состоит в том, что когда в клиентском сокете вызывается два раза подряд функция 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()
poltergeist
sock.recv(1024) - тут вы ожидаете получить 1024 байт информации, и пока вы их все не получите, будете ждать (зависание) до конца света или до разъединения связи. Используйте таймаут sock.settimeout(0.2) для блокирующих операций.
ZZZ
Ага, и теряете накопленные а буфере данные.
Скорее так: http://pydev.ru/forum/viewtopic.php?id=242
gOn
poltergeist и ZZZ, спасибо большое за помощь)
redixin
попробуйте добавить к флагам socket.MSG_DONTWAIT
а еще рекомендуемый размер буфера - такойже как размер страницы на железе (подозреваю что 4096)
по 1му байту читать это негодица никуда
ZZZ
redixin
попробуйте добавить к флагам socket.MSG_DONTWAIT
Т.е. не ждать вообще? Эквивалентно settimeout(0)? Это означает, что процессор будет загружен постоянным циклом. Можно воткнуть в него time.sleep(0.13), но какой в этом тогда смысл?
redixin
ZZZ
Т.е. не ждать вообще? Эквивалентно settimeout(0)? Это означает, что процессор будет загружен постоянным циклом. Можно воткнуть в него time.sleep(0.13), но какой в этом тогда смысл?
socket.MSG_DONTWAIT или setblocking решает проблему “зависания”. все остальное сами решайте как делать. а вообще по-хорошему (так сказать по ГОСТам) юзайте select
ice
А еще можно пользовать select
co0l3r
юзал с таймаутом в треде
незнаю насколько это хорошо, но работает
o7412369815963
poltergeist
sock.recv(1024) - тут вы ожидаете получить 1024 байт информации, и пока вы их все не получите, будете ждать (зависание) до конца света или до разъединения связи.
достаточно 1-го пришедшего байта что-б recv отпустил
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