ace 客户端&服务器端(c++)

本文详细介绍了使用C++实现服务器与客户端之间的通信,包括服务器端的启动、连接处理及数据收发,以及客户端如何连接服务器并接收处理响应。

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

res:http://mavlarn.iteye.com/blog/987598


server:

// ace_frame_classImpl.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <process.h> 
 
#include <ace/ace.h>  
#include <ace/os.h> 
#include <ace/Svc_Handler.h>
#include <ace/Acceptor.h>
#include <ace/SOCK_Acceptor.h> 

#include<ace/log_msg.h> 
#include <ace/SOCK_Stream.h>  
#include <ace/INET_Addr.h> 


#pragma comment(lib,"aced.lib")

using namespace std;


class Server_svc_handler : public ACE_Svc_Handler <ACE_SOCK_STREAM,ACE_NULL_SYNCH>
{
public:
	Server_svc_handler()
	{
		data= new char[DATA_SIZE];
	}
	int open(void*)
	{
		ACE_DEBUG((LM_DEBUG, "%P|%t, %s", " Connection established.\n")); //打印debug级别的log,%P%t表示进程号和线程号,%s是要打印的消息。
		ACE_Reactor::instance()->register_handler(this,	ACE_Event_Handler::READ_MASK); //注册socket上可读事件的处理器,当当前的socket上有可读事件时,就会触发这个handler的handle_input方法。
		char* msg = "Client connected successfully in server.";
		peer().send(msg, strlen(msg));
		return 0;
	}

	int handle_input(ACE_HANDLE)
	{
		ssize_t cnt = peer().recv(data, DATA_SIZE);
		if (cnt <= 0)
		{
			//ACE_DEBUG((LM_WARN, "No data received.\n")); //打印warn级别日志
			cout<<"No data received"<<endl;
		}
		else
		{
			ACE_DEBUG((LM_DEBUG, "%s", data));
			//在这里添加具体业务处理代码
			char* msg = "Request is processed successfully";
			peer().send(msg, strlen(msg));
		}
		return 0;
	}

private:
	char* data;
	static const int DATA_SIZE = 64;
};
typedef ACE_Acceptor<Server_svc_handler, ACE_SOCK_ACCEPTOR> ServerAcceptor;


int main(int argc, char* argv[])
{
	ACE_DEBUG((LM_DEBUG,"Test server running...\n"));
	const int PORT_NUM = 12345;
	ACE_INET_Addr addr(PORT_NUM);
	ServerAcceptor acceptor(addr, ACE_Reactor::instance());
	ACE_Reactor::run_event_loop(); //会一直不停的监听注册的事件。
	return 0;
};


client:

// ace_frame_client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <process.h> 

#include <ace/ace.h>  
#include <ace/os.h> 
#include <ace/Svc_Handler.h>
#include <ace/Acceptor.h>
#include <ace/SOCK_Acceptor.h> 
#include <ace/Connector.h>
#include <ace/SOCK_Connector.h>

#include<ace/log_msg.h> 
#include <ace/SOCK_Stream.h>  
#include <ace/INET_Addr.h> 


#pragma comment(lib,"aced.lib")

using namespace std;

class Agent_svc_handler : public ACE_Svc_Handler <ACE_SOCK_STREAM, ACE_NULL_SYNCH>
{
public:
	Agent_svc_handler()
	{
		data= new char[DATA_SIZE];
	}
	int handle_input(ACE_HANDLE)
	{
		peer().recv(data, DATA_SIZE);
		ACE_DEBUG((LM_DEBUG, "%s", data));
		return 0;
	}
private:
	char* data;
	static const int DATA_SIZE = 64;
};
typedef ACE_Connector<Agent_svc_handler, ACE_SOCK_CONNECTOR> ClientConnector;
int main(int argc, char* argv[])
{
	const int SERVER_PORT_NUM = 12345;
	ACE_INET_Addr remoteAddr(SERVER_PORT_NUM, "localhost");
	ClientConnector connector;
	Agent_svc_handler *handler= new Agent_svc_handler;
	if(connector.connect(handler, remoteAddr) == -1 )
	{
		//ACE_ERROR(LM_ERROR, "%P|%t, %s", "Connection failed");
		cout<<"Connection failed"<<endl;
	}
	ACE_Reactor::run_event_loop();
	return 0;
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值