5

我想通过 TCP 发送多个字符串,而不是先将它们组合成一个大字符串,据我了解,ASIO 的 scatter-gather I/O 接口可以做到这一点。但是,我一定做错了什么,因为我的实现不断遇到内存错误。下面的代码片段(可编译和可运行)在 I 时返回一个乱码字符串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"))。我在这里想念什么?

4

2 回答 2

7

最后一行应该是:

write(sock, vec);

否则它不是“scatter-gather”,因为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 向量”,因此处理不正确。

于 2013-03-12T09:36:00.340 回答
3

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

write(sock, vec);

问题很可能会得到解决。

于 2013-03-12T09:35:02.527 回答