2016-03-15 59 views
1

我想找到一個單獨的asio :: buffer類型/構造函數,可以通過asynch_send_to發送std::stringstd::vector對象。asio ::用於發送std :: vector和std :: string的緩衝區類型

請注意,我使用獨立 asio,沒有提升!

現在,我用來發送數據的功能是:

void UdpSocket::send_datagram(asio::const_buffer buffer) { 
    mSocket.async_send_to(buffer, mEndpoint, 
     [this, datagram](const asio::error_code& error, std::size_t bytes_transferred) { 
     if (!error) { 
      // stuff... 
     } 
     else{ 
      // other stuff.. 
     } 
    }); 
    } 

我希望能夠爲使用:

std::vector mVector; 
    send_datagram(asio::buffer(mVector.data(), mVector.size()); 

std::string mString = "hello world"; 
    send_datagram(asio::buffer(mString.data(), mString.length()); 

以上給出了buffer_sequence_adapter.hpp中的一系列錯誤:

  • '爲const_iterator':不是 'ASIO :: const_buffer'
  • '開始' 的成員:不是 'ASIO :: const_buffer' 的構件
  • '結束':不是的成員「ASIO :: const_buffer」
  • 「ITER」:未聲明的標識符

我有點由緩衝器的絕對數量和它們之間的兼容性淹沒;有人可以幫我理清什麼是正確類型的緩衝區/構造函數,可以使用std::vectorstd::string類型嗎?

謝謝!

+0

你錯過的std ::向量初始化模板參數?並在代碼編譯器錯誤的地方指向? –

回答

1

您可以接受緩衝區指針&長度作爲參數,這可能是最可擴展的方式:

void UdpSocket::send_datagram(const char *buf, size_t len) { 
    mSocket.async_send_to(asio::buffer(buf, len), mEndpoint, 
     [this, datagram](const asio::error_code& error, std::size_t bytes_transferred) { 

這使您可以使用幾乎任何存儲爲此,爲了方便,你可以寫簡單的過載(S )是這樣的:

void send_datagram(const std::string &s) { send_datagram(s.c_str(), s.size()); } 
void send_datagram(const std::vector<char> &s) { send_datagram(s.data(), s.size()); } 

但是在這個網頁摘要,你應該記住一些事情:

  1. 您應該保持源緩衝區處於活動狀態,直到異步操作完成。
  2. 不要複製的數據/緩衝(不允許數據是免費的()'d /在範圍退出刪除,因爲在你的第一個片段)
+0

在最初的問題中有一個asio :: const_buffer(不是boost,btw),它不擁有底層數據,所以複製或分配很便宜。實際上,這就是爲什麼你應該保持源緩衝區,直到異步操作完成。 –

相關問題