2016-03-15 70 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),它不拥有底层数据,所以复制或分配很便宜。实际上,这就是为什么你应该保持源缓冲区,直到异步操作完成。 –