C++ 基于socket的柔性阵列接收
我得到了一个用于将套接字上的几种消息传输到另一个进程的代码库,并为此使用了一个联合C++ 基于socket的柔性阵列接收,c++,c,ipc,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
#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\u t
(from)
然后,接收应用程序知道要读取多少以获得消息类型,以及要读取多少以获得大小。然后只需将指定数量的字节读入正确的结构
重要的是,联盟中的所有结构都必须以一个size成员开始。如果您真的想成为架构之上的门户,那么这将变得更加棘手,可以使用一些协议中间件。