ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 如何使用boost asio读取固定大小的数据包?

2019-10-08 20:06:39  阅读:491  来源: 互联网

标签:c sockets boost boost-asio


我正在使用boost-asio进行同步读/写.数据以二进制格式出现,没有边界,长度信息以包格式编码.所以用指定的大小读入是很重要的. ip :: tcp :: iostream能做到吗?有人能提供一个例子吗?谢谢.

解决方法:

我处理一个程序,它发送不同大小的不同数据.我使用8字节的固定标头来编码大小,然后,我添加数据:

 enum { header_length = 8 }; //const header length

我得到的大小(m_outbound_data是一个std :: string ==一个序列化的对象)

//give header length    
std::ostringstream header_stream
header_stream << std::setw(header_length) //set a field padding for header  
              << std::hex                 //set next val to hexadecimal
              << m_data_out.m_outbound_data.size(); //write size in hexa

m_data_out.m_outbound_header = header_stream.str(); //m_outbound_head == size in hexa in a std::string

      //m_outbound_header = [ 8 byte size ] 
      //m_outbound_data = [ serialized data ]

      //write all data in the std::vector and send it
      std::vector<boost::asio::const_buffer> buffer;
      buffer.push_back(boost::asio::buffer(m_data_out.m_outbound_header));
      buffer.push_back(boost::asio::buffer(m_data_out.m_outbound_data));

而对于读取,您需要在2次读取:第一次读取8字节以获取大小,然后读取向量中的数据并反序列化为对象:

 struct network_data_in {   
  char m_inbound_header[header_length]; //size of data to read  
  std::vector<char> m_inbound_data; // read data    
};

我使用这个结构来获取数据,在m_inbound_header上调用read来首先填充大小的缓冲区,然后在句柄中:

//get size of data
std::istringstream is(std::string(m_data_in.m_inbound_header, header_length));
std::size_t m_inbound_datasize = 0;
is >> std::hex >> m_inbound_datasize;
m_data_in.m_inbound_data.resize(m_inbound_datasize); //resize the vector

然后再次调用缓冲区上的m_inbound_data读取,这样就可以准确读取发送的数据
在第二个handle_read中,您必须反序列化数据:

//extract data
std::string archive_data (&(m_data_in.m_inbound_data[0]),m_data_in.m_inbound_data.size());
std::istringstream archive_stream(archive_data);
boost::archive::text_iarchive archive(archive_stream);
archive >> t; //deserialize

希望对你有所帮助!

标签:c,sockets,boost,boost-asio
来源: https://codeday.me/bug/20191008/1874173.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有