Я пишу код, который работает с данными, полученными от udp на прикладном уровне.
Это прототип функции, используемый для получения данных от udp
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. Поскольку вы задаете значение длины с помощью100, вы можете получить длину данных меньше 100 на этот раз или потерять данные в следующем порядке 100 в зависимости от фрейма.
Я намеревался создать тип данных с помощью структуры и позволить ptr этого типа структуры указывать наrxBuf. * 1023 *
т.е.:
typedef struct{
int cmd;
int data[?]; //you don't know the data length until you receive data
int len;
}rxBuf_s;
Итак, я могу сделать это следующим образом.
rxBuf_s* rxBuf_p = rxBuf;
С этим я могу легко "манипулировать" данными в rxBuf, дляНапример, если я хочу прочитать cmd в буфер:
int Cmd = rxBuf_p->cmd;
Но я будуЯ не знаю длину данных до тех пор, пока я ее не получу, я также не знаю, какое смещение это len, поэтому решил вычислить длину в «времени выполнения» и поместить ее в массив, например:
typedef struct{
int cmd;
int data[length]; //length is calculated in run time.
int len;
}rxBuf_s;
Но VLA в структуре не допускается в C99.
Как я могу это сделать?Есть какой-нибудь умный способ сделать это?