Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Network
  • » проблема с повторным вызовом socket.recv() в клиентсом сокете [RSS Feed]

#1 Апрель 24, 2008 17:43:34

gOn
От:
Зарегистрирован: 2008-04-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с повторным вызовом socket.recv() в клиентсом сокете

Создаю клиентский сокет для соединения с устройстовом.
Необходимо считывать с устройства информацию и в зависимости от того, что присылает “железка” слать в ответ данные.

Т.к. данные приходят порциями и с интервалами я должен в цикле считывать до конца пакета. Проблема состоит в том, что когда в клиентском сокете вызывается два раза подряд функция 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()



Офлайн

#2 Апрель 24, 2008 18:33:55

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с повторным вызовом socket.recv() в клиентсом сокете

sock.recv(1024) - тут вы ожидаете получить 1024 байт информации, и пока вы их все не получите, будете ждать (зависание) до конца света или до разъединения связи. Используйте таймаут sock.settimeout(0.2) для блокирующих операций.



Отредактировано (Апрель 24, 2008 18:36:14)

Офлайн

#3 Апрель 25, 2008 00:41:54

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

проблема с повторным вызовом socket.recv() в клиентсом сокете

Ага, и теряете накопленные а буфере данные.
Скорее так: http://pydev.ru/forum/viewtopic.php?id=242



Отредактировано (Апрель 25, 2008 01:03:56)

Офлайн

#4 Апрель 25, 2008 08:33:48

gOn
От:
Зарегистрирован: 2008-04-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с повторным вызовом socket.recv() в клиентсом сокете

poltergeist и ZZZ, спасибо большое за помощь)



Отредактировано (Апрель 25, 2008 08:35:47)

Офлайн

#5 Апрель 25, 2008 15:40:48

redixin
От:
Зарегистрирован: 2006-11-27
Сообщения: 66
Репутация: +  1  -
Профиль   Отправить e-mail  

проблема с повторным вызовом socket.recv() в клиентсом сокете

попробуйте добавить к флагам socket.MSG_DONTWAIT
а еще рекомендуемый размер буфера - такойже как размер страницы на железе (подозреваю что 4096)
по 1му байту читать это негодица никуда



Офлайн

#6 Апрель 26, 2008 00:32:48

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

проблема с повторным вызовом socket.recv() в клиентсом сокете

redixin
попробуйте добавить к флагам socket.MSG_DONTWAIT
Т.е. не ждать вообще? Эквивалентно settimeout(0)? Это означает, что процессор будет загружен постоянным циклом. Можно воткнуть в него time.sleep(0.13), но какой в этом тогда смысл?



Офлайн

#7 Апрель 26, 2008 08:08:05

redixin
От:
Зарегистрирован: 2006-11-27
Сообщения: 66
Репутация: +  1  -
Профиль   Отправить e-mail  

проблема с повторным вызовом socket.recv() в клиентсом сокете

ZZZ
Т.е. не ждать вообще? Эквивалентно settimeout(0)? Это означает, что процессор будет загружен постоянным циклом. Можно воткнуть в него time.sleep(0.13), но какой в этом тогда смысл?
socket.MSG_DONTWAIT или setblocking решает проблему “зависания”. все остальное сами решайте как делать. а вообще по-хорошему (так сказать по ГОСТам) юзайте select



Офлайн

#8 Апрель 29, 2008 09:00:09

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с повторным вызовом socket.recv() в клиентсом сокете

А еще можно пользовать select



Офлайн

#9 Апрель 27, 2010 17:47:53

co0l3r
От:
Зарегистрирован: 2010-03-15
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с повторным вызовом socket.recv() в клиентсом сокете

юзал с таймаутом в треде
незнаю насколько это хорошо, но работает



Офлайн

#10 Апрель 27, 2010 20:09:26

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

проблема с повторным вызовом socket.recv() в клиентсом сокете

poltergeist
sock.recv(1024) - тут вы ожидаете получить 1024 байт информации, и пока вы их все не получите, будете ждать (зависание) до конца света или до разъединения связи.
достаточно 1-го пришедшего байта что-б recv отпустил

Офлайн

  • Начало
  • » Network
  • » проблема с повторным вызовом socket.recv() в клиентсом сокете[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version