繁体   English   中英

通过boost asio在Socket上发送和接收protobuf数据

[英]Sending and receiving protobuf data over Socket via boost asio

由于TCP套接字,我想将Protobuf数据从我的服务器发送到我的客户端。

我测试了我的客户端和我的服务器以及TCP连接工作。

所以我尝试序列化我的数据并使用streambuf发送它。

在我的服务器中:

void SendData(protobufType data){
        std::ostream ostream(&this->m_streambuf);
        data.SerializeToOstream(&ostream);

        std::cout<<"Send data"<< std::endl;
        boost::asio::write(this->m_socket, this->m_streambuf);
}

在我的客户:

boost::asio::streambuf response;
boost::asio::read(socket, response);
std::cout<<"Data received"<< std::endl;

我运行了3次我的发送功能(我猜我的数据接缝要发送)但myclient接缝永远不会得到数据......

您的客户端挂在这条线上

boost::asio::read(socket, response);

因为上面是一样的

boost::asio::read(socket, response, boost::asio::tranfer_all());

文档中描述的内容

您使用read重载,它需要完成条件。 这些仿函数有三种: transfer_all_ttransfer_exactly_ttransfer_at_least_t 它们中的每一个都有operator()() ,如果读操作完成则返回0 - 参见参考

transfer_all_t::opeator()()的代码是:

  template <typename Error>
  std::size_t operator()(const Error& err, std::size_t)
  {
    return !!err ? 0 : default_max_transfer_size;
  }

因此只有在发生错误时才返回0。

transfer_at_least_t::operator()()是:

  template <typename Error>
  std::size_t operator()(const Error& err, std::size_t bytes_transferred)
  {
    return (!!err || bytes_transferred >= minimum_)
      ? 0 : default_max_transfer_size;
  }

正如您所看到的,如果发生错误或至少传输了minimum_字节,则返回0。

如果您知道在发生错误时transfer_all结束read ,则可以创建此错误以查看读取数据。 您可以在服务器端关闭套接字(用于发送操作)或只关闭此套接字。 然后你可以改变read调用以获取error_code ,你应该看到文件结束为错误:

boost::system::error_code ec;
boost::asio::read(socket,response,ec);
if (ec)
{
   cout << ec.message() << endl; // End of file
   // if ec is End of file you can see what data was read into streambuf
}

您发送一个序列化对象,因此您知道此对象的大小,为什么不使用您发送对象大小的方法(例如,在4个字节上),然后在此标头之后,稍后发送对象的内容。

在客户端:

array<char,4> length;
boost::asio::read(socket,boost::asio::buffer(length));
int contentLen = /*conversion from length array into integer */
vector<char> content( contentLen );
boost::asio::read(socket,boost::asio::buffer(content));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM