Реализация очереди сервера ретрансляции в C

Я хочу реализовать очередь на стороне сервера:

  1. хранить пакеты в очереди (скопировать их из буфера recvfrom)
  2. искать пакеты по идентификаторам и извлекать их для повторной передачи
  3. взять 2 пакета с разными идентификаторами и обработать их вместе
  4. удалять пакеты с одинаковым идентификатором
  5. удалить все пакеты из очереди по истечении таймера

Я много читаю, но я не уверен, какую структуру данных лучше всего использовать для этой проблемы, связанные списки, хеш-таблицы? У меня нет опыта в этой области, мне нужен совет для наиболее эффективного алгоритма

Спасибо

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 количество кусков, чтобы получить сообщение целиком.

о структуре данных, так как ее первый в первом, связном списке достаточно хорош.

Другие вопросы по тегам