1. 程式人生 > 其它 >基於libsmart的網路程式設計示例之EchoServer

基於libsmart的網路程式設計示例之EchoServer

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

#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