1

Pythonのネットワークを介して暗号化されたオーディオを送信しています。このアプリは一時的に動作し、16の倍数でなければならないと言って壊れます。

私が間違っていることがわからない。または、これを解決するためにコードをどこで調べるか。

私はあなたが提供しなければならない助けをいただければ幸いです

編集*誰かが見てみたいと思ったら、私は今それが機能していると信じています私はグーグルコードプロジェクトを作りました

http://code.google.com/p/mii-chat/

4

2 に答える 2

3
msg = conn.recv(2024)
if msg:                
    cmd, msg = ord(msg[0]),msg[1:]
    if cmd == CMD_MSG:
        listb1.insert(END, decrypt_my_message(msg.strip()) + "\n")

上記のコードのスニペットは、2024バイトのデータ(16の倍数ではない)を読み取り、( "if"ステートメントがTrueの場合)引数としてmsg.strip()を指定してdecrypt_my_messageを呼び出します。次に、decrypt_my_messageは、長さが16の倍数ではない文字列が指定されたことを通知します(これが問題だと思います。トレースバックを調べて、これが例外の原因であるかどうかを確認してください)。

長さn*16の文字列を使用してdecrypt_my_messageを呼び出す必要があります。

ストリームを読み取るためのロジックを再考する必要がある場合があります。または、decrypt_my_messageの呼び出しをn*16のチャンクにバッファリングするために途中に何かを置く必要があります。

于 2011-10-02T19:11:45.780 に答える
1

コードをすばやくスキャンしました。すべてのメッセージは暗号化された後に送信されるため、送信するデータの合計は16の倍数にコマンドの1を加えたものになります。ここまでは順調ですね。

復号化側では、コマンドを削除します。これにより、16の倍数のメッセージが再び表示されます。ただし、を呼び出すmsg.strip()前に呼び出していますdecrypt_my_message。の呼び出しはstrip、最初または最後からバイトを削除することにより、暗号化されたデータを破損する可能性があります。

コードをさらに調べて、他に何か見つかった場合はこの回答を編集します。


編集:

stripパディングにスペース文字を使用していますが、呼び出しを使用してパディングを削除するつもりだったと思います。decrypt_my_message(msg.strip())に変更する必要がありますdecrypt_my_message(msg).strip()


TCPを使用してデータを送信しているため、プロトコルは長期的には頭痛の種になります。私は常にこの種のカスタムプロトコルを使用してメッセージでペイロードの長さを送信するため、受信側はメッセージブロックを正しく受信したかどうかを判断できます。たとえばCMD|LEN(2)|PAYLOAD(LEN)、データフレームとして:を使用できます。つまり、コマンド用に1バイト、予想されるバイト数をサーバーに通知するためにさらに2LENバイト、実際のメッセージのバイト数を意味します。このようにrecvして、正しい金額を読み取るまで呼び出しをループできます。さらに重要なことは、次のパケットが連続して送信された場合、または送信された場合に、次のパケットを読み取ろうとしないことです。

または、パケットが十分に小さい場合は、UDPを使用できます。ワームの別の缶を開きますが、recvUDPで1つのパケットしか受信しないことを知っています。

于 2011-10-02T19:17:34.610 に答える