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

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

                      再实现协议的注册 把对象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)项目设计一(理解链表管理协议的代码架构)的更多相关文章

  1. Linux基础知识第六讲,远程管理ssh操作

    目录 Linux基础知识第六讲,远程管理ssh操作 一丶什么是SSH 1.什么是SSH 2.了解域名跟端口 二丶SSH命令以及远程连接linux进行维护 1.ssh命令格式 2.scp远程终端拷贝文件 ...

  2. Linux基础04

    ** Linux基本操作常用命令(四) ** Linux系统管理命令 1.top:查看系统资源,每隔三秒刷新一次,按q:退出浏览状态 2.free:查看内存信息,-m,以MB单位显示 3.netsta ...

  3. (大数据工程师学习路径)第一步 Linux 基础入门----文件系统操作与磁盘管理

    介绍 本节的文件系统操作的内容十分简单,只会包含几个命令的几个参数的讲解,但掌握这些也将对你在学习后续其他内容的过程中有极大帮助. 因为本课程的定位为入门基础,尽快上手,故没有打算涉及太多理论内容,前 ...

  4. (大数据工程师学习路径)第一步 Linux 基础入门----用户及文件权限管理

    用户及文件权限管理 实验介绍 1.Linux 中创建.删除用户,及用户组等操作. 2.Linux 中的文件权限设置. 一.Linux 用户管理 Linux 是一个可以实现多用户登陆的操作系统,比如“李 ...

  5. linux基础-第十六单元 yum管理RPM包

    第十六单元 yum管理RPM包 yum的功能 本地yum配置 光盘挂载和镜像挂载 本地yum配置 网络yum配置 网络yum配置 Yum命令的使用 使用yum安装软件 使用yum删除软件 安装组件 删 ...

  6. linux基础命令学习五(软件包管理、下载管理)

    Linux 软件包管理   本文主要是记录下RedHat系列的软件包管理. 内容分为以下二个部分:二进制包的管理,源代码包的管理 一.二进制包的管理 1.1概念 主要有RPM和YUM这两种包管理. 两 ...

  7. Linux基础学习:文件与目录管理

    目录与路径 目录的相关操作 几个特殊的目录: . :表示当前目录 .. :表示上一层目录 - :表示前一个工作目录 ~ :表示当前用户所在的主文件夹 ~account :表示account用户所在的主 ...

  8. Linux基础入门-用户及文件权限管理

    一.Linux用户管理: 不同的用户的文件都是放在同一个物理磁盘上的甚至同一个逻辑分区或者目录里,但是由于Linux的用户管理和权限机制,不同用户不能轻易查看.修改彼此的文件. 1. 查看用户: wh ...

  9. Linux基础学习(15)--启动管理

    第十五章——启动管理 一.CentOS 6.x启动管理 1.系统运行级别: (1)运行级别: (2)运行级别命令: (3)系统默认运行级别: 2.系统启动过程: . 二.启动引导程序grub 1.Gr ...

随机推荐

  1. 《dream》

    <dream- 梦想> I don't know what that dream is that you have, I don't care how disappointing it m ...

  2. Linux禁止ping和开启ping的方法

    Linux默认是允许Ping响应的,系统是否允许Ping由2个因素决定的:A.内核参数,B.防火墙,需要2个因素同时允许才能允许Ping,2个因素有任意一个禁Ping就无法Ping.   一.通过修改 ...

  3. AttributeError: module 'pytest' has no attribute 'allure'

    解决 pip3 uninstall pytest-allure-adaptor pip3 install allure-pytest 参考: https://www.cnblogs.com/lansa ...

  4. WAMP配置允许外网访问、绑定域名

    如果wamp默认端口已经被占用,需要修改,则打开apache目录下的,conf文件下的httpd.conf文件 如图,把框中的默认80端口修改为自己需要的端口,然后重启WAMP即可. 想要实现外网访问 ...

  5. bzoj4868 期末考试 题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4868 显然我们只关注最后出分的学科. 刚开始想的是dp,然而不知道如何记录状态. 突然就想到了正解 ...

  6. Python全栈工程师(Python3 所有基础内容 0-0)

    转发:https://www.cnblogs.com/ParisGabriel/p/9388030.html statements  语句print   输出quit()  退出exit() 退出ct ...

  7. java复制对象之深拷背

    在java开发中,有时我们需要复制对象,并且确保修改复制得到的对象不会影响原来的对象. 于是,有些人可能会写出类似以下的代码: public class CloneTest { public stat ...

  8. 划水嘶吼misc

    划水嘶吼misc [题目描述]: 开局一张图,flag全靠编 [题目writeup]: 瞅半天,瞅到二维码 然后用potplayer按帧查找到skr二维码 通过PS自动调整对比度,扫出key1,2,3 ...

  9. 【Gamma】Scrum Meeting 4

    目录 写在前面 进度情况 任务进度表 Gamma阶段燃尽图 照片 写在前面 例会时间:5.31 22:30-23:00 例会地点:微信群语音通话 代码进度记录github在这里 临近期末,团队成员课程 ...

  10. gradle/gradle plugin/Android studio关系

    gradle - 构建工具,存储于Users/stono/.gradle/wrapper/dists Adroid Studio- IDE Gradle plugin - 在AS中使用Gradle的插 ...