使用boost的多个数据类型的udp消息

时间:2013-06-12 05:52:57

标签: c++ boost-asio

我是新手,我希望发送一个包含多个数据类型值的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数据包发送。

提前完成。

1 个答案:

答案 0 :(得分:1)

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

  

虽然可以根据需要复制buffers对象,但是所有权   必须通过调用者保留底层内存块   保证它们在调用处理程序之前保持有效。

要解决问题,就我理解代码而言,必须将message变量指向boost::asio::buffer构造函数参数。