gpt4 book ai didi

c++ - boost::asio::async_read 无限循环接收到的数据为零字节

转载 作者:行者123 更新时间:2023-11-28 05:03:32 29 4
gpt4 key购买 nike

我正在尝试编写基于 IO_Service 的异步 TCP 客户端,其中 Async_write 工作正常但 async_read 在无限循环中运行。在我尝试纠正这个问题的过程中,我发现在所有其他情况下,async_read 只是停止接收数据,在我停止服务器之前它什么也接收不到。以下是我在发布查询之前尝试的代码和链接。

我试过的建议是exactly as mine , 2 , 3 and但在所有情况下,我的 async_read 处理程序都没有读取任何内容。在一种且只有一种情况下,当我将缓冲区设置为 boost::asio::mutable_buffer bytes; 时它开始无限循环在其他情况下,我已经尝试过boost::array<char, 512> bytes; , boost::asio::streambuf bytes;char bytes[512];没有引发 async_read 处理程序的地方。

在完成所有这些解决方案之后,我现在很困惑:这会是缓冲区的问题吗?我是否需要在传递给阅读之前对其进行初始化?

请指导。

ScalableSocket::ScalableSocket()
{
//ctor

using namespace boost::asio;
service = boost::make_shared<io_service>();
work = boost::make_shared<io_service::work>(*service );
strand = boost::make_shared<io_service::strand>( *service );
worker_threads = boost::make_shared<boost::thread_group>();



worker_threads->create_thread(boost::bind(&ScalableSocket::WorkerThread,this));


resolver = boost::make_shared<boost::asio::ip::tcp::resolver> (*service);

tcp_socket= boost::make_shared<boost::asio::ip::tcp::socket> (*service);

boost::asio::ip::tcp::resolver::query q(boost::asio::ip::tcp::v4(),"192.168.100.96","9602");

boost::asio::ip::tcp::resolver::iterator it = resolver->resolve(q);

boost::asio::async_connect(*tcp_socket,it,boost::bind(&ScalableSocket::connect_handler,this,boost::asio::placeholders::error));

tcp_socket->set_option(boost::asio::ip::tcp::no_delay(true) );

}

ScalableSocket::~ScalableSocket()
{
//dtor

}

void ScalableSocket::PublishPost()
{
strand->post(boost::bind(&ScalableSocket::OnSend,this));
}


void ScalableSocket::OnSend()
{


boost::array<char, 6> a = { 'a', 'b', 'c', 'd', 'e' };

boost::asio::async_write(*tcp_socket,boost::asio::buffer(a),
boost::bind(&ScalableSocket::write_handler, this, boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));



}

void ScalableSocket::WorkerThread()
{
while( true )
{
try
{
boost::system::error_code ec;
service->run( ec );
if( ec )
{
///LOGE(ec);
}
break;
}
catch( std::exception & ex )
{
///LOGE(ex.what());
}
}
}

void ScalableSocket::connect_handler(const boost::system::error_code &ec)
{
if (!ec)
{

PublishPost();




/* boost::asio::async_read(*tcp_socket,
boost::asio::buffer(bytes),
boost::bind(&ScalableSocket::read_handler, this,
boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));
*/

///https://stackoverflow.com/questions/4527443/problems-using-boostasioasync-read

boost::shared_ptr<boost::array<char, 512>> buf(new boost::array<char, 512>);


boost::asio::async_read(*tcp_socket,boost::asio::buffer(*buf),
boost::bind(&ScalableSocket::read_handler, this,buf,
boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));

}
else
{
cout<<" Some error connecting to Exchange "<< ec.message()<<endl;

}

}


void ScalableSocket::OnTimer(const boost::system::error_code &ec)
{
if(!ec)
{
printf("\n\n Heartbeat event raised sending KeepAlive to exchange \n\n");
PublishPost();
HeartBeatTimer->async_wait(boost::bind(&ScalableSocket::OnTimer,this, boost::asio::placeholders::error));
}
}

void ScalableSocket::recvData()
{
boost::system::error_code error;
boost::array<char, 1024> buf;

//for(;;)
{
size_t len = tcp_socket->read_some(boost::asio::buffer(buf), error);

cout<<"\n Recv data size is "<<len;

}
}

void ScalableSocket::read_handler(boost::shared_ptr<boost::array<char, 512>> buf,const boost::system::error_code &ec,std::size_t bytes_transferred)
{


if (!ec )//&& bytes_transferred > 0)
{

///recvData(); /// If i enable this code during infinite loop it start getting data that means socket has no issue

cout << " Data size recieved "<< bytes_transferred<<endl;




boost::asio::async_read(*tcp_socket,boost::asio::buffer(*buf),
boost::bind(&ScalableSocket::read_handler, this,buf,
boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));
}
else
{
/// Some issue with socket publish error , inform user and reconnect
cout<<" Some error reading data from Exchange "<< ec.message()<<endl;

}
}

void ScalableSocket::write_handler(const boost::system::error_code& error,std::size_t bytes_transferred)
{
if(!error)
{
/// data Sent successfully
cout<< " Data sent size "<< bytes_transferred<<endl;

}
else
{
cout<<" Some error sending data to Exchange "<< error.message()<<endl;
}

}

最佳答案

asnyc_read在给定缓冲区完全填满之前不会“返回”/调用处理程序。

asnyc_read_some 将在读取一些字节后返回。这可能是您正在寻找的功能。

请记住使用 asnyc_read_some 正确处理接收到的数据。如果您发送 512 个字节,它可能需要几次读取才能到达,具体取决于机器。

关于c++ - boost::asio::async_read 无限循环接收到的数据为零字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45358908/

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