基于libsmart的网络编程示例之EchoServer

#include "xsmart.h"
#include "xnet/NetReactor.h"
#include "xbase/xlogger.h"
#include "xbase/xtime.h"
#include "xbase/xthread.h"

class CEchoServer : public IEventHandler
{
public:
	CEchoServer();
	virtual ~CEchoServer();

public:
	void init();
	void unInit();

	int startListen(const char* ip, int port);

protected:
	virtual int on_connect(SOCK_FD cli_fd, const char* remote_ip, int remote_port);
	virtual int on_recv_data(SOCK_FD fd, const char* data, int len, const char* remote_ip, int remote_port);
	virtual int on_send_ack(SOCK_FD fd, int len);
	virtual int on_close(SOCK_FD fd, int error);

private:
	XNetReactor m_net_obj;
};

#include "echoserver.h"

CEchoServer::CEchoServer()
{
}

CEchoServer::~CEchoServer()
{
}

void CEchoServer::init()
{
	m_net_obj.init_reactor(this, XNetReactor::REACTOR_TCP_SERVER, XNetReactor::REACTOR_EPOLL);
}

void CEchoServer::unInit()
{
	m_net_obj.uninit_reactor();
}

int CEchoServer::startListen(const char* ip, int port)
{
	SOCK_FD listenfd = m_net_obj.open_tcp_server(ip, port);
	return listenfd;
}


//callback
int CEchoServer::on_connect(SOCK_FD cli_fd, const char* remote_ip, int remote_port)
{
	XLOG_INFO("on_connect(%d, %s, %d)", cli_fd, remote_ip, remote_port);
	return 0;
}

int CEchoServer::on_recv_data(SOCK_FD fd, const char* data, int len, const char* remote_ip, int remote_port)
{
	char* pBuf = new char[len+1];
	pBuf[len] = '\0';
	memcpy(pBuf, data, len);

	smart::XMyTime tm;
	XLOG_INFO("remote[%s:%d]-echo[len=%d]->{%s} @%s", remote_ip, remote_port, len, pBuf, tm.format().c_str());

	//echo to client
	m_net_obj.send(fd, data, len);

	SAFE_DELETE_A(pBuf);
	return 0;
}

int CEchoServer::on_send_ack(SOCK_FD fd, int len)
{
	return 0;
}

int CEchoServer::on_close(SOCK_FD fd, int error)
{
	XLOG_INFO("on_close(%d, %d)", fd, error);
	return 0;
}

#include "echoserver.h"

int main(int argc, char* argv[])
{
	smart::XSmartLib::init();
	XLOG_SET_STDERR(true);

	CEchoServer* echoService = new CEchoServer();
	echoService->init();

	echoService->startListen("0.0.0.0", 8800);

	char c;
	do {
		c = getchar();
		SLEEP_MS(100);

		printf("Press q or Q to exit...\n");
	}while(c!='q' && c!='Q');
	
	echoService->unInit();
	SAFE_DELETE(echoService);
	smart::XSmartLib::unInit();
	return 0;
}




你可能感兴趣的:(EchoServer)