我正在尝试使用boost库在两台主机之间创建UDP通信,但不是发送/接收我希望发送std::vector<std::complex<double>
结构的字符串。
更具体地说,我有一个更大的函数,它返回std::vector<std::complex<double>
类型的缓冲区。通过使用.front(),我可以看到缓冲区中的值。问题是我想使用buffer.front()作为发送者函数的参数,即&#34; 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());
谢谢!
答案 0 :(得分:1)
再次查看错误消息:
错误:无法转换'input.std :: vector&lt; std :: complex&lt; double&gt; &gt; :: front()'来自'__gnu_cxx :: __ alloc_traits&lt; std :: allocator&lt; std :: complex&lt; double&gt; &GT; &gt; :: value_type {aka std :: complex&lt; double&gt;}'to'std :: vector&lt; std :: complex&lt; double&gt; &GT;”
发件人(input.front());
如果我们稍微改写一下:
错误:无法转换'input.std :: vector&lt; std :: complex&lt; double&gt; &gt; :: front()'从std :: complex&lt; double&gt;'到'std :: vector&lt; std :: complex&lt; double&gt; &GT;”
发件人(input.front());
问题是什么变得更加明显。 input.front()
只返回(引用)向量的第一个元素,但Sender
想要整个向量。你想要:
Sender(input);
除此之外:我会将参数更改为Sender
:
void Sender(const std::vector<std::complex<double>>& in)
这样您就不需要复制矢量 - 只需对原始矢量使用(常量)引用即可。如果你打算通过UDP发送它,复制矢量可能是非常微不足道的 - 但这是一个很有用的习惯。
答案 1 :(得分:0)
确实,问题在于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传输&amp; buff.front()。为了回答上面的问题,我认为样本是一次发送一个,而不是孔向量,因为它是实时的。如果我错了,请取决于我。
如果我写:std::cout<<&buff.front()
我得到一个地址,如果我写:std::cout<<buff.front()
我得到一个像(0.000102,0.2213322)的值。我想这个值我需要通过UDP传输。