遇到以下代码(来自user368831),这正是我要找的。我已经修改了一点,使它成为一个线程TCP会话,监听和读取连接和数据,而主循环可以执行其他任务。
class CSession
{
public:
CSession(boost::asio::io_service& io_service) : m_Socket(io_service)
{}
tcp::socket& socket() return m_Socket;
void start()
{
boost::asio::async_read_until(m_Socket, m_Buffer, " ",
boost::bind(&CSession::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void handle_read(const boost::system::error_code& error,
size_t bytes_transferred)
{
if (!error)
{
ostringstream ss;
ss << &m_Buffer;
m_RecvMsg = ss.str();
std::cout << "handle_read():" << m_RecvMsg << std::endl;
}
else
delete this;
}
private:
boost::asio::streambuf m_Buffer;
tcp::socket m_Socket;
string m_RecvMsg;
};
class CTcpServer
{
public:
CTcpServer(short port)
: m_Acceptor(m_IOService, tcp::endpoint(tcp::v4(), port)),
m_Thread(boost::bind(&boost::asio::io_service::run, &m_IOService))
{
CSession* new_session = new CSession(m_IOService);
m_Acceptor.async_accept(new_session->socket(),
boost::bind(&CTcpServer::handle_accept, this, new_session,
boost::asio::placeholders::error));
};
void handle_accept(CSession* new_session, const boost::system::error_code& error)
{
if (!error)
{
new_session->start();
new_session = new CSession(m_IOService);
m_Acceptor.async_accept(new_session->socket(),
boost::bind(&CTcpServer::handle_accept, this, new_session,
boost::asio::placeholders::error));
}
else
delete new_session;
}
private:
boost::asio::io_service m_IOService;
tcp::acceptor m_Acceptor;
boost::thread m_Thread;
};
void main()
{
:
CTcpServer *server = new CTcpServer(6002); // tcp port 6002
/* How to get the incoming data sent from the client here?? */
// string message;
// while(1)
// {
// if ( server->incomingData(message) )
// {
// std::cout << "Data recv: " << message.data() << std::endl;
// }
// :
// : // other tasks
// :
// }
}
但是,如何在主循环中对incomingData()进行编码,以便它监视来自客户端的数据并在调用handle_read()时返回true?
在这种情况下可以使用Boost :: signals库吗?
答案 0 :(得分:1)
这段代码坦率地说是可怕的。由于你使用原始指针的方式,有很多内存泄漏。 Asio最适合shared_ptr
,它需要保证对象的生命周期。我建议你把这个代码丢掉,然后从asio的简单开始看一下这个例子。
至于你想要编码的方法 - 这不是它的工作方式,你应该把这个逻辑放在handle_read
中。根据您的协议获得完整消息时,将调用handle_read
,您应该在此方法中放置您想要发生的逻辑 - 而不是在主while循环中。在主线程中,您只需拨打io_service::run()
。