[英]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_t
, transfer_exactly_t
和transfer_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.