[问题] data的长度是variable,要用什么方式收?

楼主: zzss2003 (brotherD)   2018-12-22 22:37:47
小弟目前在写socket programming(ap层),收底层UDP送过来的资料。
其中function:
int my_recv_UDP(int s,
void* mem,
int len,
struct sockaddr* from,
int fromlen);
用s来当接口,拿mem来收,收的长度为len,并回传实际接收的资料数(可能会比你在
len 参数中指定的还要少)
比如:
frameLen = my_recv_UDP(socket, rxBuf, 100, &ra, sizeof(ra))
拿socket来收,并把资料放到rxBuf里面,放100笔,回传实际接收的资料数(frameLen可能
少于100,代表这次的frame不到100笔,当然,也有可能下一次的frame超过100笔)
问题:
我想写一个struct,然后用此struct型别的指标指向rxBuf,这样我就可以透过这个指标的
资料结构看rxBuf里面的东西了
比如
typedef struct{
int cmd;
int data[?]; //you don't know the data length
int len;
}rxBuf_s;
rxBuf_s* rxBuf_p = rxBuf;
rxBuf_p->cmd (rxBuf的cmd), rxBuf->data(rxBuf的data), rxBuf_p->len (rxBuf的len)
但...rxBuf里面data的长度不是固定的啊...Orz,这样子我没办法写出一个struct...
所以我就想到,我是不是可以"先"把data length给算出来(算得出来),然"后"再把它放到
struct里,比如:
typedef struct{
int cmd;
int data[lengh]; //this is not allowed in C99 standard
int len;
}rxBuf_s;
然后编译出来的有问题...
上网查了一下发现,C99不允许结构里的阵列大小为变量...
这种情况下,我该怎么办呢?
PS: 上网查过,发现有在结构里把array长度给0的作法,如:
typedef struct{
int cmd;
int len;
int data[0]; //define the flexible array member
}rxBuf_s;
但这方法并不适用于我这个情况,因为我只是要创造一个ptr,并没有要创造一个变量。
作者: stupid0319 (征女友)   2018-12-22 23:36:00
Google Protocol buffers
作者: jasonwu23 (jasonwu)   2018-12-23 00:16:00
vector好吗 或者你每次进来malloc 处理好free
作者: easyman (oops)   2018-12-23 07:21:00
收到一个 buffer , 判断资料收满了, 再切
作者: stupid0319 (征女友)   2018-12-22 15:36:00
Google Protocol buffers
作者: jasonwu23 (jasonwu)   2018-12-22 16:16:00
vector好吗 或者你每次进来malloc 处理好free
作者: easyman (oops)   2018-12-22 23:21:00
收到一个 buffer , 判断资料收满了, 再切
作者: poyenc (发箍)   2018-12-24 02:08:00
问题可以简化成产生动态阵列, 再来根据使用情况设计接口https://wandbox.org/permlink/WrwUrza4jwgcfPoD
作者: IhateOGC (我讨厌)   2017-01-08 15:24:00
都有接收资料长度了,当然宣告ptr
作者: askacis (ASKA)   2018-12-24 13:20:00
一般struct里面都是放指标,再allocate内存给他
作者: Killercat (杀人猫™)   2018-12-24 20:36:00
这种写法是C吧 用C2Lib参考一下要简单就C2Lib 要麻烦就是自己每收一次就malloc一次
作者: dou0228 (7777)   2018-12-25 10:35:00
都用 UDP 了,要不要看一下 UDP 封包设计?UDP header 有 2 bytes 表示资料长度(content length)

Links booklink

Contact Us: admin [ a t ] ucptt.com