首页 > 解决方案 > 使用来自另一个线程的 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 方法我似乎无法从服务器端写任何东西,我只能阅读:

写入失败。提供的文件句柄无效

我检查了套接字是否已关闭,即使它刚刚收到消息。

有什么建议我应该去这里吗?

谢谢!

标签: c++multithreadingserverboost-asioshared-ptr

解决方案


推荐阅读