2013-01-14 80 views
1

我想从套接字读取特定数量的字节。我的服务器发送:Boost从TCP套接字接收数据

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

如何阅读的第一个字节,然后读出的剩余字节使用boost :: asio :: ip :: tcp :: socket :: read?这里是代码片段:

// 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(...) 
     { 

     } 
    } 

回答

2

你会想为一个字节的头部准备一个缓冲区,然后为消息准备另一个缓冲区。一个简化的例子可能是

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;