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

作者: tjjh89017 (伊達政宗)   2018-12-23 10:39:59
我想可能大概是這種感覺吧?
就你敘述的想法而言
Update: 我剛剛發現有地方寫錯了
typedef struct{
int cmd;
int len;
int data[0]; //define the flexible array member
}rxBuf_s;
int my_recv_UDP(int s, rxBuf_s **mem, int maxlen, struct sockaddr* from, int fromlen) {
char *buffer = malloc(maxlen * sizeof(int));
int length = 0;
// length is actually length from socket
length = Some_UDP_recv_function(s, buffer, maxlen * sizeof(int));
*mem = (rxBuf_s*)malloc(sizeof(int) * (2 + length));
(*mem)->cmd = some_parse_function();
(*mem)->len = length;
memcpy((*mem)->data, buffer, length * sizeof(int));
free(buffer);
return length;
}
int main(){
...
rxBuf_s *rxBuf;
int len = my_recv_UDP(socket, &rxBuf, 100, &ra, sizeof(ra));
// do something to rxBuf
if(rxBuf->data[0] == SOME_NUMBER) {
...
}
free(rxBuf);
...
}
※ 引述《zzss2003 (brotherD)》之銘言:
: 小弟目前在寫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,並沒有要創造一個變數。
作者: jobsdone (完工了)   2018-12-23 19:18:00
fix cmd的size,data直接指到buffer加cmd的offset的位置感覺比較好些

Links booklink

Contact Us: admin [ a t ] ucptt.com