2

私の質問は、メッセージのサイズがわからない場合にブースト 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;        
}
4

2 に答える 2

2

最も一般的な2つの方法は、メッセージの長さを含むか、メッセージの終わりマーカーを持つプロトコルを使用することです。

于 2012-07-12T10:15:21.587 に答える
0

私の問題の解決策を見つけました。これは、 eof ではなく while を使用してソケットを読み取り、機能するベクターで push_back できることです。参照ポイントとして、ここに wiki を作成する場合があります。

于 2012-07-12T18:38:21.487 に答える