【问题标题】:How to send an std::vector<unsigned char> using asio::UDP socket.send_to如何使用 asio::UDP socket.send_to 发送 std::vector<unsigned char>
【发布时间】:2017-05-10 04:48:42
【问题描述】:

我正在尝试使用以下代码将std::vector&lt;unsigned char&gt; 通过boost::asio::ip::udp 从我的服务器应用程序同步发送到客户端应用程序,如下所示:

boost::system::error_code ignored_error;
std::vector<unsigned char> buf_data;
std::size_t len = socket.send_to(boost::asio::buffer(buf_data), remote_endpoint, 0, ignored_error);

这会导致挂起 & socket.send_to 永远不会返回。

但是,如果我尝试发送如下所示的结构,它会很好地工作

struct MyStruct
{
    char name[1024];
    int age;
};

boost::system::error_code ignored_error;
MyStruct send_data = {"something", 123 };
std::size_t len = socket.send_to(boost::asio::buffer(&send_data, sizeof(send_data)), remote_endpoint, 0, ignored_error);

另外,如果我尝试发送如下所示的 std::string,它也可以正常工作。

在传递 std::vector&lt;unsigned char&gt; 时调用 socket.send_to 有什么不同? socket.send_tostd::vector&lt;unsigned char&gt; 一起使用还是应该使用其他方式发送字符?

PS: 我要发送的矢量大小是buf_data.size() is 140050 & 我在 OSX 上

【问题讨论】:

  • 在您的示例中,buf_data 不包含任何数据。还有为什么你会忽略error_code?它的存在是有原因的。
  • 从未使用过asio,但vector是非POD类。你想发送对象代表的数据,对吧?那不是buf_data.data()吗?
  • @PaulMcKenzie 缓冲区对std::vector 有过载,足够聪明,可以同时提取数据和大小。
  • “这会导致挂起,并且 socket.send_to 永远不会返回。” should not happen。请提供重现问题的 SSCCE。 /cc @PaulMcKenzie
  • 太棒了。我希望你知道为什么 SSCCE 是必不可少的:问题完全围绕着发送方是问题的错误假设。不是。

标签: c++ sockets c++11 udp boost-asio


【解决方案1】:

如果您的 buf_data 至少包含一个元素,您可以使用以下内容:

boost::asio::buffer(&buf_data[0], buf_date.size())

作为第一个参数。

【讨论】:

  • 如果buf 为空,则行为未定义。使用buf.data() 或在使用&amp;buf_data[0] 之前检查empty()
  • @PaulMcKenzie 我指定 buf_data 必须至少包含一个元素。
  • 我对这个解决方案有同样的问题。奇怪的是,通过 tcp 传递 boost::asio::buffer(buf_data) 也可以正常工作。但似乎不适用于我急需的 UDP
  • @PaulMcKenzie 是的。我正在添加空支票。 buf_data 不为空。我确认了这一点
  • @AdaLovelace 尝试使用相同的数据结构,但使用小型数据。如果可行,那么问题可能与您的数据大小或内容有关。
猜你喜欢
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2013-11-18
  • 2017-10-09
  • 1970-01-01
  • 2021-08-11
相关资源
最近更新 更多