【问题标题】:Boost receive data from the tcp socketBoost 从 tcp 套接字接收数据
【发布时间】:2012-12-28 17:51:54
【问题描述】:

我正在尝试从套接字读取特定数量的字节。我的服务器正在发送:

1) byte[0] - 消息的长度 2) byte[1:N] - 实际消息

如何读取第一个字节,然后使用 boost::asio::ip::tcp::socket::read 读取剩余字节?这是代码sn-p:

 // receive data through the socket
    void TCPTestClient::ReceiveData( )
    {
        try
        {
            boost::system::error_code error;

            boost::asio::streambuf receivedStreamBuffer;

            // reserve 512 bytes in output sequence
            boost::asio::streambuf::mutable_buffers_type bufs =receivedStreamBuffer.prepare( 512 );
            boost::asio::read( m_socket,
                                   bufs,
                                   error );

            // transfer the buffer contents to string
            std::istream is( &receivedStreamBuffer );
            is >> m_receivedMessageStr;


            // throw exception if error occurred
            if ( error )
            {
                throw NetworkTestFailedException( error.message() );
            }
        }
        catch(...)
        {

        }
    }

【问题讨论】:

    标签: c++ sockets boost tcp boost-asio


    【解决方案1】:

    您需要为一个字节的标头准备一个缓冲区,然后为消息准备另一个缓冲区。一个简化的例子可能是

    boost::asio::read(                                                                                                                       
            m_socket,                                                                                                                        
            receivedStreamBuffer.prepare(1),                                                                                                 
            error                                                                                                                            
            );                                                                                                                               
    
    if ( error ) {                                                                                                                           
        std::cerr << "Read header failed: " << boost::system::system_error(error).what() << std::endl;                                       
        return;                                                                                                                              
    }                                                                                                                                        
    receivedStreamBuffer.commit(1);                                                                                                          
    std::istream header( &receivedStreamBuffer );                                                                                            
    uint8_t size;                                                                                                                            
    header >> size;                                                                                                                          
    
    // reserve message size in output sequence                                                                                               
    boost::asio::read(                                                                                                                       
            m_socket,                                                                                                                        
            receivedStreamBuffer.prepare( size ),                                                                                                 
            bufs,                                                                                                                            
            error                                                                                                                            
            );                                                                                                                               
    if ( error ) {                                                                                                                           
        std::cerr << "Read message failed: " << boost::system::system_error(error).what() << std::endl;                                      
        return;                                                                                                                              
    }                                                                                                                                        
    receivedStreamBuffer.commit( size );                                                                                                     
    
    // transfer the buffer contents to string                                                                                                
    std::istream is( &receivedStreamBuffer );                                                                                                
    is >> m_receivedMessageStr;    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-07
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2018-03-01
      • 2013-07-04
      相关资源
      最近更新 更多