在 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&lt;std::complex&lt;double&gt; 结构。

更具体地说,我有一个更大的函数,它返回一个std::vector&lt;std::complex&lt;double&gt; 类型的缓冲区。通过使用 .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&lt;std::complex&lt;double&gt; 因为它不起作用,我收到转换错误,下一个问题是是否可以这样做,我的意思是发送这种类型的数据。

如果我尝试编译,我还附上了返回我的错误:

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());

谢谢!

【问题讨论】:

inputbuff 是什么类型...从您的问题中不清楚,您要发送什么,整个向量还是仅一个元素? 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-&gt;recv(&amp;buff.front(), buff.size(), md, 3.0, enable_size_map);,它保存来自 rf 设备的样本并将它们存储在这个称为 buff 的缓冲区中。如果我从函数中理解,它会将样本(顺便说一下很复杂)存储到主机内存中,或者类似的东西。

这是实时发生的,我想知道如何通过 UDP 传输 &buff.front()。为了回答上面的问题,我认为样本是一次发送一个,而不是空洞向量,因为是实时的。如果我错了,请纠正我。

如果我写:std::cout&lt;&lt;&amp;buff.front() 我会得到一个地址,如果我写:std::cout&lt;&lt;buff.front() 我会得到一个类似 (0.000102,0.2213322) 的值。我在想这个值我需要通过 UDP 传输。

【讨论】:

以上是关于在 boost::asio::buffer 中使用类似 std::vector<std::complex<double>> 的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在转移中间处理半开插座?

boost::asio - 知道何时必须关闭/关闭连接

Boost::asio::async_read 不会在条件下停止

如何在 boost asio 中设置阻塞套接字的超时时间?

Boost asio 中的 TCP 客户端

BOOST中read_some和 boost::asio::error::eof错误