在 boost::asio::buffer 中使用类似 std::vector<std::complex<double>> 的参数
Posted
技术标签:
【中文标题】在 boost::asio::buffer 中使用类似 std::vector<std::complex<double>> 的参数【英文标题】:Use an argument like std::vector<std::complex<double>> in boost::asio::buffer 【发布时间】:2018-05-22 16:17:46 【问题描述】:我正在尝试使用 boost 库在两台主机之间创建 UDP 通信,但我不想发送/接收字符串,而是想发送 std::vector<std::complex<double>
结构。
更具体地说,我有一个更大的函数,它返回一个std::vector<std::complex<double>
类型的缓冲区。通过使用 .front() 我可以看到缓冲区中的值。问题是我想使用 buffer.front() 作为发送方函数的参数,即“auto sent = socket.send_to(boost::asio::buffer(buffer.front()), remote_endpoint, 0, err);"
如果有帮助,我附上了部分感兴趣的代码:
void Sender(std::vector<std::complex<double>> in)
boost::asio::io_service io_service;
udp::socket socket(io_service);
udp::endpoint remote_endpoint = udp::endpoint(address::from_string(IPADDRESS), UDP_PORT);
socket.open(udp::v4());
//std::cout<<"The message is:"<< in<<std::endl;
boost::system::error_code err;
auto sent = socket.send_to(boost::asio::buffer(in), remote_endpoint, 0, err);
socket.close();
std::cout << "Sent Payload --- " << sent << "\n";
int main()
.....
.....
.....
for (int i = 0; i < 20; ++i)
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
Sender(buff.front());
我的问题在于 Sender 参数我应该有什么而不是std::vector<std::complex<double>
因为它不起作用,我收到转换错误,下一个问题是是否可以这样做,我的意思是发送这种类型的数据。
如果我尝试编译,我还附上了返回我的错误:
error: could not convert ‘input.std::vector<std::complex<double> >::front()’ from ‘__gnu_cxx::__alloc_traits<std::allocator<std::complex<double> > >::value_type aka std::complex<double>’ to ‘std::vector<std::complex<double> >’
Sender(input.front());
谢谢!
【问题讨论】:
input
或 buff
是什么类型...从您的问题中不清楚,您要发送什么,整个向量还是仅一个元素?
buff 是一个 std::vector<:complex>> 我只想发送一个元素。
【参考方案1】:
再次查看您的错误消息:
错误:无法将 'input.std::vector<:complex> >::front()' 从 '__gnu_cxx::__alloc_traits<:allocator> > >::value_type aka std::complex
' 到 'std::vector<:complex> >' 发件人(input.front());
如果我们稍微改写为:
错误:无法将 'input.std::vector<:complex> >::front()' 从 std::complex
' 转换为 'std::vector<:complex> >' 发件人(input.front());
问题是什么变得更加明显。 input.front()
只返回(引用)向量的第一个元素,但 Sender
想要整个向量。你想要:
Sender(input);
除此之外:我会将Sender
的参数更改为:
void Sender(const std::vector<std::complex<double>>& in)
这样您就不需要复制向量 - 您只需使用对原始向量的(恒定)引用。如果您打算通过 UDP 发送它,复制向量可能非常微不足道 - 但这是一个有用的习惯。
【讨论】:
【参考方案2】:确实,问题出在 input.front() 上,但我注意到,如果我显示 input.front(),我会看到一个复杂的值,例如 (a,b),其中 a 是实部,b 是想象中的一个。因此,我需要通过 UDP 发送这些值而不是值的地址
也许我不是很清楚。如果您了解 uhd c++ api,那么有一个类似的函数:rx_stream->recv(&buff.front(), buff.size(), md, 3.0, enable_size_map);
,它保存来自 rf 设备的样本并将它们存储在这个称为 buff 的缓冲区中。如果我从函数中理解,它会将样本(顺便说一下很复杂)存储到主机内存中,或者类似的东西。
这是实时发生的,我想知道如何通过 UDP 传输 &buff.front()。为了回答上面的问题,我认为样本是一次发送一个,而不是空洞向量,因为是实时的。如果我错了,请纠正我。
如果我写:std::cout<<&buff.front()
我会得到一个地址,如果我写:std::cout<<buff.front()
我会得到一个类似 (0.000102,0.2213322) 的值。我在想这个值我需要通过 UDP 传输。
【讨论】:
以上是关于在 boost::asio::buffer 中使用类似 std::vector<std::complex<double>> 的参数的主要内容,如果未能解决你的问题,请参考以下文章