Linux网络编程学习心得.5

news2025/3/1 15:12:32

1.libevent编写tcp服务器流程

创建套接字

绑定

监听

创建event_base根节点

初始化上树节点  lfd

上树

循环监听

收尾

普通的event事件   文件描述符   事件(底层缓冲区的读事件或者写事件) 触发    回调

高级的event事件  bufferevent事件  

核心:  一个文件描述符  两个缓冲区  3个回调

 读写缓冲区,读回调,写回调,事件回调,一个文件描述符,

2.bufferveent事件的监听流程和相关的API函数

改变了事件触发回调,设置完自动上树,设置事件使能和非使能,就可以让一个事件实现某种功能, 

bufferevent事件的API

 创建新的节点

struct bufferevent *bufferevent_socket_new(struct event_base *base, evutil_socket_t fd, int options);

参数:

    base  : event_base 根节点

    fd: 要初始化上树的文件描述符

    options :

           BEV_OPT_CLOSE_ON_FREE   -- 释放bufferevent自动关闭底层接口   

         BEV_OPT_THREADSAFE      -- 使bufferevent能够在多线程下是安全的    

返回值:

   新建节点的地址

设置节点的回调

释放bufferevent

void bufferevent_setcb(struct bufferevent *bufev,

    bufferevent_data_cb readcb, bufferevent_data_cb writecb,

bufferevent_event_cb eventcb, void *cbarg);

参数:

    bufev : 新建的节点的地址

    readcb : 读回调

    writecb : 写回调

    eventcb : 异常回调

    cbarg: 传给回调函数的参数

    typedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx);// 读写回调

    typedef void (*bufferevent_event_cb)(struct bufferevent *bev, short what, void *ctx);//事件回调

BEV_EVENT_EOF, 对方关闭连接

BEV_EVENT_ERROR,出错

BEV_EVENT_TIMEOUT,超时

 BEV_EVENT_CONNECTED 建立连接成功

让事件使能

int bufferevent_enable(struct bufferevent *bufev, short event);//EV_READ  EV_WRITE

int bufferevent_disable(struct bufferevent *bufev, short event);//EV_READ  EV_WRITE

发送数据

int bufferevent_write(struct bufferevent *bufev, const void *data, size_t size);

    bufferevent_write是将data的数据写到bufferevent的写缓冲区

接收数据

size_t bufferevent_read(struct bufferevent *bufev, void *data, size_t size);

    bufferevent_read 是将bufferevent的读缓冲区数据读到data中,同时将读到的数据从bufferevent的读缓冲清除。

3.连接侦听器 

创建套接字 绑定 监听  提取

struct evconnlistener *evconnlistener_new_bind(struct event_base *base,

    evconnlistener_cb cb, void *ptr, unsigned flags, int backlog,

const struct sockaddr *sa, int socklen);

参数:

    base : base根节点

    cb : 提取cfd后调用的回调

    ptr : 传给回调的参数

    flags :

        LEV_OPT_LEAVE_SOCKETS_BLOCKING   文件描述符为阻塞的

         LEV_OPT_CLOSE_ON_FREE            关闭时自动释放

         LEV_OPT_REUSEABLE                端口复用

         LEV_OPT_THREADSAFE               分配锁,线程安全

backlog : -1

sa : 绑定的地址信息

socklen : sa的大小

返回值: 连接侦听器的地址

回调

typedef void (*evconnlistener_cb)(struct evconnlistener *evl, evutil_socket_t fd, struct sockaddr *cliaddr, int socklen, void *ptr);

参数:

    evl :  链接侦听器的地址

    fd :  cfd

    cliaddr: 客户端的地址信息

    ptr:  evconnlistener_new_bind传过来的参数

4.创建套接字 连接服务器 

struct bufferevent *bufferevent_socket_new(struct event_base *base,-1, int options);

int bufferevent_socket_connect(struct bufferevent *bev, struct sockaddr *serv, int socklen);

bev: 新建的节点

serv: 服务器的地址信息

socklen: serv长度

5.webserver服务器原理

网络地址和端口通过http协议 ,进行解析请求找到浏览器请求的文件,没找到返回状态码404,根据域名也可以解析通过DNS解析

6.了解html文件和HTTP协议

html   超文本标签语句(超文本标记语言)

<><>

HTTP协议

http请求

请求行: GET /demo.html HTTP/1.1\r\n

            请求方式   /请求的内容   版本\r\n 

请求头

空行

\r\n

数据

7.http应答和状态行

200 OK  客户端请求成功

301  Moved Permanently 重定向

400 Bad Request       客户端请求有语法错误,不能被服务器所理解

401 Unauthorized      请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

403 Forbidden            服务器收到请求,但是拒绝提供服务

404 Not Found           请求资源不存在,eg:输入了错误的URL

500 Internal Server Error     服务器发生不可预期的错误

503 Server Unavailable        服务器当前不能处理客户端的请求,一段时间后可能恢复正常

 

 8.读取目录下的所有文件名

