libevent学习__学习历程总结

本文详细介绍了libevent库的功能及其应用场景,并提供了详细的环境搭建步骤。此外还推荐了一些学习资源,包括源码分析专栏、手册及在线书籍等。同时文章还提到了几个与Unix系统网络安全开发相关的库。

环境搭建

  1. 下载: http://sourceforge.net/projects/levent/?source=directory

  2. 安装:

    1. CFLAGS=-DUSE_DEBUG ./configure --disable-shared --prefix

    2. make

    3. make install

学习资料

  1. libevent学习资料

  2. autotools工具学习

  3. 文档工具的学习

心得记

学习东西总容易跑题,本人因为在看[Linux高性能服务器编程]这本书才决定看libevent源代码的,看libevent过程中接触了许多乱起八糟的东西.

autotools根据手册过了一遍,因为在工作过程都是手写Makefile或者esplise生成,所以就不求甚解.DoxyDoc工具知道有这么回事.对于AsciiDoc标记语言,本人很感兴趣,在学习过程中用作笔记还是比较不错的选择.

补充后续要认识的一些库与工具

在Unix系统平台上的网络安全工具开发中,目前最为流行的C API library有libnet、libpcap、libnids和libicmp等。它们分别从不同层次和角度提供了不同的功能函数。使网络开发人员能够忽略网络底层细节的实现,从而专注于程序本身具体功能的设计与开发。其中,
  • libnet提供的接口函数主要实现和封装了数据包的构造和发送过程。http://blog.youkuaiyun.com/firstime_tzjz/article/details/8575304

  • libpcap提供的接口函数主要实现和封装了与数据包截获有关的过程。http://blog.youkuaiyun.com/htttw/article/details/7521053

  • libnids提供的接口函数主要实现了开发网络入侵监测系统所必须的一些结构框架。

  • libicmp等相对较为简单,它封装的是ICMP数据包的主要处理过程(构造、发送、接收等)。

The Tcpreplay suite includes the following tools:

  • tcpprep - multi-pass pcap file pre-processor which determines packets as client or server and creates cache files used by tcpreplay and tcprewrite
  • tcprewrite - pcap file editor which rewrites TCP/IP and Layer 2 packet headers
  • tcpreplay - replays pcap files at arbitrary speeds onto the network
  • tcpliveplay - Replays network traffic stored in a pcap file on live networks using new TCP connections
  • tcpreplay-edit - replays & edits pcap files at arbitrary speeds onto the network
  • tcpbridge - bridge two network segments with the power of tcprewrite
  • tcpcapinfo - raw pcap file decoder and debugger

<think>好的,我现在需要帮助用户了解Libevent中的event_assign函数的使用方法、示例代码和相关文档。首先,我得回忆一下自己对Libevent的了解,尤其是event_assign这个函数。 根据用户提供的引用内容,引用[3]和[4]提到了event_assign函数。特别是引用[4]指出,event_new函数内部调用了event_assign,先分配内存,然后用event_assign进行初始化。而引用[3]说明event_assign的作用是初始化event结构体,绑定event_base、回调函数、参数、文件描述符和标志位,同时进行了一些检查,比如信号事件不能监听读写事件。 首先,我需要明确event_assign和event_new的区别。event_new会分配内存并初始化,而event_assign则是在已分配的内存上初始化event结构体。因此,当用户需要复用event对象或者自己管理内存时,应该使用event_assign。 接下来,用户需要的是使用说明、示例代码和文档。我需要组织这些信息。使用说明应包括函数原型、参数说明、返回值以及注意事项。比如,函数原型应该是这样的: int event_assign(struct event *ev, struct event_base *base, evutil_socket_t fd, short events, void (*callback)(evutil_socket_t, short, void *), void *arg); 参数方面,ev是已分配的event指针,base是事件所属的event_base,fd是文件描述符,events是事件类型(如EV_READ),callback是回调函数,arg是用户自定义参数。返回值方面,成功返回0,失败返回-1。 注意事项部分,需要提到信号事件不能和读写事件同时使用,以及不能对已处于pending状态的event调用event_assign。这些在引用[3]和[4]中有提到。 然后是示例代码。应该展示如何正确分配event结构体内存,然后调用event_assign进行初始化,最后添加事件到事件循环。比如,创建一个监听读事件的event,使用event_assign初始化,然后event_add使其pending。 可能还需要指出,在Libevent 2.0.3之后,推荐使用event_assign结合栈分配的event结构体,或者使用event_new来简化操作。但用户需要自己管理内存的情况下,如对象池,event_assign会更合适。 关于文档,用户可能需要参考Libevent的官方文档或头文件中的说明,比如event.h中的函数定义和注释。另外,需要提醒用户注意内存管理,确保event结构体在调用event_assign之前已正确分配,并且在不需要时正确释放,避免内存泄漏。 最后,生成相关问题。可能需要围绕event_assign与event_new的区别、使用场景、内存管理、错误处理等方面提出问题,帮助用户进一步理解。</think>### Libevent event_assign 函数使用说明 #### 1. 函数功能 `event_assign` 用于初始化一个已分配的 `struct event` 对象,将其绑定到事件基、文件描述符、事件类型及回调函数。与 `event_new` 不同,**它不负责内存分配,仅对现有内存进行初始化**。适用于需要复用 `event` 对象或自定义内存管理的场景[^3][^4]。 --- #### 2. 函数原型与参数 ```c int event_assign( struct event *ev, // 已分配的 event 对象指针 struct event_base *base, // 关联的 event_base evutil_socket_t fd, // 文件描述符(如套接字) short events, // 监听的事件类型(如 EV_READ) void (*callback)(evutil_socket_t, short, void *), // 回调函数 void *arg // 传递给回调函数的参数 ); ``` - **返回值**: 成功返回 `0`,失败返回 `-1`(如事件类型与信号冲突)[^3]。 --- #### 3. 示例代码 ```c #include <event2/event.h> void read_cb(evutil_socket_t fd, short events, void *arg) { // 处理读事件 } int main() { struct event_base *base = event_base_new(); struct event ev; // 栈分配的 event 对象 // 初始化 event,监听标准输入的读事件 if (event_assign(&ev, base, STDIN_FILENO, EV_READ|EV_PERSIST, read_cb, NULL) == -1) { // 错误处理 return 1; } // 将事件添加到事件循环 event_add(&ev, NULL); event_base_dispatch(base); event_base_free(base); return 0; } ``` --- #### 4. 关键注意事项 1. **信号事件限制** 若 `event` 用于监听信号(`EV_SIGNAL`),则不可同时设置 `EV_READ` 或 `EV_WRITE`,否则初始化失败[^3]。 2. **内存管理责任** - 使用 `event_assign` 前必须确保 `ev` 指向有效内存(如栈变量或手动分配的堆内存)。 - 销毁时需调用 `event_del` 移除事件,堆内存需手动释放[^1]。 3. **与 event_new 的对比** - `event_new` = 内存分配 + 初始化(返回堆内存指针)。 - `event_assign` = 仅初始化(需自行管理内存生命周期)。 --- #### 5. 文档参考 - **官方定义**: 见 Libevent 头文件 `event.h`,函数注释明确参数约束。 - **错误处理**: 检查返回值,若失败可通过 `errno` 或日志排查原因(如事件类型冲突)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

callinglove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值