我是新手,我希望发送一个包含多个数据类型值的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数据包发送。
提前完成。
答案 0 :(得分:1)
我发现发布的代码存在问题。 data
变量是本地变量,它作为buffers
方法调用的async_send_to
参数传递。 boost::asio::buffer
类实例不会复制data
内容。在Asio发送数据的那一刻,data
变量已经被破坏。 documentation解释了这种行为。
虽然可以根据需要复制buffers对象,但是所有权 必须通过调用者保留底层内存块 保证它们在调用处理程序之前保持有效。
要解决问题,就我理解代码而言,必须将message
变量指向boost::asio::buffer
构造函数参数。