要设计好一个项目必须要有一个健全的代码框架
一个结构体内有数据域和处理数据的函数指针, 先实现管理链表的函数 增加节点 删除节点 清空链表 遍历节点对每个节点进行操作
再实现协议的注册 把对象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))