我有一个代码库,用于将套接字上的几种消息传输到另一个进程并使用了一个联合
#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[];
}
我的问题是几乎所有套接字函数都需要缓冲区大小来接收消息,那么如何计算这个大小呢? 感谢
答案 0 :(得分:2)
首先,您应该开始使用固定大小的整数,例如uint32_t
(来自<cstdint>
)来获取大小和消息类型。
然后接收应用程序知道读取消息类型需要多少,以及获取大小的读取量。然后只需将指定的字节数读入正确的结构即可。
重要的是联合中的所有结构都必须以size成员开头。