结构中的可变长度数组,使用C中的TI编译器(套接字编程)



我正在编写代码,处理从应用层的udp接收的数据。

这是用于从udp 接收数据的功能原型

int my_recv_UDP(int s,
void* mem,
int len,
struct sockaddr* from,
int fromlen);

其中它使用s作为套接字,将数据放入长度为lenmem中,并返回值可能小于len的数据长度。

例如

frameLen = my_recv_UDP(socket, rxBuf, 100, &ra, sizeof(ra));

其中它使用socket作为套接字,将数据放入长度为100rxBuf中,并将数据长度返回给frameLen

原始数据长度可能大于或小于100。由于将长度值指定为100,所以这次可能会得到小于100的数据长度,或者下次会丢失按顺序为100的数据,具体取决于帧。

我打算通过一个结构创建一个数据类型,并让这个结构类型的ptr指向rxBuf。

即:

typedef struct{
int cmd;
int data[?];    //you don't know the data length until you receive data
int len;
}rxBuf_s;

所以,我可以这样做。

rxBuf_s* rxBuf_p = rxBuf; 

有了这个,我可以很容易地在rxBuf中"操作"数据,例如,如果我想将cmd读取到缓冲区:

int Cmd = rxBuf_p->cmd;

但直到我收到它,我才知道数据长度,我也不知道len的偏移量是多少,所以决定在"运行时"中计算长度,并将其放入数组中,比如:

typedef struct{
int cmd;
int data[length];    //length is calculated in run time.
int len;
}rxBuf_s;

但是C99中不允许使用结构中的VLA。
我该怎么办?有什么聪明的方法可以做到这一点吗?

因此,您在帧中按此顺序接收cmd、data[length]、len。正如您已经注意到的,使用C结构不可能实现1:1。至少len字段必须通过不同的方式提取,例如

length = ...; // calculate length
int cmd = *(int*)rxBuf;
int *data = (int*)rxBuf + 1;
int len = *(data + length);

相关内容

  • 没有找到相关文章

最新更新