gpt4 book ai didi

c++ - boost::asio::async_write 没有完成它的任务

转载 作者:行者123 更新时间:2023-11-28 03:57:14 27 4
gpt4 key购买 nike

我试图通过操作 echo 示例来弄清楚异步读取和写入在 boost asio 中是如何工作的。目前,我有一个服务器,当发送一个句子时,它应该只响应第一个词。但是,即使正在调用写入处理程序,boost::asio::async_write 似乎也永远不会完成。有人可以解释一下发生了什么吗?这是代码:

#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

class session
{
public:
session(boost::asio::io_service& io_service)
: socket_(io_service)
{
}

tcp::socket& socket()
{
return socket_;
}

void start()
{
std::cout<<"starting"<<std::endl;
boost::asio::async_read_until(socket_, buffer, ' ',
boost::bind(&session::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)
{

// std::ostringstream ss;
// ss<<&buffer;

char* c = new char[bytes_transferred];

//std::string s;
buffer.sgetn(c,bytes_transferred);
std::cout<<"data: "<< c<<" bytes: "<<bytes_transferred<<std::endl;

if (!error)
{
boost::asio::async_write(socket_,
boost::asio::buffer(c,bytes_transferred),
boost::bind(&session::handle_write, this,
boost::asio::placeholders::error));
}
else
{
delete this;
}
}

void handle_write(const boost::system::error_code& error)
{
std::cout<<"handling write"<<std::endl;
if (!error)
{
}
else
{
delete this;
}
}

private:
tcp::socket socket_;
boost::asio::streambuf buffer;
};

class server
{
public:
server(boost::asio::io_service& io_service, short port)
: io_service_(io_service),
acceptor_(io_service, tcp::endpoint(tcp::v4(), port))
{
session* new_session = new session(io_service_);
acceptor_.async_accept(new_session->socket(),
boost::bind(&server::handle_accept, this, new_session,
boost::asio::placeholders::error));
}

void handle_accept(session* new_session,
const boost::system::error_code& error)
{
if (!error)
{
new_session->start();
new_session = new session(io_service_);
acceptor_.async_accept(new_session->socket(),
boost::bind(&server::handle_accept, this, new_session,
boost::asio::placeholders::error));
}
else
{
delete new_session;
}
}

private:
boost::asio::io_service& io_service_;
tcp::acceptor acceptor_;
};

int main(int argc, char* argv[])
{
try
{
if (argc != 2)
{
std::cerr << "Usage: async_tcp_echo_server <port>\n";
return 1;
}

boost::asio::io_service io_service;

using namespace std; // For atoi.
server s(io_service, atoi(argv[1]));

io_service.run();
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}

return 0;
}

谢谢!

最佳答案

你没有正确使用 boost::asio::streambuf,请阅读 HTTP client example密切。对于您的代码,您应该执行以下操作:

buffer.commit( bytes_transferred );
std::istream is( &buffer );
std::string data;
is >> data;
std::cout << "data: " << data << " bytes: " << bytes_transferred << std::endl;

然后使用单独的 boost::asio::streambuf 进行响应。正如之前的答案所说,您正在泄漏内存。我建议使用 boost::shared_ptr 和 shared_from_this。

关于c++ - boost::asio::async_write 没有完成它的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3062129/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com