質問

私のpythonで、カメラから可変長ストリームを受信するが、奇妙な振る舞いを取得しようとしています。これは、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刺さ」ループにはまり、このコードで あるいは、この:

`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画像を送信することになっています。私は最初のループを乗り越えるとき(あれば)、私は、正確さとサイズの情報については、このヘッダをチェックする必要があります。プログラムは、間違ったデータのエラーで終了し、ダンプ・ファイルはバイナリのゴミの束であるので、私は、私が最後に受け取った何見当がつかない。私は、他の側のデバイスは、正しいデータを送信しようとしているかなり確信しています。

役に立ちましたか?

解決 2

問題が解決され、興味深いことに、シャットダウンの問題を引き起こしていた(1)、他の側は、httpスタイルのシャットダウンが好きではありません。そこ明らかに誤植や行方不明のチェックもあるが、それらは、の問題ではありません。

他のヒント

:あなたのコードがあるので、

あなたは本当に、あなたが受け取ったバイト数がわかりません

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

すなわち、あなたはchunkでバイトを受けていますが、len(data)を更新する前に、何を印刷しているのはdataでいます。 dataは少なくとも10のバイトだった場合、それはchunkと終了を更新します。

- もちろん、だからそれは常に、初めて0に印刷されます。

この情報はあなたの問題をデバッグするのに十分ではありませんが、印刷さlen(チャンク)、およびループの終了時にLEN(データ)、何が起こっているかを理解しようとする試みを傷つけることはできません。あなたはdumpのメッセージを表示して終了した場合にも、imahe get errorで何ですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top