【问题标题】:boost asio read buffer提升 asio 读取缓冲区
【发布时间】:2012-07-12 10:11:15
【问题描述】:

我的问题是当您不知道消息大小时,读取 boost tcp 套接字的最佳方法是什么?这是一个样本。我只是简单地设置了 10 的大小。 代码在不同的标题中,但我觉得不需要全部包含它

////////////hpp

typedef boost::asio::ip::tcp::resolver TResolver;
typedef boost::asio::ip::tcp::resolver::query TResolverQuery;
typedef boost::asio::ip::tcp::endpoint Tendpoint;
typedef boost::asio::ip::tcp::socket Tsocket;
typedef boost::asio::ip::tcp::acceptor Tacceptor;
#define Tsize 10

///////////cpp

while(true)
{
    cout<<"recieve"<<endl;
    boost::shared_ptr< Tacceptor > acceptor(new boost::asio::ip::tcp::acceptor(*m_io_service));
    boost::system::error_code ec;
    TResolverQuery query(this->getHost(), boost::lexical_cast< std::string >( this->getPort() ));
    TResolver resolver( *m_io_service );
    Tendpoint endpoint = *resolver.resolve( query );
    acceptor->open( endpoint.protocol() );
    acceptor->set_option( boost::asio::ip::tcp::acceptor::reuse_address( true ) );
    acceptor->bind( endpoint );
    acceptor->listen();
    boost::shared_ptr< Tsocket > socknew(new Tsocket( *m_io_service ));
    acceptor->accept( *socknew,endpoint);
    boost::array<char, Tsize> buf;
    boost::asio::read(*socknew,boost::asio::buffer(buf), ec);
    cout.write(buf.data(),Tsize);cout << std::endl;
    socknew->shutdown( boost::asio::ip::tcp::socket::shutdown_both, ec );
    cout<<"threadId "<< boost::this_thread::get_id()<<endl;        
}

【问题讨论】:

    标签: c++ sockets boost boost-asio


    【解决方案1】:

    两种最常见的方法是使用包含消息长度或具有消息结束标记的协议。

    【讨论】:

    • 我想如果我关闭发件人但只有一个大缓冲区那么它可能会工作但我会看看 read_untill
    【解决方案2】:

    我找到了一个解决我的问题的方法,即我可以使用一段时间而不是 eof 来读取套接字并在一个有效的向量上 push_back。我可以在这里创建一个 wiki 作为参考点。

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      相关资源
      最近更新 更多