struct dirent {

               ino_t          d_ino;       /* inode number */

               off_t          d_off;       /* not an offset; see NOTES */

               unsigned short d_reclen;    /* length of this record */

               unsigned char  d_type;      /* type of file; not supported

                                              by all filesystem types */

               char           d_name[256]; /* filename */

           };

scandir 读取目录下的文件

struct dirent **mylist : //指向指针数组的首元素的地址

int scandir(const char *dirp, struct dirent ***namelist,

              int (*filter)(const struct dirent *),

              int (*compar)(const struct dirent **, const struct dirent **));

参数:

        dirp: 目录的路径名

        namelist:  mylist地址

        filter: 过滤的函数入口地址

        compar : 排序函数入口地址   写 alphasort(字母排序)

返回值: 读取文件的个数

9.请求  苦瓜.txt 

[GET]  [/%E8%8B%A6%E7%93%9C.txt]  [HTTP/1.1]

char buf[128]={  0xe8,0x8b,0xa6,0xe7,0x93,0x9c,'.','t','x','t'};

"e8"  => 0xe8

'8'   =>   '8'-'0' = 8

e =  'e' -'a'+10 =14

'e8' =    ('e' -'a'+10)*16 + ('8'-'0')*1 = 0xe8

 10.发送大文件

写缓存区可能满,写不进去,写不进去监听EPOLLOUT,将没有发送的数据保存,等写事件触发,写出去

消息存储未发送的数据

总结: 

libevent编写tcp服务器流程创建套接字,绑定,监听,创建根节点,lfd,上树,循环监听,普通event事件文件描述符,事件触发回调,bufferevent读写缓冲区,读回调,写回调,事件回调,一个文件描述符

bufferevent改变了事件触发回调,设置完自动上树,设置事件使能和非使能,就可以让一个事件实现某种功能,知道初始化上树文件描述符,设置节点回调,设置事件使能,设置读写数据函数

连接侦听器 创建套接字,绑定监听提取,

创建套接字 buffer_event_new创建节点,

网络地址和端口通过http协议 ,进行解析请求找到浏览器请求的文件,没找到返回状态码404,根据域名也可以解析通过DNS解析

html超文本标签语句http协议请求行的代码不要忘记\r\n,get post一个明文传输

应答需要状态码显示回复内容,状态码一般需要知道200,404作用,需要知道整个流程,

要知道scandir函数的作用读取目录下的文件

有些中文需要处理,

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1344766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【力扣题解】P654-最大二叉树-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P654-最大二叉树-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x1f30f;总结…

【Linux操作系统】探秘Linux奥秘:操作系统的入门与实战

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;诗赋清音&#xff1a;柳垂轻絮拂人衣&#xff0c;心随风舞梦飞。 山川湖海皆可涉&#xff0c;勇者征途逐星辉。 目录 &#x1fa90;1 初识Linux OS …

【BERT】深入BERT模型2——模型中的重点内容,两个任务

前言 BERT出自论文&#xff1a;《BERT&#xff1a;Pre-training of Deep Bidirectional Transformers for Language Understanding》 2019年 近年来&#xff0c;在自然语言处理领域&#xff0c;BERT模型受到了极为广泛的关注&#xff0c;很多模型中都用到了BERT-base或者是BE…

Spring AOP<一>简介与基础使用

spring AOP 基础定义 含义使用切面组织多个Advice,Advice放在切面中定义。也就是说是定义通知的自定义类。自定义的AOP类Aspect连接点方法调用&#xff0c;异常抛出可以增强的点JoinPoint &#xff1a;也就是**被增强的方法的总称&#xff0c;可以获取具体方法的信息&#xff…

结构体:枚举

#include<iostream> using namespace std; int main() {enum weekday { mon, tus, wed, thu, fri, sat,sun }; //声明枚举类型 enum weekday day; //定义枚举变量 int a, b, c, d, e, f, g, loop; //定义整型变量 char ch A; //定义字符变量 f thu; //按照题意&a…

华为服务器安装银河麒麟V10操作系统(IBMC安装)

iBMC是华为面向服务器全生命周期的服务器嵌入式管理系统。提供硬件状态监控、部署、节能、安全等系列管理工具&#xff0c;标准化接口构建服务器管理更加完善的生态系统。 服务器BMC IP&#xff1a;192.168.2.100 一、准备工作 1、确保本机和服务器BMC管理口在同一网络 2、银…

如何使用ArcGIS Pro将Excel表转换为SHP文件

有的时候我们得到的数据是一张张的Excel表格&#xff0c;如果想要在ArcGIS Pro中进行分析或者制图则需要先转换为SHP格式&#xff0c;这里为大家介绍一下转换方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的POI数据&#xff0c;除了P…

荔枝派nano(f1c100s)基于I2C子系统的BME280驱动

