通过套接字接收灵活的阵列

时间:2014-05-13 09:08:44

标签: c++ c ipc

我有一个代码库,用于将套接字上的几种消息传输到另一个进程并使用了一个联合

#define maxlen 60
typedef struct
{
    TYRES t[MAXLEN];
} TYRE_T;

typdef struct
{
    TUBES t[MAXLEN];
}TUBES_T;

typedef struct
{
    TYPE t[MAXLEN];
} TYPE_T;

typedef union
{
    TYRE_T tyres;
    TUBES_T tubes;
    TYPE_T type;
} messageunion;

typedef struct
{
    int code;
    messageunion msg;
} socketmessage_t;

enum msgtype
{
   INVALID = -1;
   TYRES,
   TUBES,
   TYPES
};

//On clientside
processMessage(socketmessage_t* msg)
{
    switch(msg->code)
    {
        ....
    }
}

现在MAXLEN不是一个宏,但它将是由程序评估的运行时变量。所以我将所有数组成员更改为灵活数组,如此

typedef struct
{
int size;
TYRES t[];
}

我的问题是几乎所有套接字函数都需要缓冲区大小来接收消息,那么如何计算这个大小呢? 感谢

1 个答案:

答案 0 :(得分:2)

首先,您应该开始使用固定大小的整数,例如uint32_t(来自<cstdint>)来获取大小和消息类型。

然后接收应用程序知道读取消息类型需要多少,以及获取大小的读取量。然后只需将指定的字节数读入正确的结构即可。

重要的是联合中的所有结构都必须以size成员开头。