簡體   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