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
#include <stdio.h>
#include <stdlib.h> #define BUFFER_SIZE 0x1000 #define HTTP 0x1
#define HTTPS 0x2
#define TCP 0x3 #define INUSE 0x1
#define UNUSE 0x2 #define EMPTY 0x2
#define NOEMPTY 0x3 #define false 0
#define ture 1 /* Application parameters */
#define DEBUG (1)
/* Debug prints */
#if DEBUG
#define DBG_PRINT(fmt, args...) do{printf("[*]Listlink: <%s>: " fmt "\n" \
,__func__, ##args); } while (false)
#else
#define DBG_PRINT(...) do {} while (false)
#endif typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32; typedef struct _T_NodeStruct{
u8 id;
u8 flag;
u8 send_buffer[BUFFER_SIZE];
u32 (* Init)(void);
u32 (* SendFunction)(int fd,u8 *send_buffer,u32 length);
}T_NodeStruct;
typedef T_NodeStruct * Pt_NodeStruct; typedef struct _T_ListLinkNode{
T_NodeStruct t_data;
struct _T_ListLinkNode * pt_next;
}T_ListLinkNode;
typedef T_ListLinkNode * Pt_ListLinkNode; typedef struct _T_list{
Pt_ListLinkNode pfront;
Pt_ListLinkNode prear;
u32 length;
}T_list;
typedef T_list * Pt_list; void ClearProtocal( Pt_list ptlist ); //清空协议 利用Register调用的DeleteProtocol把链表内的节点全部删除
void DeleteNode(Pt_list ptlist,u8 id); //选择id进行删除节点
void DeleteProtocal(Pt_list ptlist, Pt_ListLinkNode ptlistnode ); //删除头节点并备份要删除的数据 , 第二个参数也可以给NULL不保存
void DestoryProtocalStack( Pt_list ptlist ); //把链表节点全部置空
u32 GetCurrentSize( Pt_list ptlist ); //获得当前链表的长度
u8 IsEmpty(Pt_list ptlist ); //判空
Pt_list ListLinkInit( void ); //创建链表对象
void RegisterProtocal(Pt_list ptlist,Pt_ListLinkNode ptlistnode ); //注册协议 , 把创建的节点对象添加到链表中,进行管理
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))
LInux基础(04)项目设计一(理解链表管理协议的代码架构)的更多相关文章
- Linux基础知识第六讲,远程管理ssh操作
目录 Linux基础知识第六讲,远程管理ssh操作 一丶什么是SSH 1.什么是SSH 2.了解域名跟端口 二丶SSH命令以及远程连接linux进行维护 1.ssh命令格式 2.scp远程终端拷贝文件 ...
- Linux基础04
** Linux基本操作常用命令(四) ** Linux系统管理命令 1.top:查看系统资源,每隔三秒刷新一次,按q:退出浏览状态 2.free:查看内存信息,-m,以MB单位显示 3.netsta ...
- (大数据工程师学习路径)第一步 Linux 基础入门----文件系统操作与磁盘管理
介绍 本节的文件系统操作的内容十分简单,只会包含几个命令的几个参数的讲解,但掌握这些也将对你在学习后续其他内容的过程中有极大帮助. 因为本课程的定位为入门基础,尽快上手,故没有打算涉及太多理论内容,前 ...
- (大数据工程师学习路径)第一步 Linux 基础入门----用户及文件权限管理
用户及文件权限管理 实验介绍 1.Linux 中创建.删除用户,及用户组等操作. 2.Linux 中的文件权限设置. 一.Linux 用户管理 Linux 是一个可以实现多用户登陆的操作系统,比如“李 ...
- linux基础-第十六单元 yum管理RPM包
第十六单元 yum管理RPM包 yum的功能 本地yum配置 光盘挂载和镜像挂载 本地yum配置 网络yum配置 网络yum配置 Yum命令的使用 使用yum安装软件 使用yum删除软件 安装组件 删 ...
- linux基础命令学习五(软件包管理、下载管理)
Linux 软件包管理 本文主要是记录下RedHat系列的软件包管理. 内容分为以下二个部分:二进制包的管理,源代码包的管理 一.二进制包的管理 1.1概念 主要有RPM和YUM这两种包管理. 两 ...
- Linux基础学习:文件与目录管理
目录与路径 目录的相关操作 几个特殊的目录: . :表示当前目录 .. :表示上一层目录 - :表示前一个工作目录 ~ :表示当前用户所在的主文件夹 ~account :表示account用户所在的主 ...
- Linux基础入门-用户及文件权限管理
一.Linux用户管理: 不同的用户的文件都是放在同一个物理磁盘上的甚至同一个逻辑分区或者目录里,但是由于Linux的用户管理和权限机制,不同用户不能轻易查看.修改彼此的文件. 1. 查看用户: wh ...
- Linux基础学习(15)--启动管理
第十五章——启动管理 一.CentOS 6.x启动管理 1.系统运行级别: (1)运行级别: (2)运行级别命令: (3)系统默认运行级别: 2.系统启动过程: . 二.启动引导程序grub 1.Gr ...
随机推荐
- 常用方法 Entitys转换为DataTable
效率比较屁,将近可以用 public static DataTable EntitiesToDataTable<T>(List<T> entitys) { Type t = t ...
- select函数及fd_set介绍
1. select函数 1. 用途 在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在 ...
- Macbook Pro A1398 換電池手札
前不久老MBP总是风扇狂转,cpu 100%,一直觉得有问题,就买了工具想着把機器拆開看一下. 結果,不拆不知道,一拆開發現機器變成下面醬紫了: 整個一炸藥包啊!此時我腦中只有一個念頭:得趕緊馬上立刻 ...
- js处理事件冒泡(兼容写法)
event = event || window.event; if (event.stopPropagation) { event.stopPropagation(); } else { event. ...
- 一起学Makefile(一)
make和makefile makefile文件帮助我们记录了整个项目工程的所有需要编译的文件列表,这样我们在编译时仅需要输入简单的make命令就能编译出我们期望的结果. makefile文件反映了整 ...
- nginx 日志之 access_log
web服务器的访问日志是非常重要的,我们可以通过访问日志来分析用户的访问情况, 也可以通过访问日志发现一些异常访问,比如cc攻击. 格式: access_log /path/to/logfile fo ...
- 「HNOI2015」亚瑟王
传送门 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟 ...
- docker安装 与 基本配置
1.安装docker #yum remove docker \ docker-common \ container-selinux \ docker-selinux \ docker-engine \ ...
- [asm] 小菜汇编基础和学习技巧小结(一)
以下小结纯属小菜自学过程产生的dump,大神请飘过! 汇编是一门庞大复杂的学问,在计算机的世界里差不多无所不入.很多编程领域都会或多或少跟汇编打交道.本人不是科班出身的程序员,所以很多基础都为零,学历 ...
- SpringBoot(十五):SpringBoot2.x集成eureka实现注高可用册中心,高可用的服务器提供者,以及消费者示例
本文代码请参考<https://github.com/478632418/springcloud-eureka-server-client/tree/master/mall>.<ht ...