一个简单的ACE Reactor框架的使用
2014-10-23 20:01
501 查看
一个简单的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; }
相关文章推荐
- 使用JSP连接ORACLE数据库做的一个简单登录框架
- AjaxPro框架使用整理(一) 一个简单的异步交互页面
- 使用Python的Bottle框架写一个简单的服务接口的示例
- 使用TestBean框架开发一个简单的sampler插件
- 使用idea搭建一个简单的SSM框架:(1)使用idea创建maven项目
- 使用PostSharp进行AOP框架设计:一个简单的原型
- 一个使用面向对象方式编写的简单游戏框架
- 使用react-native做一个简单的应用-04界面主框架
- 使用Python的Twisted框架实现一个简单的服务器
- 【远程调用框架】如何实现一个简单的RPC框架(二)实现与使用
- 使用ACE构建一个简单的客户端
- 一个超级简单的HTML模板框架源代码以及使用示例
- 一个MDI窗口框架,可作为简单的MIS窗口框架使用
- 自己动手写一个简单的IOC框架,使用注解绑定资源和事件
- 一个使用监听器模式实现的J2ME网络编程框架,包括一个简单的登录功能实现(含源代码)
- ACE Reactor框架使用实例-大量代码
- Xqk.Data数据框架使用说明之:一个简单的示例
- 使用CXF框架实现webservice的一个简单例子
- 一个简单的使用EVP框架的加密过程
- WPF中使用MVVM创建一个简单的框架