0

サーバー (Python で実装) クライアント (C で実装) アプリケーションに取り組んでいます。サーバー側 (Python) で構造体モジュールを使用して、C クライアントから受信した raw バイトをアンパックしたいと考えています。

私のC構造(Cクライアントから):

typedef struct lokesh{
    int command;

     union 
     {
        struct{
            int data[100];
            int ttl[100];
        };

        struct{
            char config[256];

        };   
     };
} mystructdata;

サーバー側での解凍 (Python):-

import struct

data,address=socket.recvfrom(1024)
result=struct.unpack('<i 2048s',data)
print(result[0])

しかし、私はエラーが発生しています:-

struct.error: unpack require object of size 2052  

'<i 2048s'unpack メソッドのフォーマット文字列引数に問題があると思います。

編集 :-

'<i 2048s'今、フォーマット文字列をフォーマット文字 列に置き換えました'<i 256s'

4

2 に答える 2

2

2 つの問題があります。

  • .recvfrom()のタプルを返します。(data, address)データだけを に渡す必要がありますstruct.unpack()

  • ソケットから最大 1024 バイトしか読み取っていませんが、unpack 形式では 2052 バイトが必要です。最初に十分なデータを受信するまで、ソケットから読み取ります。

于 2013-01-25T10:44:58.837 に答える
2

Lokesh、私はPythonの専門家ではありませんが、Pythonの構造体に次のことを伝えているように見えます:

  • リトルエンディアン整数、その​​後に続く
  • 2048文字[]

( http://docs.python.org/2/library/struct.html#format-charactersに基づく)

C 構造体の定義を見ると、それはまったくありません。あなたが持っている:

  • 整数の後に次のいずれかが続きます:
    • それぞれ 100 要素の 2 つの整数配列
    • 256 要素の 1 つの char 配列

ここで、構造体をネットワークにプッシュする C コードを見ないと、整数のエンディアンを知ることは困難です (ネットワークのバイト オーダーはビッグ エンディアンです)。しかし、それはさておき、構造体へのデータ仕様は間違っているようです。

C struct の共用体の解釈は、commandの内容に依存すると思います。そのため、最初にコマンドを調べてから、それに基づいて構造体の適切なフォーマット文字列を考え出す必要があるようです。data/ttl の場合、構造体のパディングの問題につまずく可能性があることに注意してください。これは、クライアント側のコンパイラが、アラインメント要件などを満たすために、データttl配列の間にパディングを挿入することを決定する可能性があるためです。

于 2013-01-25T11:14:37.567 に答える