[問題] data的長度是variable,要用什麼方式收?

看板C_and_CPP作者 (brotherD)時間6年前發表 (2018/12/22 06:37), 6年前編輯推噓6(605)
留言11則, 8人參與, 7年前最新討論串1/2 (看更多)
小弟目前在寫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

12/22 15:36, 6年前 , 1F
Google Protocol buffers
12/22 15:36, 1F

12/22 16:16, 6年前 , 2F
vector好嗎 或者你每次進來malloc 處理好free
12/22 16:16, 2F

12/22 23:21, 6年前 , 3F
收到一個 buffer , 判斷資料收滿了, 再切
12/22 23:21, 3F

12/24 02:08, 6年前 , 4F
問題可以簡化成產生動態陣列, 再來根據使用情況設計介面
12/24 02:08, 4F

12/24 02:08, 6年前 , 5F

12/24 13:20, 6年前 , 6F
一般struct裡面都是放指標,再allocate記憶體給他
12/24 13:20, 6F

12/24 20:36, 6年前 , 7F
這種寫法是C吧 用C2Lib參考一下
12/24 20:36, 7F

12/24 20:37, 6年前 , 8F
要簡單就C2Lib 要麻煩就是自己每收一次就malloc一次
12/24 20:37, 8F

12/25 10:35, 6年前 , 9F
都用 UDP 了,要不要看一下 UDP 封包設計?
12/25 10:35, 9F

12/25 10:36, 6年前 , 10F
UDP header 有 2 bytes 表示資料長度(content length)
12/25 10:36, 10F

01/08 15:24, 7年前 , 11F
都有接收資料長度了,當然宣告ptr
01/08 15:24, 11F
文章代碼(AID): #1S7Tk-eW (C_and_CPP)
文章代碼(AID): #1S7Tk-eW (C_and_CPP)