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;
};
// 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;
};