一个简单的ACE Reactor框架的使用

来源:互联网 发布:java流程图不包括 编辑:程序博客网 时间:2024/05/17 22:53

一个简单的ACE Reactor框架的使用

服务端:
#include "iostream"#include "ace\OS_NS_unistd.h"#include "ace\INET_Addr.h"#include "ace\SOCK_Stream.h"#include "ace\SOCK_Acceptor.h"#include "ace\Event_Handler.h"#include "ace\Reactor.h"#include "ace\Thread_Manager.h"using namespace std;class Server : public ACE_Event_Handler{public:Server(ACE_Reactor *reactor);int Open(const char *ip, int port);virtual int handle_input(ACE_HANDLE fd = ACE_INVALID_HANDLE);virtual int handle_close(ACE_HANDLE handle, ACE_Reactor_Mask close_mask);protected:~Server(){}private:ACE_SOCK_Acceptor acceptor;ACE_Thread_Manager threadManager;};class ClientHandle : public ACE_Event_Handler{public:ClientHandle(ACE_HANDLE handle, ACE_Reactor *re);virtual int handle_input(ACE_HANDLE fd = ACE_INVALID_HANDLE);virtual int handle_close(ACE_HANDLE handle, ACE_Reactor_Mask close_mask);ACE_SOCK_Stream &GetSockStream(){ return stream; }protected:~ClientHandle(){}private:ACE_SOCK_Stream stream;};ACE_THR_FUNC_RETURN ClientThread(void *param);int main(int argc, char *argv[]){Server *server = new Server(ACE_Reactor::instance());server->Open("192.168.60.65", 9000);// 启动消息循环ACE_Reactor::instance()->run_event_loop();return 0;}Server::Server(ACE_Reactor *reactor):ACE_Event_Handler(reactor){}int Server::Open(const char *ip, int port){ACE_INET_Addr addr(port, ip);if (acceptor.open(addr) < 0){return -1;}// 注册接收客户端连接消息return reactor()->register_handler(acceptor.get_handle(), this, ACE_Event_Handler::ACCEPT_MASK);}int Server::handle_input(ACE_HANDLE fd){if (fd != acceptor.get_handle()){return -1;}ACE_SOCK_Stream stream;if (acceptor.accept(stream) < 0){return -1;}ClientHandle *clientHandle = new ClientHandle(stream.get_handle(), reactor());threadManager.spawn(ClientThread, clientHandle);return 0;}int Server::handle_close(ACE_HANDLE handle, ACE_Reactor_Mask close_mask){acceptor.close();delete this;return 0;}ClientHandle::ClientHandle(ACE_HANDLE handle, ACE_Reactor *re){stream.set_handle(handle);reactor(re);}int ClientHandle::handle_input(ACE_HANDLE fd){if (stream.get_handle() != fd){return -1;}char buf[1024] = { 0 };if (stream.recv(buf, 1024) <= 0){return -1;}cout << "Client:" << buf << endl;return 0;}int ClientHandle::handle_close(ACE_HANDLE handle, ACE_Reactor_Mask close_mask){stream.send("bye client", strlen("bye client"));stream.close();delete this;return 0;}ACE_THR_FUNC_RETURN ClientThread(void *param){ClientHandle *clientHandle = (ClientHandle *)param;clientHandle->reactor()->register_handler(clientHandle->GetSockStream().get_handle(), clientHandle, ACE_Event_Handler::READ_MASK);ACE_OS::sleep(2);clientHandle->GetSockStream().send("hello client", strlen("hello client"));ACE_OS::sleep(2);clientHandle->reactor()->remove_handler(clientHandle->GetSockStream().get_handle(), ACE_Event_Handler::READ_MASK);ACE_OS::sleep(2);return 0;}

客户端:
#include "iostream"#include "ace\INET_Addr.h"#include "ace\SOCK_Stream.h"#include "ace\SOCK_Connector.h"#include "ace\Reactor.h"using namespace std;class Client : public ACE_Event_Handler{public:Client(ACE_Reactor *reactor);virtual int handle_input(ACE_HANDLE fd = ACE_INVALID_HANDLE);virtual int handle_close(ACE_HANDLE handle, ACE_Reactor_Mask close_mask);int Connect(char *ip, int port);int Send(char *buf, int len);protected:~Client(){}private:ACE_SOCK_Stream stream;ACE_SOCK_Connector connector;};int main(int argv, char *argc[]){Client *client = new Client(ACE_Reactor::instance());if (client->Connect("192.168.60.65", 9000) < 0){return 0;}client->Send("hello server", strlen("hello server"));// 启动消息循环ACE_Reactor::instance()->run_event_loop();return 0;}Client::Client(ACE_Reactor *reactor):ACE_Event_Handler(reactor){}int Client::Connect(char *ip, int port){ACE_INET_Addr addr(port, ip);// 连接服务if (connector.connect(stream, addr) < 0){return -1;}// 注册读事件reactor()->register_handler(stream.get_handle(), this, ACE_Event_Handler::READ_MASK);return 0;}int Client::Send(char *buf, int len){return stream.send(buf, len);}int Client::handle_input(ACE_HANDLE fd){char buf[1024] = { 0 };if (stream.recv(buf, 1024) <= 0){return -1;}cout << "Server:" << buf << endl;return 0;}int Client::handle_close(ACE_HANDLE handle, ACE_Reactor_Mask close_mask){stream.close();delete this;return 0;}


0 0
原创粉丝点击