0

我正在尝试从带有 python 的相机接收可变长度流,但会出现奇怪的行为。这是 Linux(Ubuntu 9.10)上的 Python 2.6.4(r264:75706)

该消息应该带有一个静态标头,后跟大小和流的其余部分。这是代码

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 字节的标头。当(如果)我通过第一个循环时,我需要检查此标头的正确性和大小信息。程序以错误的数据错误终止,转储文件是一堆二进制垃圾,所以我不知道我最后收到了什么。我很确定另一端的设备正在尝试发送正确的数据。

4

2 回答 2

1

你真的不知道你收到了多少字节,因为你的代码是:

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

即,您正在接收字节chunk,但您正在打印的是len(data)在更新之前data。所以当然它会第一次打印 0,总是 - 然后如果至少 10 个字节,它将更新data并退出。chunk

此信息不足以调试您的问题,但在退出循环时打印 len(chunk) 和 len(data) 不会损害了解正在发生的事情的尝试。另外,dump当您退出imahe get error消息时会发生什么?

于 2009-11-10T18:39:30.900 回答
0

问题解决了,有趣的是,shutdown(1) 导致了问题,对方不喜欢 http 风格的关闭。也有明显的拼写错误和遗漏的检查,但它们不是问题。

于 2009-11-11T20:01:36.267 回答