Python-сокет не получает ничего - PullRequest
0 голосов
/ 10 ноября 2009

Я пытаюсь получить поток переменной длины с камеры с питоном, но получаю странное поведение. Это Python 2.6.4 (r264: 75706) в Linux (Ubuntu 9.10)

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

from socket import *
import array
import select

HOST = '169.254.0.10'
PORT = 10001
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
tcpCliSock.setblocking(0)

def dump(x):
    dfile = open('dump','w')
    dfile.write(x)
    dfile.close


data='I'
tcpCliSock.send(data)
tcpCliSock.shutdown(1)
ready_to_read, ready_to_write, in_error = select.select(
        [tcpCliSock], 
        [], 
        [], 
        30)
if ready_to_read == []:
    print "sokadens"
data=''
while len(data)<10:
    chunk = tcpCliSock.recv(1024)
    print 'recv\'d %d bites'%len(data)
    data=data+chunk
index=data.find('##IMJ')
if index == -1:
    dump(data)
    raise RuntimeError, "imahe get error"
datarr = array.array('B',data)
size=datarr[6]+datarr[7]<<8+datarr[8]<<16+datarr[9]<<24
ready_to_read, ready_to_write, in_error = select.select(
        [tcpCliSock], 
        [], 
        [], 
        30)
if ready_to_read == []:
    print "sokadens"
while len(data)<size:
    chunk = tcpCliSock.recv(1024)
    data=data+chunk 

outfile=open('resim.jpg','w')
outfile.write(data[10:])
outfile.close

tcpCliSock.close()

с этим кодом я либо застреваю в цикле "recv \ 'd 0 bites" (что случается редко) или это:

`recv'd 0 bites`
Traceback (most recent call last):
  File "client.py", line 44, in <module>
    raise RuntimeError, "imahe get error"
RuntimeError: imahe get error

, что совершенно странно (получить 0 байтов, но выйти из цикла). Сброшенные данные ошибочны, что ожидается в этой ситуации

Редактировать 1: устройство должно отправлять изображение JPEG, которому предшествует 10-байтовый заголовок. Когда (если) я прошёл первый цикл, мне нужно проверить этот заголовок на правильность и размер информации. Программа завершается с ошибкой неверных данных, а файл дампа представляет собой кучу бинарного мусора, поэтому я не представляю, что я получил в конце. Я уверен, что устройство на другой стороне пытается отправить правильные данные.

Ответы [ 2 ]

1 голос
/ 10 ноября 2009

Вы не знаете, сколько байтов вы получили, так как ваш код:

data=''
while len(data)<10:
        chunk = tcpCliSock.recv(1024)
        print 'recv\'d %d bites'%len(data)
        data=data+chunk

Т.е. вы получаете байты в chunk, но перед печатью data вы печатаете len(data). Поэтому, конечно, он будет печатать 0 в первый раз, всегда - тогда он обновит data и завершит работу, если chunk был хотя бы 10 байтов.

Этой информации недостаточно для отладки вашей проблемы, но печать len (chunk) и len (data) после выхода из цикла не помешает попытке понять, что происходит. Кроме того, что находится в dump при выходе с сообщением imahe get error?

0 голосов
/ 11 ноября 2009

Проблема решена, интересно, что причиной было отключение (1), другой стороне не нравятся отключения в стиле http. Существуют также очевидные опечатки и пропущенные проверки, но они не являются проблемой .

...