boost :: asio :: async_write, запись данных размером более 65536 байт

Я пытаюсь записать кадры jpeg через сокет клиенту, используя async_write () . В качестве отправной точки я использовал пример асинхронного дневного TCP-сервера boost .

#include 
#include 
#include 
#include 
#include 
#include 
#include 

using boost::asio::ip::tcp;

std::string make_daytime_string()
{
  using namespace std; // For time_t, time and ctime;
  time_t now = time(0);
  return ctime(&now);
}

class tcp_connection
  : public boost::enable_shared_from_this
{
public:
  typedef boost::shared_ptr pointer;

  static pointer create(boost::asio::io_service& io_service)
  {
    return pointer(new tcp_connection(io_service));
  }

  tcp::socket& socket()
  {
    return socket_;
  }

  void start()
  {
    message_ = make_daytime_string();

    boost::asio::async_write(socket_, boost::asio::buffer(message_),
        boost::bind(&tcp_connection::handle_write, shared_from_this(),
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));
  }

private:
  tcp_connection(boost::asio::io_service& io_service)
    : socket_(io_service)
  {
  }

  void handle_write(const boost::system::error_code& /*error*/,
      size_t /*bytes_transferred*/)
  {
  }

  tcp::socket socket_;
  std::string message_;
};

class tcp_server
{
public:
  tcp_server(boost::asio::io_service& io_service)
    : acceptor_(io_service, tcp::endpoint(tcp::v4(), 13))
  {
    start_accept();
  }

private:
  void start_accept()
  {
    tcp_connection::pointer new_connection =
      tcp_connection::create(acceptor_.io_service());

    acceptor_.async_accept(new_connection->socket(),
        boost::bind(&tcp_server::handle_accept, this, new_connection,
          boost::asio::placeholders::error));
  }

  void handle_accept(tcp_connection::pointer new_connection,
      const boost::system::error_code& error)
  {
    if (!error)
    {
      new_connection->start();
      start_accept();
    }
  }

  tcp::acceptor acceptor_;
};

int main()
{
  try
  {
    boost::asio::io_service io_service;
    tcp_server server(io_service);
    io_service.run();
  }
  catch (std::exception& e)
  {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

Я изменил метод, выполняющий async_write () , следующим образом:

 void start()
  {
    // fileToVector method reads contents of file to vector;
    std::vector message_ = fileToVector("/tmp/test");

    boost::asio::async_write(socket_, boost::asio::buffer(message_),
        boost::bind(&tcp_connection::handle_write, shared_from_this(),
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));
  }

При чтении большого файла с сервера с помощью клиента сервер будет записывать максимум 65536 байт. Если я заменю вызов boost :: asio :: async_write () синхронным вызовом boost :: asio :: write () , правильное количество байтов будет передано клиенту.

Полагаю, мой вопрос в том, как я могу отправить более 65536 байт, используя boost :: asio :: async_write () ? Любая помощь будет принята с благодарностью.

8
задан fduff 21 January 2016 в 12:43
поделиться