/************************************************************************/// Copyright (C) 2016, han_gangbiao. All rights reserved.// Use of this source code is governed by a GPL-v2 license that can be found in the License file.// // [Time]: 2016-1-4 21:53:17// [Author]: han_gangbiao [http://my.oschina.net/jackhen]// [Info]: /************************************************************************/// smartrpc/test/tcpserver/tcpserver.cpp#include "net/net_reactor.h"#include "protocol/net_binary_decoder.h"#include "base/xthread.h"#includestd::list g_list_conns;net_reactor_t g_reactor_engine;class TcpServer : public IEvent_handler, public IBinaryDecoderListener{public: TcpServer() : m_decoder(this) { } virtual ~TcpServer() { } protected: virtual int on_connect( SOCK_FD listen_fd, SOCK_FD cli_fd, const char* remote_ip, int remote_port ); virtual int on_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 ); virtual int onPDU( int fd, smart::ref_ptr
pdu ); virtual int onError( int fd, BinaryDecoderError_t err );private: NetBinaryDecoder m_decoder;};int TcpServer::on_connect( SOCK_FD listen_fd, SOCK_FD cli_fd, const char* remote_ip, int remote_port ){ printf("on_connect listen_fd=%d, cli_fd=%d, remote_ip[%s], remote_port[%d]\n", listen_fd, cli_fd, remote_ip, remote_port); g_list_conns.push_back(cli_fd); return 0;}int TcpServer::on_data( SOCK_FD fd, const char* data, int len, const char* remote_ip, int remote_port ){ //printf("on_data fd=%d, data=[%s], len=[%d], remote_ip[%s], remote_port[%d]\n", fd, data, len, remote_ip, remote_port); //g_reactor_engine.send(fd, data, len); m_decoder.Parse(fd, data, len); return 0;}int TcpServer::on_send_ack( SOCK_FD fd, int len ){ //printf("on_send_ack fd=%d, len=[%d]\n", fd, len); return 0;}int TcpServer::on_close( SOCK_FD fd, int error ){ printf("on_close fd=%d, error=%d\n", fd, error); return 0;}int TcpServer::onPDU( int fd, smart::ref_ptr pdu ){// printf("onPDU\n"); pdu->toStream(); g_reactor_engine.send(fd, pdu->getBinaryStream(), pdu->getBinaryStreamLength()); return 0;}int TcpServer::onError( int fd, BinaryDecoderError_t err ){ printf("onError fd=%d, err=%d\n", fd, err); return 0;}char my_getch(){ char ch; ch = getchar(); SLEEP_MS(100); return ch;}int main(int argc, char* argv[]){ TcpServer* tcpserver = new TcpServer(); g_reactor_engine.init_reactor(tcpserver, 4); SOCK_FD listenfd = g_reactor_engine.open_tcp_server("0.0.0.0", 8800); if(listenfd > 0) { printf("start tcpserver listen at[0.0.0.0:8800], listenfd=%d\n", listenfd); } else { printf("tcpserver failed listen at[0.0.0.0:8800]\n"); } char c; do { c = my_getch(); printf("Press q or Q to exit...\n"); } while(c!='q' && c!='Q'); g_reactor_engine.close_fd(listenfd); g_reactor_engine.uninit_reactor(); SAFE_DELETE(tcpserver); return 0;}