c - 当服务器发送关闭信号时使用 libcurl 关闭 websocket 连接
问题描述
我不是高级用户,所以请应付我。
我正在尝试使用 libcurl 实现 WebSocket 客户端,并且在连接的最后一步 - 终止之前我很好。
一般逻辑如下:
- 客户端连接并发送升级请求。
- Websocket 服务器接受/升级并开始发送乱码。
- 客户将所有乱码大小加起来。
- 服务器在 10 秒后发送关闭信号。
到目前为止,一切都很好。我没有处理传入消息的有效负载,我也不想这样做。我的资源非常有限,我不想为了检查每个有效负载并搜索关闭信号而遭受任何性能损失。
我正在使用 libcurl 的easy
接口并使用curl_easy_perform()
. 有什么方法可以检测到关闭信号,或者在 10 秒后关闭 websocket 连接?
解决方案
关闭信号是框架层 WebSocket 协议的一部分(参见 RFC 6455 第1.4、5和5.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 连接。
推荐阅读
- typescript - 如何让 Typescript 获取声明文件?
- node.js - 在 Azure Devops 部署组上运行 pm2
- python - ModuleNotFoundError:没有名为“xxxdjango”的模块
- c++ - DenseBase、auto 和二元运算表示数组具有不同的形状
- php - 在 Amazon Linux AMI php.ini 中对 upload_max_filesize 的更改不会生效
- javascript - 在 Redux 中监听 dispatch action
- android - 由于 flatMap 不完整,RxJava 在 flatMap 失败后使用 toList
- javascript - AJAX 和 PHP 响应给出“SyntaxError:JSON 输入意外结束”
- sas - 在 Stata 中进行加权热卡插补的简单方法?
- apache-spark - 从 spark 数据框中只保留一条记录。不需要明确的记录