0

我正在开发一个服务器(用 Python 实现)客户端(用 C 实现)应用程序。我想使用服务器端的 struct 模块(Python)解压缩从 C 客户端接收到的原始字节。

我的 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  

我认为问题出在我的 unpack 方法的格式字符串'<i 2048s'参数中。

编辑 :-

现在,我已经用格式字符串替换'<i 2048s'了格式字符串 '<i 256s'

4

2 回答 2

2

有两个问题:

  • .recvfrom()返回 的元组(data, address),您只需将数据传递给struct.unpack()

  • 您最多只能从套接字读取 1024 个字节,但解包格式需要 2052 个字节。从套接字读取,直到您首先收到足够的数据。

于 2013-01-25T10:44:58.837 回答
2

Lokesh,我不是 python 专家,但在我看来,你是在告诉 python 的struct你有:

  • 一个小端整数,后跟
  • 2048 个字符[]

(基于http://docs.python.org/2/library/struct.html#format-characters

查看您的 C 结构定义,这根本不是您所拥有的。你有:

  • 一个整数,后跟以下之一:
    • 两个整数数组,每个数组有 100 个元素
    • 一个 256 个元素的 char 数组

现在,如果不查看将结构推送到线路上的 C 代码,就很难知道整数的字节序(网络字节顺序是大字节序)。但除此之外,您对struct的数据规范看起来是错误的。

I'm guessing that the interpretation of the union in the C struct will depend on the contents of command. As such, it seems like you'll need to examine command first off, then come up with an appropriate format string for struct based on that. Note that in the data/ttl case you may trip over struct padding issues since it's possible that the compiler on the client side may decide to insert some padding between the data and ttl arrays in order to satisfy alignment requirements, etc.

于 2013-01-25T11:14:37.567 回答