0

我正在为我的应用程序使用 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() 函数中手动填充向量 buf,一切都很好。只有当我使用函数 writeMessage() 时,数据才会被破坏。

我最近升级到 g++ 4.6.3 和 Boost 1_53_0 并看到了这个问题。我正在使用 Ubuntu 64 位机器。所有库都编译为 64 位。

4

1 回答 1

1

最常见的陷阱是忘记buffer(或const_buffer)函数不会复制底层缓冲区(向下滚动上页查看解释和示例)——它们只是将其调整为MutableBufferSequence(或ConstBufferSequence)概念。这意味着缓冲区必须比异步操作长。

为什么您的程序用于与其他一些编译器/编译器标志/提升版本/等一起使用?这只是运气的问题。您的data1...dataN数组char被分配在调用堆栈上,在函数堆栈框架内(在 下RBP)。当writeMessage函数退出时,它的堆栈帧被释放。随后的函数调用将在大约相同的位置分配堆栈帧writeMessage。但只要他们不使用data1...的堆栈地址dataN,旧数据可能会原封不动地保留在那里。稍微不同的编译器标志或函数实现将改变图片。

于 2013-09-25T12:37:25.567 回答