增强ASIO分散 - 聚集I / O会导致神秘的内存错误

时间:2013-03-12 08:55:36

标签: c++ boost boost-asio

我想通过TCP发送多个字符串,而不是先将它们组合成一个大字符串,而且据我所知,ASIO的分散 - 聚集I / O接口可以做到这一点。但是,我必须做错了,因为我的实现不断遇到内存错误。我telnet localhost 11211时,下面的代码段(可编辑和可运行)会返回乱码:

#include <vector>
#include <string>
#include <boost/asio.hpp>

using namespace std;
using namespace boost::asio;
using namespace boost::asio::ip;

int main() {
    io_service service;
    tcp::acceptor acceptor(service, tcp::endpoint(tcp::v4(), 11211));
    tcp::socket sock(service);
    acceptor.accept(sock);
    if (!acceptor.is_open()) return 1;
    string s = "this is a really long string";
    vector<const_buffer> vec;
    vec.push_back(buffer(s));
    write(sock, buffer(vec));
}

然而,当我write(sock, buffer("this is a really long string"))时,它工作正常。我在这里缺少什么?

2 个答案:

答案 0 :(得分:7)

最后一行应该是:

write(sock, vec);

否则它不是“分散 - 聚集”,因为buffer自由函数总是返回mutable_buffers_1,即单个缓冲区。在您的情况下,将调用以下buffer重载:

template <typename PodType, typename Allocator>
inline mutable_buffers_1 buffer(std::vector<PodType, Allocator>& data)
{
  return mutable_buffers_1(mutable_buffer(data.size() ? &data[0] : 0, data.size() * sizeof(PodType)));
}

由于您的矢量不是“POD矢量”,因此处理不正确。

答案 1 :(得分:3)

在这种情况下,您不需要传递缓冲区来写入。 如果您将示例的最后一个字符串重写为

write(sock, vec);

问题最有可能得到解决。