作者zzss2003 (brotherD)
看板C_and_CPP
标题[问题] data的长度是variable,要用什麽方式收?
时间Sat Dec 22 14:37:47 2018
小弟目前在写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,并没有要创造一个变数。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.216.18
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1545460670.A.A20.html
※ 编辑: zzss2003 (118.163.216.18), 12/22/2018 14:55:18
1F:推 stupid0319: Google Protocol buffers 12/22 15:36
2F:推 jasonwu23: vector好吗 或者你每次进来malloc 处理好free 12/22 16:16
3F:推 easyman: 收到一个 buffer , 判断资料收满了, 再切 12/22 23:21
4F:→ poyenc: 问题可以简化成产生动态阵列, 再来根据使用情况设计介面 12/24 02:08
6F:推 askacis: 一般struct里面都是放指标,再allocate记忆体给他 12/24 13:20
7F:→ Killercat: 这种写法是C吧 用C2Lib参考一下 12/24 20:36
8F:→ Killercat: 要简单就C2Lib 要麻烦就是自己每收一次就malloc一次 12/24 20:37
9F:推 dou0228: 都用 UDP 了,要不要看一下 UDP 封包设计? 12/25 10:35
10F:→ dou0228: UDP header 有 2 bytes 表示资料长度(content length) 12/25 10:36
11F:推 IhateOGC: 都有接收资料长度了,当然宣告ptr 01/08 15:24