Saturday, January 17, 2009

boost::asio - Network Library modified by Terry - 4

boost::asio 내 맘대로 바꾼 버전 마지막 4번째. Server.
사실 서버부분은 너무나도 간단해서 올릴까 말까 했는데 나중되면 다 까먹을 게 뻔하기 때문에,기억보존을 위해서 올림 -0-;;

Server 특징:
- client 와 마찬가지로 거의 모든 코드가 session 에 있기 때문에 초 간단.
- listen socket 만든 후에 iocp 에서 사용할 thread 걸어주면서 시작하면 끝.
- accept 가 떨어지면 session 만들고, asynchronous read 걸어주면서 session 으로 모든 권한 넘김.



#pragma once

#ifndef _ASIO_SERVER_H_
#define _ASIO_SERVER_H_

#include "session.h"

class asio_server
{
private:
boost::asio::io_service& io_service_;
tcp::acceptor acceptor_;
boost::thread t_;

void* cb_class_;
cb_packet parse_packet_;

public:
asio_server(boost::asio::io_service& io_service, const tcp::endpoint& endpoint,
void* cb_class, cb_packet parse_packet) :
io_service_(io_service),
acceptor_(io_service, endpoint),
cb_class_(cb_class), parse_packet_(parse_packet)
{
// accept new session
accept_new_session();
}
virtual ~asio_server() {;}

void start()
{
t_ = boost::thread(boost::bind(&boost::asio::io_service::run, &io_service_));
}

void join()
{
if(t_.joinable())
t_.join();
}

void shutdown()
{
join();
io_service_.stop();
}

protected:
void handle_accept(session_ptr s, const boost::system::error_code& error)
{
if(error)
{
cerr << "\n -Error- handle_accept : " << error.message() << "\n";
s->socket().close();
}

tcp::endpoint endpoint = s->socket().remote_endpoint();

cout << "\naccept new session : " <<
endpoint.address().to_string() <<
"(" << endpoint.port() << ")" <<
endl;

// start asynchronous read
s->do_async_read();

// accept new session
accept_new_session();
}

void do_async_accept(session_ptr s)
{
acceptor_.async_accept(s->socket(),
boost::bind(&asio_server::handle_accept,
this,
s,
boost::asio::placeholders::error)
);

cout << "\nwaiting for a client coming" << endl;
}

void accept_new_session()
{
session_ptr new_session(new session(io_service_));
new_session->set_callback(cb_class_, parse_packet_);
do_async_accept(new_session);
}
};

typedef boost::shared_ptr asio_server_ptr;

1 comment:

  1. 아.. 이런 건조한거 말고..

    니가 씽가폴~에 있다는걸 좀 알려~줘...

    ReplyDelete