본문 바로가기
Tools for Dev

boost asio - 수정중

by leanu 2008. 10. 1.


Examples & Reference
---------------------------------------------------------------------------------------------
Examples
Reference


Memo
---------------------------------------------------------------------------------------------

1. 송신
     boost::asio::io_service io_service; // io_service object생성.  thread safe 하므로 여러개의 thread
                                                      // 가 하나의 io_service 사용 가능.
     tcp::endpoint endpoint(tcp::v4(), (int)portNo); // TCP, UDP 방식과 수신할 포트 번호를 설정한다.
     tcp::accepter accepter(io_service, endpoint) ; // 수신할 객체를 선언한다.
                                                                      // 이또한 TCP와 UDP방식이 있다.
     tcp::socket socket(io_service);
     accepter.async_accept(socket, handlerfunc);
         또는
     accepter.accept(socket);
    
    
handlerfunc 에서는 두가지 일을 한다.
  1. 들어온 녀석에 대한 처리
   - 클라이언트로부터 보내는 값 받기

      boost::asio::async_read(socket,
                                         boost::asio::buffer(const void * data, std::size_t max_size_in_bytes),
                                         boost::bind( readHandlerfunc, boost::asio::placeholders::error)
        또는
      boost::asio::read 를 사용 (사용방법은 Reference참조)


  2. async_accept에 대한 새로운 socket을 만들어 수신 대기 상태로 만든다.

    
     io_service.run(); io_service 를 시작한다.


readHandlerfunc
  1.  에러 체크
      void readHandlerfunc( const boost::system::error_code& error)
      {
           if (!error)
           {
        boost::asio::async_read(socket_,
                                           boost::asio::buffer(const void* data, std::size_t max_size_in_bytes),
                                           boost::bind(
            }


2. 수신

try
{
      boost::asio::io_service io_service;
      tcp::resolver resolver(io_service);
      tcp::resolver::query query(const char* host, const char* port);
      tcp::resolver::iterator iter = resolver.resolve(query);
      tcp::resolver::iterator end;
      tcp::socket socket(io_service);
      boost::system::error_code error = boost::asio::error::host_not_found;
 
      while ( error && endpoint_iterator != end )   // IPv4 와v6를 검사하여 연결이 되는 쪽을 찾는 루틴
      {
            socket.close();
            socket.connect(*iter++, error);
       }

        if ( error )
             throw boost::system::system_error(error);       
        for
(;;)
        {
               boost::array<char, 128> buf;
               boost::system::error_code error;
                size_t len = socket.read_some(boost::asio::buffer(buf), error);
                if (error == boost::asio::error::eof)
                     break; // Connection closed cleanly by peer.
                else if (error)
                     throw boost::system::system_error(error); // Some other error.
                std::cout.write(buf.data(), len);
          }
 }
 catch (std::exception& e)
 {
 std::cerr << e.what() << std::endl;
 }




     
     
    

'Tools for Dev' 카테고리의 다른 글

boost::shared_ptr  (0) 2008.10.08
boost::asio 를 이용한 asyncronous communication 클래스  (0) 2008.10.07
boost::enable_shared_from_this  (0) 2008.10.01
boost test  (0) 2008.09.12
boost Serialization  (0) 2008.09.04

댓글