面试题答案
一键面试libevent库的事件驱动模型
- 核心概念:libevent是一个基于事件驱动的开源库,用于简化网络编程和事件处理。它提供了一种机制,允许应用程序注册对特定事件(如文件描述符可读、可写,定时事件等)的回调函数。
- 事件循环:应用程序通过创建一个事件循环(event loop)来管理所有注册的事件。事件循环会不断检查是否有已注册的事件发生。
- 事件注册:使用libevent,开发者可以创建事件结构体(如
struct event
),并通过相应函数(如event_new
)将事件与文件描述符、事件类型(如EV_READ
、EV_WRITE
)以及回调函数关联起来,然后使用event_add
函数将事件添加到事件循环中。 - 回调执行:当事件发生时,事件循环会调用预先注册的回调函数,在回调函数中开发者可以处理相应的事件逻辑,比如读取或写入数据。
WebSocket协议建立连接过程中的关键步骤
- HTTP握手请求:客户端首先发起一个HTTP请求,该请求包含特殊的头部字段来表明这是一个WebSocket连接请求。例如,
Upgrade: websocket
表示请求升级协议到WebSocket,Connection: Upgrade
表明连接要升级,同时还会包含Sec - WebSocket - Key
字段,它是一个Base64编码的随机字符串。 - 服务器响应:服务器接收到请求后,验证请求的合法性。如果合法,服务器会返回一个HTTP响应,状态码为101(切换协议)。响应头中包含
Upgrade: websocket
、Connection: Upgrade
,以及Sec - WebSocket - Accept
字段。Sec - WebSocket - Accept
字段的值是通过将客户端发送的Sec - WebSocket - Key
与一个固定字符串(258EAFA5 - E914 - 47DA - 95CA - C5AB0DC85B11
)拼接,然后进行SHA - 1哈希计算,最后Base64编码得到的。 - 连接建立:客户端收到服务器的响应后,验证
Sec - WebSocket - Accept
字段的正确性。如果验证通过,WebSocket连接就正式建立,客户端和服务器可以开始进行双向通信,通信不再基于HTTP协议,而是WebSocket协议自定义的帧格式。