2011-08-17 3 views
1

boost::asio::io_service, boost::asio::ip::tcp::endpoint, boost::asio::ip::tcp::acceptorboost::asio::ip::tcp::socket에 대한 공유 포인터가 있습니다. 사용자 연결을 수락하고 소켓의 shared_ptr을 내 클래스에 전달합니다. 그것은 그 일을합니다.부스트 ASIO TCP 소켓 연결을 통해 얼마나 많은 데이터가 전송되었는지 확인하는 방법은 무엇입니까?

이제 원하는 것은 간단합니다. 트래픽을 계산하십시오. 연결하는 동안 얼마나 많은 데이터를 보내고 받았는지에 대한 정보를 얻고 싶습니다. 부스트 ASIO TCP 소켓에서 그러한 정보를 얻는 방법?

+3

이것은 사용자 코드에서 할 수있는 작업입니다. 부스트에서 도움이 필요하지 않습니다. –

+0

@J T : 확장 가능한 서버를 만들려고합니다. 나는 서비스의 개념을 가지고있다. 각 사용자 요청에 따라 각 서비스에 소켓을 전달합니다. 그리고이 연결이 얼마나 많은 트래픽을 사용했는지 알고 싶습니다. – Rella

답변

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); 
} 
+0

또는 내가 shared_ptr을 일부 공유 라이브러리 (이는 나 - 서버 작성자가 작성하지 않은) 내부의 일부 서비스 클래스에 부스트하도록 전달한 것처럼 사용자와 서비스 사이에 TCP 프록시 서비스를 만드는 것이 더 쉽습니다. – Rella

관련 문제