c++ - 使用来自另一个线程的 boost asio 服务器会话
问题描述
我写了一个非常像这样的线程服务器:https ://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/example/echo/async_tcp_echo_server.cpp
还有一个客户:https ://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/timeouts/blocking_tcp_client.cpp
当客户端直接与服务器会话对话时,它们似乎可以很好地协同工作。但现在我想创建另一个线程,使用服务器 ioservice 发送小消息。这怎么可能?我已经读过 shared_ptr 将是一种选择,但还没有让它工作......
在我定义的会话类中:
typedef boost::shared_ptr<session> session1;
static session1 create(boost::asio::io_service& io_service)
{
return session1(new session(io_service));
}
然后我将全局 session_ptr 定义为
session::session1 new_session1 = nullptr;
然后在接受者中我开始会话:
new_session1 = session::create(tcp_io_serviceServer);
acceptor_.listen();
acceptor_.async_accept(new_session1->socket(), boost::bind(&server::handle_accept, this, boost::asio::placeholders::error));
在handle_accept中:
new_session1->start();
现在我想要实现的是,当服务器会话的 async_read 收到来自客户端的消息以启动新线程时:
if (dataReceived[0] == _dataStartCameraThread)
{
pthread = boost::thread(boost::bind(StartProcess, server));
}
然后在那个线程中我想向客户端发送消息 new_session1->write1(error)
:
void write1(const boost::system::error_code& error)
{
boost::asio::async_write(tcpsocket, boost::asio::buffer(sbuf, 1), boost::bind(&session::handle_dummy, this, boost::asio::placeholders::error));
}
但如果没有 shared_ptr 方法,我无法完成这项工作。它声称文件句柄无效。
并且使用 shared_ptr 方法我似乎无法从服务器端写任何东西,我只能阅读:
写入失败。提供的文件句柄无效
我检查了套接字是否已关闭,即使它刚刚收到消息。
有什么建议我应该去这里吗?
谢谢!
解决方案
推荐阅读
- python - 使用 Numba 和 Cuda 规范化 3 个向量的数组
- python - 如何在字典列表中找到特定键的唯一值?
- ruby-on-rails - 如何将数据库列设置为 Rails 夹具中的空字符串?
- python - 具有相应真实掩码的操纵图像
- html - Navbar Dropdown 扩展 Nav 而不是悬停在
- python - 如何更改按钮内文本的大小?
- excel - 陷入无限循环
- python - Tensorflow 2子类模型回溯错误
- swift - 尝试从 Firebase 字段值中设置几个变量...异步函数问题
- python - 查找关于 Python 包的 Kwargs 和其他信息