长春火车站官网,wordpress 营销模板下载,临沂网站建设哪家好,网页做什么主题好libevent源码学习笔记 libevent安装libevent源码解析#xff08;1#xff09;事件对象#xff08;2#xff09;事件操作#xff08;3#xff09;事件循环#xff08;4#xff09;事件处理 常用指令问题记录问题一#xff1a;长连接的管理问题二#xff1a;连接关闭问… libevent源码学习笔记 libevent安装libevent源码解析1事件对象2事件操作3事件循环4事件处理 常用指令问题记录问题一长连接的管理问题二连接关闭问题问题三客户端与服务器端存在多个TCP连接数据发送是依次的还是并行的 libevent安装
1解压libevent压缩包并进入到文件目录下 ·tar -zxvf libevent-2.1.12-stable.tar.gz ·cd libevent-2.1.12-stable.tar/
2运行./configure用于配置编译选项和环境由于系统中没有OpenSSL库所以使用了–disable-openssl选项来禁用OpenSSL相关功能减少依赖。 ·./configure --disable-openssl
3运行make命令用于编译源代码并生成示例可执行文件或库文件。
4运行sudo make install用于安装编译生成的库文件和头文件到系统的标准位置以便其他程序可以在编译和链接时使用libevent.so库。
libevent源码解析
libevent是一个事件驱动的网络编程库它提供了一种跨平台的方式来处理I/O事件和定时器事件。libevent事件驱动的核心是reactor模式。reactor模式将IO事件、定时器事件抽象成事件对象并使用一个事件循环来监听这些事件对象。当有事件发生时事件循环会调用相应的回调函数来处理这些事件。
1事件对象
·event_base_new() //构造对象
·event_base_free() //销毁对象
·event_new() //构建事件对象、绑定、事件回调
·event_free() //销毁事件对象
·bufferevent_socket_new() //构建bufferevent对象
·bufferevent_free() //销毁bufferevent对象2事件操作
·event_add() //注册事件
·event_del() //注销事件
·bufferevent_enable() //注册事件
·bufferevent_disable() //注销事件3事件循环
·event_base_dispatch() //启动事件循环libevent会进入一个无限循环中不断监听注册的I/O事件和定时器事件。当有事件发生时libevent会调用相应的回调函数来处理这些事件。在事件处理完毕后libevent会继续等待下一个事件的发生。
·event_base_loop() //启动事件循环并一直等待事件的发生
·event_base_loopexit() //通知事件循环在指定时间后退出
·event_base_break() //通知事件循环在指定时间后立即退出4事件处理
libevent使用事件驱动的编程模型来处理事件。在这种模型中事件循环会不断监听注册的I/O事件和定时器事件。当有事件发生时libevent会调用相应的回调函数来处理这些事件。当使用libevent注册一个事件时libevent会将这个事件对象添加到事件循环中。当有事件发生时libevent会调用相应的回调函数来处理这个事件。在回调函数中可以执行相应的操作例如读取数据、发送数据、关闭连接等。 ·libevent通信流程
1. 初始化首先需要创建一个事件处理器event_base并初始化它。在初始化过程中可以设置事件处理器的一些参数比如事件处理模式、超时时间等。
2. 创建事件在事件处理器中需要创建需要监听的事件。通过调用event_new()函数来创建事件并设置事件的回调函数和事件类型。
3. 添加事件创建完事件之后需要将事件添加到事件处理器中通过调用event_add()函数来添加事件。添加事件之后事件处理器就可以监听这些事件了。
4. 运行事件循环在添加完事件之后需要进入事件循环等待事件的到来。通过调用event_base_dispatch()函数来运行事件循环当有事件到来时事件处理器会自动调用相应的回调函数进行处理。
5. 处理事件当有事件到来时事件处理器会自动调用相应的回调函数进行处理。在回调函数中可以进行相应的操作比如读写数据、关闭连接等。
6. 清理资源当程序退出时需要清理资源。通过调用event_base_free()函数来释放事件处理器占用的资源。常用指令
指令描述nc host port;创建TCP连接nc -u host port创建UDP连接nc -l port监听端口nc host port file发送文件nc 127.0.0.1 8080 file.txtnc -l port file接收文件nc -l 8080 file.txtnc -zv host start-port-end-port端口扫描nc -zv 127.0.0.1 1-100netstat -tuln查看监听的TCP端口ss -tuln查看监听的TCP端口sudo iptables -L查看IPV4防火墙规则sudo ip6tables -L查看IPV6防火墙规则
问题记录
问题一长连接的管理
通常情况下客户端和服务器端会维护一个连接池用来管理多个长连接。在连接池中每个连接都可以用一个唯一的标识符例如连接编号、连接句柄、文件描述符等来标记但这个标识符不是由 TCP 协议自动分配的而是由编程语言或操作系统提供的接口来生成。
问题二连接关闭问题
1.任务结束的条件满足其中一方通常是服务器端发送任务结束信号给对方客户端。
2.接收到任务结束信号的一方客户端根据协议判断任务结束也可以在任务结束后发送任务结束确认信号给对方服务器端。
3.双方都知道任务结束后可以分别在合适的时机主动关闭连接。关闭连接的步骤是主动关闭一方发送一个关闭连接的请求等待对方确认。对方接收到关闭请求后确认关闭并回复。然后双方都可以关闭自己的连接。这样可以保证双方都在知情的情况下安全地关闭连接。需要注意的是在某些特殊情况下如果连接的关闭是由客户端或服务器端中的某个程序意外终止或崩溃造成的可能会导致连接未正确关闭。在这种情况下可以使用心跳机制或超时机制来检测连接的状态并在连接空闲一段时间后自动关闭连接以防止连接资源泄漏。
问题三客户端与服务器端存在多个TCP连接数据发送是依次的还是并行的
在客户端与服务器端存在多个TCP连接的情况下数据发送可以是依次的也可以是并行的具体取决于实现的方式和程序设计。 1依次发送如果客户端在处理数据发送时使用一个连接发送完一个数据后再使用下一个连接发送下一个数据这种情况下数据发送是依次进行的。客户端在处理多个连接时每个连接发送数据的过程是按顺序进行的即一个连接发送完后才会处理下一个连接发送。 2并行发送如果客户端在处理数据发送时同时利用多个连接进行数据发送这种情况下数据发送是并行进行的。客户端可以在多个连接上同时发送数据不需要等待一个连接的数据发送完毕再处理下一个连接的数据发送。