【发布时间】:2021-05-25 03:31:15
【问题描述】:
class Session {
public:
Session()
{
service_ = boost::make_shared<boost::asio::io_service>();
ep_ = boost::make_shared<boost::asio::ip::tcp::endpoint>(ip::address::from_string("127.0.0.1"), 8001);
acc_ = boost::make_shared<boost::asio::ip::tcp::acceptor>(*service_, *ep_);
}
~Session() {}
void handle_accept(socket_ptr sock_ptr, const boost::system::error_code& err)
{
if (err)
return;
async_read(*sock_ptr, buffer(read_buffer_, 512),
boost::bind(&Session::handle_msg, this, read_buffer_, sock_ptr, _1));
memset(read_buffer_, 0, 512);
}
void start_accept()
{
boost::system::error_code ec;
acc_->open(ep_->protocol(), ec);
acc_->set_option(boost::asio::ip::tcp::acceptor::reuse_address(true), ec);
acc_->bind(*ep_, ec);
acc_->listen(boost::asio::socket_base::max_connections, ec);
sock_ptr_ = boost::make_shared<ip::tcp::socket>(boost::ref(*service_));
acc_->async_accept(*sock_ptr_, boost::bind(&Session::handle_accept, this, sock_ptr_, _1));
boost::thread IOwork(boost::bind(&Session::io_work, this));
}
void handle_msg(char* msg, socket_ptr sock_ptr, const boost::system::error_code& err)
{
if (err) {
std::cout << msg << " -----\n\n";
std::cout << err.message() << "\n";
return;
}
else {
std::cout << msg << " ++++++++++++++\n\n";
}
boost::system::error_code ec;
handle_accept(sock_ptr, ec);
}
void io_work()
{
boost::system::error_code err;
service_->run(err);
}
private:
char read_buffer_[512];
boost::shared_ptr<boost::asio::io_service> service_ = { nullptr };
boost::shared_ptr<boost::asio::ip::tcp::endpoint> ep_ = { nullptr };
boost::shared_ptr<boost::asio::ip::tcp::acceptor> acc_ = { nullptr };
socket_ptr sock_ptr_ = { nullptr };
};
Session session_;
int main()
{
boost::thread tcp_ser1(boost::bind(&Session::start_accept, &session_));
while (1);
}
我用io_service写了一个简单的服务器,但是收到数据后,报End of file的错误。这个问题应该怎么解决呢?采用异步接收和异步读取的方式。每次接收到客户端的数据都会调用函数async_read,handle_msg负责处理客户端接收到的消息。
【问题讨论】:
标签: c++ boost boost-asio