c# - 如何关闭 C++ REST Sdk websocket?
问题描述
我在客户端使用 cpprestsdk,在服务器端使用 .net core 2.1。除了结束部分,一切都有效。
// C++
web::websockets::client::websocket_callback_client _client;
//connecting and working with websocket...
_client.close().wait();
// C#
while (!Socket.CloseStatus.HasValue)
{
//sending/reciving data
}
await Socket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Connection closed", CancellationToken.None);
问题是 _client.close().wait(); 永远不会退出。服务器获取关闭请求并成功调用 CloseOutputAsync。而且我不知道为什么它永远不会退出_client.close().wait();。看起来 C++ 和 .net 核心实现之间的握手存在一些问题,并且没有设法解决。有什么方法可以强制 _client.close().wait(); 关闭连接并且不等待来自服务器的握手部分?还是关闭 Web 套接字的服务器代码有问题?
解决方案
这是我自己的错误。我已经设置了使用 lock_guard 的 _client.set_close_handler(...)。这会导致死锁,因为该互斥锁在 close() 调用期间被锁定。
推荐阅读
- delphi - 如何从 DataSnap 服务器返回 DataSet?
- java - 如何从方法变量中清除以前存储的值
- excel - 用excel计算收入
- javascript - 如何将 HTML 表单输入转换为 Javascript 变量?
- java - 程序中读取 JMS 消息的异常
- rust - 为什么调用 tokio::spawn 会导致恐慌“SpawnError { is_shutdown: true }”?
- javascript - 伪造 Autodesk 查看器 api,onDocumentLoadFailure() - errorCode:4
- delphi - Delphi FireDAC 查询执行跟踪不适用于组件创建的连接对象
- twilio - Twilio 可编程聊天抛出无法连接到 twilsock
- reactjs - 当我使用胖箭头作为渲染方法时,为什么 reactjs/mobx 代码不重新渲染?