重传服务器队列的C语言实现

重传服务器队列的C语言实现,c,data-structures,network-programming,packet,C,Data Structures,Network Programming,Packet,我想实现服务器端队列功能: 将数据包存储在队列中(从recvfrom缓冲区复制) 按id搜索数据包并检索它们以便重新传输 取两个id不同的数据包,一起处理 删除具有相同id的数据包 计时器过期时从队列中删除所有数据包 我读了很多书,但我不确定什么是解决这个问题的最好的数据结构,链表,哈希表?我没有这方面的经验,所以我需要关于最有效算法的建议 感谢您提供高效的数据结构。链接列表是最佳选择。例如,链接列表中的udp数据结构 /* The UDP data packet structure */ s

我想实现服务器端队列功能:

  • 将数据包存储在队列中(从recvfrom缓冲区复制)
  • 按id搜索数据包并检索它们以便重新传输
  • 取两个id不同的数据包,一起处理
  • 删除具有相同id的数据包
  • 计时器过期时从队列中删除所有数据包
  • 我读了很多书,但我不确定什么是解决这个问题的最好的数据结构,链表,哈希表?我没有这方面的经验,所以我需要关于最有效算法的建议


    感谢您提供高效的数据结构。链接列表是最佳选择。例如,链接列表中的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]; 
    };
    
    在这两个请求消息中,我都有一个包含消息长度的struct头,因此我首先获取头,然后获取msg_leng长度的比特数来获取整个消息


    关于数据结构,由于它是先进先出的,链表已经足够好了

    要明确的是,这些只是原始tcp/ip数据包?不,有udp socketsJayeshbhoi,你不认为在链表中查找操作很昂贵吗?如果我想找到例如id为50的数据包,您必须按顺序浏览整个列表以找到并抓取该数据包…是否有更好的解决方案?是,遍历是搜索列表的唯一方法,但如果您从内存的角度考虑,则链表会更好,因为它会动态分配内存。如果在设计时已知最大元素。然后使用数组选择相同的结构(排除
    struct udp_data*u_next
    ),但在数组中静态分配内存。)确定,现在,您可以选择使用
    链表
    (消耗更少内存查找操作有点慢)还是
    结构数组
    (消耗大量内存但查找操作很快)。我的队列中将有很多查找操作,因此我认为链表不是最佳解决方案…我不确定数组,我从来没有结构数组,也不知道如何处理静态内存分配……哈希表呢?你有过使用它们的经验吗?在数组和哈希表中检索元素通常是相似的,但哈希表需要固定的时间。有关更多信息,请访问其他主题Trilok M,我不理解你的解释,因为你使用的是结构Req_Cim_Nim_Snr和Req_Cim_Nim_Fwr,如何在队列中添加、搜索或删除数据包?我不理解您的数据结构,应该以哪种方式实现。。?