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 bytes」ループ (めったに発生しません) でスタックするか、次のようになります。

`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: デバイスは、10 バイトのヘッダーが前に付いた JPEG 画像を送信することになっています。最初のループを通過した場合、このヘッダーの正確性とサイズ情報を確認する必要があります。プログラムは間違ったデータ エラーで終了し、ダンプ ファイルはバイナリのガベージの集まりであるため、最後に何を受け取ったかわかりません。反対側のデバイスが正しいデータを送信しようとしていると確信しています。

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 に答える