Реализация очереди сервера ретрансляции в C
Я хочу реализовать очередь на стороне сервера:
- хранить пакеты в очереди (скопировать их из буфера recvfrom)
- искать пакеты по идентификаторам и извлекать их для повторной передачи
- взять 2 пакета с разными идентификаторами и обработать их вместе
- удалять пакеты с одинаковым идентификатором
- удалить все пакеты из очереди по истечении таймера
Я много читаю, но я не уверен, какую структуру данных лучше всего использовать для этой проблемы, связанные списки, хеш-таблицы? У меня нет опыта в этой области, мне нужен совет для наиболее эффективного алгоритма
Спасибо
2 ответа
Для эффективной структуры данных лучше всего использовать связанный список. Например, структура данных udp в списке ссылок.
/* The UDP data packet structure */
struct udp_data
{
struct udp_data* u_next;
short id; /* id for this packet */
void * u_data; /* packet data */
//Add more field if you want
......................................
.........................................
};
typedef struct udp_data *UDP_DATA;
И самое главное, что вы должны знать, связанный список управления.
Насколько мне известно, лучший способ решить проблему такого рода - это использовать стандартный заголовок для всех пакетов с одинаковой длиной заголовка, затем взять данные размера заголовка, из заголовка узнать длину пакета и получить данные о длине пакета из пула, и повторить то же самое.
надеюсь найти ваш ответ.
например
struct Common_header{
float ver;
int flag;
int msg_type;
int msg_len;
};
struct Req_Cim_Nim_Snr{
struct Common_header header;
char master[30];
char cpe[30];
};
struct Req_Cim_Nim_Fwr{
struct Common_header header;
char fwr_link[200];
};
в обоих сообщениях запроса у меня есть структурный заголовок, который содержит длину сообщения, поэтому я сначала беру заголовок и принимаю msg_len количество кусков, чтобы получить сообщение целиком.
о структуре данных, так как ее первый в первом, связном списке достаточно хорош.