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