1 Websocket++库的事件

C++websocket库Websocket++中使用事件机制管理websocket连接消息,比如在websocket连接打开时触发open消息,在接收到客户端/服务端时,触发message消息,就和在js、java中使用websocket一样。

在Websocket++中有两种事件可以设置,一种是Connection Handlers,另一种是Message Handlers。Connection Handlers在每一个websocket连接过程中最多调用一次,主要是websocket连接初始化、错误还有关闭事件;而Message Handlers则是响应消息传入以及与消息相关的事件,只会在websocket连接处于打开状态时被调用。

1.1 Connection Handlers 连接事件

websocket在连接时会按照顺序触发以下事件,每个事件在每个websocket连接最多被调用一次,事件触发的顺序如下:

  • Socket Init Handler
  • TCP Pre-init Handler
  • TCP Post-init Handler
  • Validate Handler
  • Open Connection Handler
  • Fail Connection Handler
  • Close Connection Handler

1.1.1 Socket Init Handler

套接字初始化事件,该钩子在套接字初始化之后但是在套接字初始化之前触发,事件函数形式为

socket_init(connection_hdl, asio::ip::tcp::socket&)

可允许在发送/接收连接之前设置任意套接字选项。

1.1.2 TCP Pre-init Handler

该钩子在TCP连接建立之后,websocket握手之前触发,事件函数形式为

tcp_pre_init(connection_hdl)

1.1.3 TCP Post-init Handler

该钩子在TLS握手之前触发,以请求要使用的TLS上下文。

必须返回已配置的TLS的context的指针才能继续,可以在context中设置TLS设置、证书等。

事件函数形式为

tls_context_ptr tls_init(connection_hdl)

1.1.4 Validate Handler

在处理请求之后但在发送响应之前,在打开握手期间为服务器触发此钩子。

它为程序提供了检查标头和其他连接详细信息并接受或拒绝连接的机会。验证发生在打开或失败处理程序之前,返回 true 接受连接,false 拒绝。如果没有注册验证处理程序,所有连接都将被接受。

事件函数形式为

bool validate(connection_hdl)

1.1.5 Open Connection Handler

该钩子在websocket连接打开成功时触发,事件函数形式为

open(connection_hdl)

1.1.6 Fail Connection Handler

该钩子在websocket连接失败时触发,事件函数形式为

fail(connection_hdl)

如果连接失败,将不会触发连接关闭的事件。

1.1.7 Close Connection Handler

该钩子在websocket连接关闭时触发,事件函数形式为

close(connection_hdl)

每一个打开的websocket连接都将调用一次关闭。

1.2 Message Handlers 消息事件

Message Handlers包括以下事件

  • Message Handler
  • Ping Handler
  • Pong Handler
  • Pong Timeout Handler
  • Http Handler
  • Interrupt Handler

1.2.1 Message Handler

接收到文本或者二进制消息时触发,事件函数形式为

message(connection_hdl, message_ptr)

其中message_ptr及其API取决于连接的端点类型及其配置。

1.2.2 Ping Handler

接收到ping消息时触发,事件函数形式为

bool ping(connection_hdl, std::string)

其中第二个参数std::string为ping附加的信息。这个事件处理函数的返回值将决定是否用pong相应ping消息,如果没有设置ping事件处理函数,那么websocket++将默认使用ping相同的消息内容的pong进行响应。

1.2.3 Pong Handler

接收到pong消息时触发,事件函数形式为

pong(connection_hdl, std::string)

其中第二个参数std::string为pong附加的信息。

1.2.4 Pong Timeout Handler

如果在配置的时间内没有对ping消息进行响应,则触发该钩子,事件函数形式为

pong_timeout(connection_hdl, std::string)

其中第二个参数std::string为未应答的ping的附加信息。

1.2.5 Http Handler

当收到的不是websocket请求,而是未升级的http请求时触发,事件函数形式为

http(connection_hdl)

websocket++允许响应常规Http请求,但是如果没有注册相应的处理程序,则返回426 Upgrade Required错误。

1.2.6 Interrupt Handler

当websocket连接被手动中断时触发,事件函数形式为

interrupt(connection_hdl)

使用endpoint::interrupt可以中断websocket连接,并且触发interrupt事件。

参考链接