通过套接字接收灵活阵列

Receiving flexible array over socket

本文关键字:阵列 套接字      更新时间:2023-10-16

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

#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[];
}

我的问题是几乎所有的套接字函数需要缓冲区的大小来接收消息,所以如何计算这里的大小?由于

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

然后接收应用程序知道读取多少来获得消息类型,以及读取多少来获得消息大小。然后简单地将指定的字节数读入正确的结构中。

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