我想通过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"))
时,它工作正常。我在这里缺少什么?
答案 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);
问题最有可能得到解决。