【问题标题】:udp message with multiple data types using boost使用 boost 的具有多种数据类型的 udp 消息
【发布时间】:2013-06-12 17:39:11
【问题描述】:

我是 boost 新手,我想发送一个具有多个数据类型值的 udp 数据包。例如我想发送一个三个字节的数据包,其中前两个字节用于消息代码,最后一个用于服务ID。我为此目的使用了 memcpy,但生成的缓冲区不包含正确和所需的值。这是我的代码。

char buff[3];
uint16_t msgCode = 23;
char serviceId = '9';

msgCode = htons(msgCode);

memcpy(buff, &msgCode, 2);
memcpy(buff+2, &serviceId, 1);

std::string data = buff;
boost::shared_ptr<std::string> message(new std::string(data));

sock.async_send_to(boost::asio::buffer(data),dest_endPoint
, boost::bind(&udp_class::handle_send, this, message, boost::asio::placeholders::error
, boost::asio::placeholders::bytes_transferred));

注意:我只在缓冲区有问题,我的意思是如何将多种类型的值插入缓冲区并作为 udp 数据包发送。

提前感谢。

【问题讨论】:

    标签: c++ boost-asio


    【解决方案1】:

    我在发布的代码中发现了一个问题。 data 变量是一个本地变量,它作为async_send_to 方法调用的buffers 参数传递。 boost::asio::buffer 类实例不会复制 data 内容。在 Asio 发送数据的那一刻,data 变量已经被销毁。 documentation 解释了这种行为。

    虽然缓冲区对象可以根据需要被复制,但其所有权 底层内存块由调用者保留,它必须 保证它们在调用处理程序之前一直有效。

    要解决问题,据我了解代码,有必要将message 变量指向boost::asio::buffer 构造函数参数。

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 2023-04-02
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 2015-08-06
      相关资源
      最近更新 更多