Ускоренный ввод / вывод 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);
проблема скорее всего будет решена.