作者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://www.ptt.cc/bbs/C_and_CPP/M.1545460670.A.A20.html
※ 編輯: zzss2003 (118.163.216.18), 12/22/2018 14:55:18
推 stupid0319: Google Protocol buffers 12/22 15:36
推 jasonwu23: vector好嗎 或者你每次進來malloc 處理好free 12/22 16:16
推 easyman: 收到一個 buffer , 判斷資料收滿了, 再切 12/22 23:21
→ poyenc: 問題可以簡化成產生動態陣列, 再來根據使用情況設計介面 12/24 02:08
推 askacis: 一般struct裡面都是放指標,再allocate記憶體給他 12/24 13:20
→ Killercat: 這種寫法是C吧 用C2Lib參考一下 12/24 20:36
→ Killercat: 要簡單就C2Lib 要麻煩就是自己每收一次就malloc一次 12/24 20:37
推 dou0228: 都用 UDP 了,要不要看一下 UDP 封包設計? 12/25 10:35
→ dou0228: UDP header 有 2 bytes 表示資料長度(content length) 12/25 10:36
推 IhateOGC: 都有接收資料長度了,當然宣告ptr 01/08 15:24