Как узнать, сколько данных было отправлено через TCP-сокет Boost ASIO?

У меня есть несколько общих указателей на boost::asio::io_service, boost::asio::ip::tcp::endpoint, boost::asio::ip::tcp::acceptor а также boost::asio::ip::tcp::socket, Я принимаю подключение пользователей и передаю shared_ptr сокета моему классу. Это делает свою работу.

Теперь то, что я хочу, - просто посчитать мой трафик. Я хочу получить информацию о том, сколько данных было отправлено и получено во время этого соединения. Как получить такую ​​информацию из принятого TCP-сокета Boost ASIO?

1 ответ

Решение

Если вы используете асинхронные методы, обработчик завершения async_read будет указывать количество полученных байтов. Точно так же обработчик завершения, данный async_write будет указывать количество записанных байтов. Было бы тривиально поддерживать счетчик выполнения в качестве члена класса, в котором вы связываете методы как ранее описанные обработчики завершения.

#include <boost/asio.hpp>

#include <iostream>

class Socket
{
public:
    Socket(
            boost::asio::io_service& io_service
          ) :
        _socket( io_service ),
        _counter( 0 )
    {

    }

    void readHandler(
            const boost::system::error_code& error,
            std::size_t bytes_transferred
            )
    {
        _counter += bytes_transferred;
    }

    void writeHHandler(
            const boost::system::error_code& error,
            std::size_t bytes_transferred
            )
    {
        _counter += bytes_transferred;
    }

private:
    boost::asio::ip::tcp::socket _socket;
    std::size_t _counter;
};

int
main()
{
    boost::asio::io_service io_service;
    Socket foo( io_service );
}
Другие вопросы по тегам