首页 > 解决方案 > 当服务器发送关闭信号时使用 libcurl 关闭 websocket 连接

问题描述

我不是高级用户,所以请应付我。

我正在尝试使用 libcurl 实现 WebSocket 客户端,并且在连接的最后一步 - 终止之前我很好。

一般逻辑如下:

  1. 客户端连接并发送升级请求。
  2. Websocket 服务器接受/升级并开始发送乱码。
  3. 客户将所有乱码大小加起来。
  4. 服务器在 10 秒后发送关闭信号。

到目前为止,一切都很好。我没有处理传入消息的有效负载,我也不想这样做。我的资源非常有限,我不想为了检查每个有效负载并搜索关闭信号而遭受任何性能损失。

我正在使用 libcurl 的easy接口并使用curl_easy_perform(). 有什么方法可以检测到关闭信号,或者在 10 秒后关闭 websocket 连接?

标签: cwebsocketlibcurl

解决方案


关闭信号是框架层 WebSocket 协议的一部分(参见 RFC 6455 第1.4、55.5.1)。

AFAIK,libcurl 本身并不支持 WebSockets,只支持 HTTP(WebSocket 用于其打开握手,因此您可以使用 libcurl 伪造它)。因此,如果 libcurl 不为您处理 WebSocket 帧,您将不得不自己处理它们,即使您忽略它们的有效负载。

否则,只需为自己设置一个 10 秒的计时器并直接关闭底层 TCP 连接,您可以使用curl_easy_getinfo(CURLINFO_ACTIVESOCKET).

但是,如果服务器正在向您发送关闭信号,您应该按照第 5.5.1 节发回一个,这意味着正确解析帧:

如果端点接收到关闭帧并且之前没有发送关闭帧,则端点必须发送关闭帧作为响应。(当发送一个关闭帧作为响应时,端点通常会回显它收到的状态代码。)它应该尽快这样做。一个端点可以延迟发送一个关闭帧,直到它的当前消息被发送(例如,如果一个分片消息的大部分已经发送,一个端点可以在发送一个关闭帧之前发送剩余的分片)。但是,不能保证已经发送 Close 帧的端点会继续处理数据。

在发送和接收关闭消息后,端点认为 WebSocket 连接已关闭,并且必须关闭底层 TCP 连接。服务器必须立即关闭底层 TCP 连接;客户端应该等待服务器关闭连接,但可以在发送和接收关闭消息后的任何时间关闭连接,例如,如果它在合理的时间段内没有收到来自服务器的 TCP 关闭。

如果客户端和服务器同时发送 Close 消息,则两个端点都将发送和接收 Close 消息,并应认为 WebSocket 连接已关闭并关闭底层 TCP 连接。


推荐阅读