這兩天在學習c++網路程式設計卷二,第二章開始講到reactor模式,這兩天結合書上的例子,寫了個簡單的echo server端程式,**如下:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include const u_short listen_port = 8001;
#include "test_fwd.h"
class echoeventhandler : public ace_event_handler
// 在析構時做remove_handler時 會自己去呼叫handle_close()
virtual ~echoeventhandler() }
void close()
virtual int open()
is_ok_ = true;
// 同步當前時間
last_proc_time_ = ace_os::gettimeofday();
// 註冊定時器
ace_time_value reschedule(timeout_time_.sec() / 4);
timer_id_ = reactor()->schedule_timer(
this, // timer event handler, should implement virtual function handle_timeout
0, // handle_timeout() callback args
timeout_time_, // delay time
reschedule); // schedule interval
if (timer_id_ < 0)
// 測試退出的流程
return -1;
return 0;
} bool is_opened()
virtual int handle_input(ace_handle handle = ace_invalid_handle)
else if (0 == recvlen)
ace_debug((lm_error, "recv buffer(%d):%s\n", recvlen, recvbuf));
ssize_t sendlen = peer().send_n(recvbuf, recvlen);
if (sendlen != recvlen)
return 0;
} // 當handle_*方法返回-1時,會自動呼叫handle_close方法
virtual int handle_close(ace_handle handle = ace_invalid_handle,
ace_reactor_mask mask = 0)
else
peer_.close();
return 0;
} // 超時處理
virtual int handle_timeout(const ace_time_value& current_time,
const void* act = 0)
return 0;
} virtual ace_handle get_handle() const
ace_sock_stream& peer()
private:
ace_sock_stream peer_;
ace_time_value last_proc_time_;
ace_time_value timeout_time_;
long timer_id_;
bool is_ok_;
};// event_handler 包含乙個ace_reactor
class echoacceptor : public ace_event_handler
virtual ~echoacceptor()
virtual int open(const ace_inet_addr& local)
// 註冊自己為反應器的accpet處理事件
reactor()->register_handler(this, ace_event_handler::accept_mask);
ace_debug((lm_error, "server[%s:%d] listening...\n", local.get_host_addr(), local.get_port_number()));
return 0;
} // 相應accept事件,作為乙個工廠,生成echoeventhandler物件
virtual int handle_input(ace_handle handle = ace_invalid_handle)
if (0 != echo_hanndle->open())
return 0;
} virtual int handle_close(ace_handle handle = ace_invalid_handle,
ace_reactor_mask close_mask = 0)
virtual ace_handle get_handle() const
// ace_sock_stream工廠
ace_sock_acceptor acceptor_;
private:
ace_time_value conn_timeout_;
};int ace_tmain(int argc, ace_tchar* argv)
ace_debug((lm_error, "event loop end.\n"));
delete echosvr;
return 0;
}
ACE反應器 Reactor 模式 3
在伺服器端使用reactor框架 使用reactor框架的伺服器端結構如下 伺服器端註冊兩種事件處理器,clientacceptor和clientservice clientservice類負責和客戶端的通訊,每乙個clientservice物件對應乙個客戶端的socket連線。clientacce...
ACE反應器 Reactor 模式 4
定時器的實現 通過reactor機制,還可以很容易的實現定時器的功能,使用方式如下。編寫乙個事件反應器,過載 handle timeout 方法,該方法是定時器的觸發時間到時,會自動觸發該方法。通過reactor的 schedule timer 方法註冊定時器。啟動reacotr的 handle e...
ACE反應器 Reactor 模式 2
在socket程式設計中,常見的事件就是 讀就緒 寫就緒 通過對這兩個事件的捕獲分發,可以實現socket中的非同步操作。socket程式設計中的事件處理器 在前面我們已經介紹過,在ace反應器框架中,任何都必須派生自ace event handler類,並通過過載其相應會調事件處理函式來實現相應的...