У меня есть очень простой метод, с целью ответа на входящее сообщение, а затем закрывая соединение:повышение :: ASIO :: async_write и буферы более 65536 байт
void respond (const std::string message)
{
std::string str = "<?xml version=\"1.0\"?>";
Controller & controller = Controller::Singleton();
if (auto m = handleNewMessage(_message))
{
auto reply = controller.FIFO(m);
str.append(reply);
}
else
str.append ("<Error/>");
std::size_t bytes = str.size() * sizeof(std::string::value_type);
std::cout << "Reply bytesize " << bytes << std::endl;
boost::asio::async_write(
socket_,
boost::asio::buffer(str),
boost::bind(
&TCPConnection::handle_write,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
));
}
void handle_write (const boost::system::error_code & error, size_t bytes_transferred)
{
if (error)
{
std::cerr << "handle_write Error: " << error.message() << std::endl;
std::cerr << "handle_write Bytes sent: " << bytes_transferred << std::endl;
}
else
{
std::cerr << "handle_write Bytes sent: " << bytes_transferred << std::endl;
socket_.close();
}
}
Я знаю, что проблема что повышение :: ASIO :: async_write не завершает операцию записи, так как выход из вышеуказанных операций:
Reply bytesize: 354275
handle_write Bytes sent: 65536
Подразумевая, что максимальный размер буфера (65536) не было достаточно, чтобы записать данные?
Поиск по всем Stack Overflow, я обнаружил, что моя проблема в том, что буфер, созданный метод:
boost::asio::buffer(str)
выходит из области видимости перед операцией имеет шанс закончить отправку всех данных.
Похоже, я не могу использовать повышение :: ASIO :: mutable_buffer, но только повышение :: ASIO :: streambuf
Кроме того, и что более важно, вторая ошибка жалуется на фактический прирост :: ASIO :: async_write передается импульс :: ASIO :: const_buffer ИЛИ повышение :: ASIO :: mutable_buffer:
/usr/include/boost/asio/detail/consuming_buffers.hpp:164:5: error: no type named ‘const_iterator’ in ‘class boost::asio::mutable_buffer’
const_iterator;
^
/usr/include/boost/asio/detail/consuming_buffers.hpp:261:36: error: no type named ‘const_iterator’ in ‘class boost::asio::mutable_buffer’
typename Buffers::const_iterator begin_remainder_;
Так я остался только один выбор: Для того, чтобы использовать импульс :: ASIO :: streambuf
Я попытался использовать:
boost::asio::streambuf _out_buffer;
В качестве члена класса, а затем сделал метод ответа:
std::ostream os(&_out_buffer);
os << str;
boost::asio::async_write(
socket_,
_out_buffer,
boost::asio::transfer_exactly(bytes),
boost::bind(
&TCPConnection::handle_write,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
));
Однако, хотя я не получаю ошибки, не все данные передаются! Итак, я предполагаю, что вся строка не записана в streambuf?
В качестве альтернативы, я хотел бы знать, что является самым элегантным способом записи, используя boost :: asio :: async_write, данные размером более 65536 байтов!
Да, вы действительно помогли! Совсем мгновение назад я переместил сокет вплотную к беспрецедентному handle_write! ОДНАКО, проблема все еще остается, даже при использовании streambuf, все содержимое не отправляется, хотя больше нет ошибки –
Как насчет времени жизни буфера? Он жив в течение всего времени передачи? – inkooboo
Да, он создается во время метода ответа и не изменяется до тех пор, пока объект класса не будет удален asio. У меня есть подозрение, что не все части строки скопированы, не знаю, правильно ли я копирую строку в streambuf. –