我正在为我的应用程序使用Boost库(boost_1_53_0)。感兴趣的区域是通过UDP发送消息的模块。查看下面的代码部分(我已经删除了不会影响功能的不必要的代码部分)。
int send()
{
.
.
.
std::vector<boost::asio::const_buffer> bufs;
writeMessage(bufs);
/* If I comment out writeMessage and fill variable
* bufs the same way its populated in writeMessage,
* things work */
udpSocket.send_to(bufs, endPoint);
}
void writeMessage(std::vector<boost::asio::const_buffer>& bufs)
{
/* Populate data..... */
bufs.push_back(boost::asio::const_buffer(data1, sizeof(data1)));
bufs.push_back(boost::asio::const_buffer(data2, sizeof(data2)));
.
.
.
bufs.push_back(boost::asio::const_buffer(datan, sizeof(datan)));
}
我正在使用wireshark检查从系统发出的消息。由于某种原因,正在向系统发送不正确的数据。通过变量bufs的引用是否正确?同一段代码适用于较旧的g ++和Boost版本。
如果我注释掉writeMessage并在send()函数中手动填充向量bufs,那么事情就好了。只有当我使用函数writeMessage()时,数据才会被破坏。
我最近升级到g ++ 4.6.3和Boost 1_53_0并看到了这个问题。我正在使用Ubuntu 64位机器。所有库都编译为64位。
答案 0 :(得分:1)
最常见的陷阱是忘记buffer
(或const_buffer
)函数do not copy the underlying buffer(向上滚动页面以查看解释和示例) - 它们只是将其调整为{{ 1}}(或ConstBufferSequence
)概念。这意味着缓冲区必须比异步操作更长。
为什么你的程序用于处理其他一些编译器/编译器标志/ boost版本/等?这只是运气问题。您的MutableBufferSequence
data1
数组dataN
已在函数堆栈框架内(char
下)分配on the call stack。当RBP
函数退出时,其堆栈帧将被释放。后续函数调用将在writeMessage
所在的同一位置分配堆栈帧。但只要他们不使用writeMessage
... data1
的堆栈地址,旧数据就可以保持不变。略有不同的编译器标志或函数实现将改变图片。