硬件环境&#xff1a; 1、荔枝派nano&#xff08;f1c100s&#xff09; 2、使用f1c100s的i2c0&#xff0c;PE11和PE12引脚 软件环境&#xff1a; 1、Linux 4.15 2、BME280使用介绍 文章目录 一、I2C子系统1、应用层访问i2c设备2、驱动层访问i2c设备2.1、i2c总线设备驱动模型2.2、…

MySQL MVCC精讲

版本链 我们前面说过&#xff0c;对于使用InnoDB存储引擎的表来说&#xff0c;它的聚簇索引记录中都包含两个必要的隐藏列&#xff08;row_id并不是必要的&#xff0c;我们创建的表中有主键或者非NULL的UNIQUE键时都不会包含row_id列&#xff09;&#xff1a; trx_id&#xff…

《纳瓦尔宝典》围观纳瓦尔的财富+幸福指南

缘分碎碎念 之前一直有书友推荐《纳瓦尔宝典》&#xff0c;一直没机会看。到2023年底了&#xff0c;想要给辛苦一年的自己一个新年礼物&#xff08;哈哈哈&#xff09;&#xff0c;就买了一个电纸书用来看书&#xff08;保护眼睛&#xff09;&#xff0c;里面刚好有《纳瓦尔宝…

相对于一般的统计学,计量经济学的特色是什么?谈Stata与计量经济学

Stata作为一种数据分析软件&#xff0c;高度适用于依托计量经济学的研究领域&#xff0c;如宏观经济学、财政学等&#xff0c;当然在医学等学科应用也较为广泛&#xff0c;在处理面板数据方面也深具特色。计量经济学是指运用概率统计方法对经济变量之间的因果关系进行定量分析的…

【实用工具】Gradio快速部署深度学习应用1:图像分类

前言 在AI快速发展的今天&#xff0c;我们作为算法开发人员&#xff0c;也应该有一些趁手的工具帮助我们快速开发并验证自己的想法&#xff0c;Gradio可以实现快速搭建和共享的功能&#xff0c;能够展示出一个前端界面&#xff0c;把我们的算法包裹起来&#xff0c;快速验证算…

python+django超市进销存仓库管理系统s5264

本次设计任务是要设计一个超市进销存系统&#xff0c;通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括&#xff1a;首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、由管理员和员工&#…

程序的编译、链接

目录 前言&#xff1a; 前置知识回顾 宏 宏定义常量 宏定义语句 宏定义函数 条件编译 应用场景 编译过程概览 预编译阶段 编译阶段 汇编阶段 链接阶段 前言&#xff1a; 在ANSI C的任何一种实现中&#xff0c;存在两种不同的环境&#xff0c;第1种是翻译环境&#x…

2023年03月09日_谷歌视觉语言模型PaLM-E的介绍

自从最近微软凭借OpenAI 和ChatGPT火了一把之后呢 老对手Google就总想着扳回一局 之前发布了硬刚ChatGPT的Bard 但是没想到翻车了 弄巧成拙 所以呢Google这一周又发了个大招 发布了史上最大的视觉语言模型PaLM-E 这个模型有多夸张呢 参数量高达5,620亿 是ChatGTP-3的三…

【Matlab】CNN卷积神经网络时序预测算法

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88681558 一&#xff0c;概述 CNN&#xff08;Convolutional Neural Network&#xff0c;卷积神经网络&#xff09;是一种前馈神经网络&#xff0c;主要用于处理具有类似网格结构的数据&#xff0c;例如图像…

HTML---JavaScript基础

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 本章目标 掌握JavaScript的组成掌握JavaScript的基本语法会定义和使用函数会使用工具进行代码调试 一.JavaScript基础 概述 JavaScript是一种基于对象和事件驱动的脚本语言&#xff0c;用于在…

DotNet 命令行开发

DotNet 命令行开发 下载安装下载 SDK安装 SDK绿色版下载绿化脚本 常用命令创建 dotnet new运行 dotnet run发布应用 dotnet publish更多命令 VSCode 调试所需插件调试 CS 配置项目.csproj排除依赖关系 launch.jsontasks.json 参考资料 下载安装 下载 SDK 我们就下最新的好&am…

linux实用技巧:ubuntu18.04安装samba服务器实现局域网文件共享

Ubuntu安装配置Samba服务与Win10共享文件 Chapter1 Ubuntu18.04安装配置Samba服务与Win10共享文件一、什么是Samba二、安装Samba1、查看是否有安装samba2、安装samba 三、配置Samba服务1、创建共享目录&#xff08;以samba_workspaces为例&#xff09;2、为samba设置登录用户3、…

集群部署篇--Redis 主从模式

文章目录 前言Redis 主从部署&#xff1a;1.1 主从架构 介绍&#xff1a;1.2 主从架构 实现&#xff1a;1.2.1 redis 安装&#xff1a; 1.3 主从架构优缺点&#xff1a;1.4 故障转移&#xff1a; 总结 前言 显然在线上环境中 Redis 服务不能以单机的方式运行&#xff0c;必须有…