asio ::用于发送std :: vector和std :: string的缓冲区类型
问题描述:
我想找到一个单独的asio :: buffer类型/构造函数,可以通过asynch_send_to
发送std::string
和std::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::vector
和std::string
类型吗?
谢谢!
答
您可以接受缓冲区指针&长度作为参数,这可能是最可扩展的方式:
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()); }
但是在这个网页摘要,你应该记住一些事情:
- 您应该保持源缓冲区处于活动状态,直到异步操作完成。
- 不要复制的数据/缓冲(不允许数据是免费的()'d /在范围退出删除,因为在你的第一个片段)
+0
在最初的问题中有一个asio :: const_buffer(不是boost,btw),它不拥有底层数据,所以复制或分配很便宜。实际上,这就是为什么你应该保持源缓冲区,直到异步操作完成。 –
你错过的std ::向量初始化模板参数?并在代码编译器错误的地方指向? –