看板 C_and_CPP 關於我們 聯絡資訊
小弟目前在寫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