ACE中的reactor模式學習

2021-06-05 01:01:28 字數 3096 閱讀 8018

這兩天在學習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類,並通過過載其相應會調事件處理函式來實現相應的...