面试题答案
一键面试- 基本流程:
- 初始化:首先初始化libevent库环境,设置相关配置,为后续操作做准备。
- 创建监听套接字:使用系统调用(如
socket
函数)创建一个监听套接字,并绑定到指定的地址和端口,通过bind
函数实现,然后使用listen
函数将该套接字设置为监听状态,等待客户端连接请求。 - 创建事件基:使用
event_base_new
函数创建一个事件基,这个事件基用于管理所有的事件。 - 创建监听事件:使用
event_new
函数创建一个监听事件,将监听套接字与一个回调函数相关联。当有新连接请求到达时,这个回调函数会被触发。 - 添加监听事件到事件基:使用
event_add
函数将创建的监听事件添加到事件基中,这样libevent库就开始监控这个事件。 - 事件循环:调用
event_base_dispatch
函数启动事件循环。在这个循环中,libevent库会检测是否有新连接请求(即监听事件是否触发)。 - 处理新连接请求:当新连接请求到达,触发监听事件,关联的回调函数被调用。在回调函数中,使用
accept
函数接受新连接,创建与客户端通信的套接字连接。
- 关键函数及作用:
event_base_new
:创建一个事件基,用于管理所有的事件。事件基是libevent库的核心数据结构,它负责调度和处理所有注册到它上面的事件。event_new
:创建一个新的事件。通过这个函数,可以指定事件关联的文件描述符(如监听套接字)、事件类型(如可读事件,对于监听套接字就是有新连接请求到达)以及事件触发时要调用的回调函数。event_add
:将创建的事件添加到事件基中,使事件基开始监控该事件。只有添加到事件基中的事件,libevent库才会去检测其是否触发。event_base_dispatch
:启动事件循环。这个函数会阻塞当前线程,直到有事件触发,然后调用相应事件的回调函数进行处理。在实时通信系统中,它持续运行,不断检测是否有新连接请求等事件。socket
:创建一个套接字,指定套接字类型(如TCP套接字的SOCK_STREAM
)和协议(如IPPROTO_TCP
)。这是网络编程中创建套接字的基本函数,在libevent处理网络连接建立中是创建监听套接字的基础。bind
:将套接字绑定到指定的地址和端口。在监听套接字创建后,需要通过bind
函数将其与特定的网络地址和端口关联起来,以便接收客户端发送到该地址和端口的连接请求。listen
:将套接字设置为监听状态,使其能够接受客户端的连接请求。调用listen
函数后,该套接字就开始监听指定端口上的连接请求。accept
:在新连接请求到达,监听事件触发回调函数后,使用accept
函数接受新连接。它从监听套接字的等待连接队列中取出一个连接请求,创建一个新的套接字用于与客户端进行通信。