asio::buffer类型,用于发送std::vector和std::string
asio::buffer type for sending both std::vector and std::string
我想找到一个 asio::buffer 类型/构造函数,我可以用来通过 asynch_send_to
发送std::string
和std::vector
对象。
请注意,我使用的是独立的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"的成员 'begin':
- 不是'asio::const_buffer'的成员 'end':
- 不是 '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) {
这使您能够为此使用几乎任何存储,为方便起见,您可以编写简单的重载,如下所示:
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/删除,就像你的第一个代码段一样)
相关文章:
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- std::vector的包装器,使数组的结构看起来像结构的数组
- 编译器如何区分std::vector的构造函数
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 为什么std::vector和std::valarray初始化构造函数不同
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将AERT_Allocate与 std:vector 一起使用
- 推导 std::vector::back() 的返回类型
- 如何将原始字节附加到 std::vector?
- std::vector 没有重载函数的实例与参数列表匹配
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?