LInux基础(04)项目设计一(理解链表管理协议的代码架构)

要设计好一个项目必须要有一个健全的代码框架

  一个结构体内有数据域和处理数据的函数指针, 先实现管理链表的函数 增加节点  删除节点  清空链表  遍历节点对每个节点进行操作

                      再实现协议的注册 把对象socket 添加到链表中进行管理

使用链表实现管理协议的操作 ,  创建链表(LinkListInit)对象 , 

添加注册协议(尾部添加链表节点(RegisterProtocol)) ,

删除协议(头部删除(DeleteProtocol)) ,

遍历链表的节点并对每一个节点进行匹配函数操作(TraverseList) ,

删除指定ID的协议(删除指定节点(DeleteNode)),

清空链表(把所以节点删除(ClearProtocol)),  销毁协议对象(把链表对象置空(DestoryProtocolStack)), 返回链表长度(父链表对象的length(GetCurrentSize)).

注册HTTP协议(InitHttp):1.新建(对象)节点(malloc)  

        2.设置对象(t_data里 id = HTTP ; flag = inuse; init = 另外写一个函数(InitHttpNode)连接或监听; SendFunction = 另外实现发送函数(HttpSendFunction))

          ( InitHttpNode: 设置连接的 ip地址 端口号 或 监听 用的...  HttpSendFunction : 发送send_buffer用的....

        3.把创建并设置好的对象添加到(RegisterProtocol)到链表对象里

注册HTTPS TCP 协议的代码框架同HTTP

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 #define BUFFER_SIZE 0x1000
 5     
 6 #define HTTP  0x1
 7 #define HTTPS 0x2
 8 #define TCP   0x3
 9     
10 #define INUSE  0x1
11 #define UNUSE  0x2
12     
13 #define EMPTY   0x2
14 #define NOEMPTY 0x3
15 
16 #define false 0
17 #define ture 1
18 
19 /* Application parameters */
20 #define DEBUG (1)
21     /* Debug prints */
22 #if DEBUG
23     #define DBG_PRINT(fmt, args...)  do{printf("[*]Listlink: <%s>: " fmt "
" 
24                             ,__func__, ##args); } while (false)
25 #else
26     #define DBG_PRINT(...) do {} while (false)
27 #endif
28 
29 
30 typedef unsigned char  u8;
31 typedef unsigned short u16;
32 typedef unsigned int   u32;
33 
34 typedef struct _T_NodeStruct{
35     u8  id;
36     u8  flag;
37     u8  send_buffer[BUFFER_SIZE];
38     u32 (* Init)(void);
39     u32 (* SendFunction)(int fd,u8 *send_buffer,u32 length);
40 }T_NodeStruct;
41 typedef T_NodeStruct * Pt_NodeStruct;
42 
43 
44 typedef struct _T_ListLinkNode{
45     T_NodeStruct              t_data;
46     struct _T_ListLinkNode  * pt_next;
47 }T_ListLinkNode;
48 typedef T_ListLinkNode * Pt_ListLinkNode;
49 
50 typedef struct _T_list{
51     Pt_ListLinkNode  pfront;
52     Pt_ListLinkNode  prear;
53     u32              length;
54 }T_list;
55 typedef T_list * Pt_list;
56 
57 
58 void ClearProtocal( Pt_list ptlist );  //清空协议 利用Register调用的DeleteProtocol把链表内的节点全部删除
59 void DeleteNode(Pt_list ptlist,u8 id);  //选择id进行删除节点
60 void DeleteProtocal(Pt_list ptlist, Pt_ListLinkNode ptlistnode );  //删除头节点并备份要删除的数据 , 第二个参数也可以给NULL不保存
61 void DestoryProtocalStack( Pt_list ptlist );    //把链表节点全部置空
62 u32 GetCurrentSize( Pt_list ptlist );    //获得当前链表的长度
63 u8 IsEmpty(Pt_list ptlist );    //判空
64 Pt_list ListLinkInit( void );    //创建链表对象
65 void RegisterProtocal(Pt_list ptlist,Pt_ListLinkNode ptlistnode );  //注册协议 , 把创建的节点对象添加到链表中,进行管理
66 void TraverseList( Pt_list ptlist, void(* Traverse)(Pt_ListLinkNode ptlistlinknode,u8 *)); 
                                               //匹配函数,根据传入的函数对链表中的每个节点进行操作

//初始化协议节点
67 u32 HttpSendFunction(int sock,u8 *send_buffer,u32 length)  //发送函数 write()

68 u32 InitHttpNode()  //设置sockaddr_in socektaddr 的地址协议族 如:协议族 ip 端口
69 Pt_ListLinkNode InitHttp(Pt_list ptlist, u8* pdata , u32 length)  //设置结构体
//
SendFunction = HttpSendFunction   Init = InitHttpNode   memcpy(send_buffer ,send_buffer , sizeof(send_buffer))
原文地址:https://www.cnblogs.com/yxnrh/p/11399179.html