Linux网络编程学习心得.5

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函数的作用读取目录下的文件

有些中文需要处理,

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

攻防技术-单包攻击防范:扫描、畸形、特殊(HCIP)

单包攻击类型介绍 一、扫描窥探攻击 1、地址扫描攻击防范 攻击介绍 运用ping程序探测目标地址&#xff0c;确定目标系统是否存活。也可使用TCP/UDP报文对目标系统发起探测&#xff08;如TCP ping&#xff09;。 防御方法 检测进入防火墙的ICMP、TCP和UDP报文&#xff0c;根…

性能优化-如何提高cache命中率

本文主要介绍性能优化领域常见的cache的命中率问题&#xff0c;旨在全面的介绍提高cache命中率的方法&#xff0c;以供大家编写出性能友好的代码&#xff0c;并且可以应对性能优化领域的面试问题。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &am…

PHP序列化总结1--序列化和反序列化的基础知识

序列化和反序列化的作用 1.序列化&#xff1a;将对象转化成数组或者字符串的形式 2.反序列化&#xff1a;将数组或字符串的形式转化为对象 为什么要进行序列化 这种数据形式中间会有很多空格&#xff0c;不同人有不同的书写情况&#xff0c;可能还会出现换行的情况 为此为了…

【C++】STL 容器 - set 集合容器 ⑦ ( 查找元素 - set#find 函数 | 获取元素个数 - set#count 函数 )

文章目录 一、查找元素 - set#find 函数1、函数原型 简介2、代码示例 - set#find 函数 二、获取元素个数 - set#count 函数1、函数原型 简介2、代码示例 - set#find 函数 一、查找元素 - set#find 函数 1、函数原型 简介 在 C 语言的 STL 标准模板库 , std::set 集合容器 是一个…

软件测试/测试开发丨Python 内置库 OS 学习笔记分享

os 概述 os: Operating System os 使用 导入 os 模块 查看 os 模块使用文档 help(os)dir(os) import os# 查看os模块说明文档 help(os)# 查看os模块的属性和方法 print(dir(os))os 操作系统相关 os.name&#xff1a;获取系统名称os.environ&#xff1a;获取系统环境变量信…

西北工业大学计算机组成原理实验报告——verilog后两次

在单周期CPU的基础上开发实现流水线CPU 说明&#xff1a; 1. 该PDF带有大纲功能&#xff0c;点击大纲中的对应标题&#xff0c;可以快速跳转。 2. 目录层级为&#xff1a; 一、一级标题 &#xff08;二&#xff09;二级标题 &#xff08;3&#xff09;三级标题 4.四级标…

Stable Diffusion Webui在Linux服务器第一次运行不能连接huggingface

第一次运行stable-diffusion-webui出现了如下错误 (MaxRetryError("HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /openai/clip-vit-large-patch14/resolve/main/vocab.json (Caused by ConnectTimeoutError(<urllib3.connecti…

亚信安慧AntDB数据库两项目分别入选2023“星河”标杆、优秀案例

近日&#xff0c;由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织的第七届大数据“星河&#xff08;Galaxy&#xff09;”案例评选结果公示&#xff0c;亚信安慧AntDB数据库两项目入选&#xff0c;其中“基于Ant…

C单片机数据类型与格式化

C语言数据类型 关键字位数表示范围stdint关键字ST关键字举例unsigned char80 ~ 255uint8_tu8u8 data 128char8-128 ~ 127int8_ts8s8 temperature 25unsigned short160 ~ 65535uint16_tu16u16 counter 5000short16-32768 ~ 32767int16_ts16s16 position 32767unsigned int3…

基于C#串口通信的智能仪表充电管理系统

基于C#串口通信的智能仪表充电管理系统 谁要源码的话加入群聊收费50元。提供代码&#xff0c;加QQ66987475。 一、 系统描述 该系统管理矿用检测仪器的充电、领取、归还、考勤等基本功能&#xff0c;一套系统拓补图如下&#xff1a; 由上位机、打印机、大屏幕、人脸识别仪…

腾讯云轻量应用服务器是什么?详细介绍

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别便宜&#xff0c;大带宽&#xff0c;但是限制月流量。轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元3年、…

力扣:62. 不同路径(动态规划,附python二维数组的定义)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

mxxWechatBot微信机器人V2版本文档说明

大家伙&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 先看这里 一、前言二、mxxWechatBot流程图三、怎么使用&#xff1f; 一、前言 经过不断地探索与研究&#xff0c;mxxWechatBot正式上线&#xff0c;届时全面开放使用。 mxxWechatBot&am…

goframe v2 模板引擎的用法

这里用的goframe v2框架 提醒&#xff1a;下面的import 引入的控制器和api&#xff0c;根据自己实际项目路径 main函数 import ("context""github.com/gogf/gf/v2/net/ghttp""github.com/gzdzh/dzhgo/modules/dzhCms/controller/web""gith…

C/C++ BM3 链表中的节点每k个一组翻转

文章目录 前言题目思路阐述代码总结 前言 这道题的关键是理解链表指针的位置&#xff1b; 在BM2的区间翻转基础上&#xff0c;多了个指针偏移&#xff0c;博客里面我贴图阐述一下。 题目 思路阐述 这道题的翻转过程参考BM2的题解&#xff0c;这里主要阐述一下指针移动和整体思…

测试C#调用ZXing.Net识别图片中的条形码

微信公众号“dotNET跨平台”的文章《.NET 使用 ZXing.Net 生成二维码&#xff0c;并识别》中介绍了使用ZXing.Net库创建并识别条形码的方式&#xff0c;该库除了能生成二维码、PDF 417、EAN、UPC、Aztec等条形码外&#xff0c;还能从图片中识别条形码内容&#xff0c;本文学习并…

04-获取认证的用户身份信息

存储用户信息的方式 获取用户信息的流程 用户提交账号和密码后,DaoAuthenticationProvider调用UserDetailsService接口实现类的loadUserByUsername()方法,该方法可以接收请求参数username的值,然后根据该值查询用户信息,最后将账号,密码,权限封装到UserDetails对象中并返回给…

linux常见基础指令

入门常见基础指令 ls、stat、 pwd 、cd、tree、 whoami、 touch、 mkdir、 rm 、 man、 cp、mv、cat、tac、echo、>、 >>、 < 、more、 less、 head、 tail、date、 cal、 find、 which、alias、whereis、grep、zip与unzip、 tar、bc、uname、xargs... 热键Tab、…

DrGraph原理示教 - OpenCV 4 功能 - 颜色空间

前言 前段时间&#xff0c;甲方提出明确需求&#xff0c;让把软件国产化。稍微研究了一下&#xff0c;那就转QT开发&#xff0c;顺便把以前的功能代码重写一遍。 至于在Ubuntu下折腾QT、OpenCV安装事宜&#xff0c;网上文章很多&#xff0c;照猫画虎即可。 这个过程&#xff0…

金蝶云星空业务对象扩展

文章目录 金蝶云星空业务对象扩展 金蝶云星空业务对象扩展 当前对象已经存在扩展不允许再次扩展。 一般来说&#xff0c;不允许同级多次扩展。因为同级扩展会出现界面元素冲突的情况。 但是通过不同应用扩展部署到环境的&#xff0c;允许一个开发商只能扩展一次标准产品。 不过…