您的位置:首页 > Web前端 > React

一个简单的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: