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

本文介绍了一个基于ACEReactor框架实现的简单服务端和客户端程序。服务端能够接收客户端连接请求,并通过线程处理客户端发来的数据。客户端则可以连接到服务端并发送消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个简单的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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值