基於libsmart的網路程式設計示例之EchoServer
阿新 • • 發佈:2021-06-01
#include"xsmart.h"
#include"xnet/NetReactor.h"
#include"xbase/xlogger.h"
#include"xbase/xtime.h"
#include"xbase/xthread.h"
classCEchoServer:publicIEventHandler
{
public:
CEchoServer();
virtual~CEchoServer();
public:
voidinit();
voidunInit();
intstartListen(constchar*ip,intport);
protected:
virtualinton_connect(SOCK_FDcli_fd,constchar*remote_ip,intremote_port);
virtualinton_recv_data(SOCK_FDfd,constchar*data,intlen,constchar*remote_ip,intremote_port);
virtualinton_send_ack(SOCK_FDfd,intlen);
virtualinton_close(SOCK_FDfd,interror);
private:
XNetReactorm_net_obj;
};
#include"echoserver.h"
CEchoServer::CEchoServer()
{
}
CEchoServer::~CEchoServer()
{
}
voidCEchoServer::init()
{
m_net_obj.init_reactor(this,XNetReactor::REACTOR_TCP_SERVER,XNetReactor::REACTOR_EPOLL);
}
voidCEchoServer::unInit()
{
m_net_obj.uninit_reactor();
}
intCEchoServer::startListen(constchar*ip,intport)
{
SOCK_FDlistenfd=m_net_obj.open_tcp_server(ip,port);
returnlistenfd;
}
//callback
intCEchoServer::on_connect(SOCK_FDcli_fd,constchar*remote_ip,intremote_port)
{
XLOG_INFO("on_connect(%d,%s,%d)",cli_fd,remote_ip,remote_port);
return0;
}
intCEchoServer::on_recv_data(SOCK_FDfd,constchar*data,intlen,constchar*remote_ip,intremote_port)
{
char*pBuf=newchar[len+1];
pBuf[len]='\0';
memcpy(pBuf,data,len);
smart::XMyTimetm;
XLOG_INFO("remote[%s:%d]-echo[len=%d]->{%s}@%s",remote_ip,remote_port,len,pBuf,tm.format().c_str());
//echotoclient
m_net_obj.send(fd,data,len);
SAFE_DELETE_A(pBuf);
return0;
}
intCEchoServer::on_send_ack(SOCK_FDfd,intlen)
{
return0;
}
intCEchoServer::on_close(SOCK_FDfd,interror)
{
XLOG_INFO("on_close(%d,%d)",fd,error);
return0;
}
#include"echoserver.h"
intmain(intargc,char*argv[])
{
smart::XSmartLib::init();
XLOG_SET_STDERR(true);
CEchoServer*echoService=newCEchoServer();
echoService->init();
echoService->startListen("0.0.0.0",8800);
charc;
do{
c=getchar();
SLEEP_MS(100);
printf("PressqorQtoexit...\n");
}while(c!='q'&&c!='Q');
echoService->unInit();
SAFE_DELETE(echoService);
smart::XSmartLib::unInit();
return0;
}
轉載於:https://my.oschina.net/jackhen/blog/613162