Ускоренный ввод / вывод ASIO с разборкой приводит к загадочным ошибкам в памяти

Я хотел бы отправить несколько строк через TCP, не объединяя их в одну большую строку, и, насколько я понимаю, интерфейс ввода-вывода ASIO с разборкой может это сделать. Тем не менее, я должен делать что-то не так, потому что моя реализация продолжает сталкиваться с ошибками памяти. Фрагмент ниже (компилируемый и запускаемый) возвращает искаженную строку, когда я 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 ответа

Решение

Последняя строка должна быть:

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", он обрабатывается неправильно.

Вам не нужно передавать буфер для записи в этом случае. Если вы переписали последнюю строку вашего примера как

write(sock, vec);

проблема скорее всего будет решена.

Другие вопросы по тегам