[問題] 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