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 "\n" \
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 *)); <br></br> //匹配函数,根据传入的函数对链表中的每个节点进行操作