文档章节

smartrpc使用--tcpserver服务

jackhen
 jackhen
发布于 2016/03/21 22:14
字数 369
阅读 15
收藏 0
/************************************************************************/
// 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"
#include <list>

std::list<int> 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<NetBinaryPdu> 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<NetBinaryPdu> 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;
}


© 著作权归作者所有

jackhen
粉丝 2
博文 39
码字总数 13207
作品 0
杭州
后端工程师
私信 提问
jackhen/smartrpc

smartrpc is a multi-threaded C++ rpc library based on the network reactor pattern. It only runs on Linux with kernel verion >= 2.6. https://git.oschina.net/jackhen/smartrpc.git ......

jackhen
2016/09/04
0
0
POCO库中文编程参考指南(8)丰富的Socket编程

POCO库中文编程参考指南(8)丰富的Socket编程 作者:柳大·Poechant 博客:Blog.CSDN.net/Poechant 邮箱:zhongchao.ustc#gmail.com (# -> @) 日期:April 16th, 2012 1 POCO 中的 Socket P...

晨曦之光
2012/04/24
825
0
Muduo网络库源码分析之Acceptor和TcpServer

Acceptor 用于 accept 一个 TCP 连接,accept 接受成功后通知 TCP 连接的使用者。Acceptor 主要是供 TcpServer 使用的,其生命期由后者控制。一个 Acceptor 相当于持有服务端的一个 socket 描...

Tanswer_
2018/01/12
0
0
qmail邮件系统(四)ucspi-tcp的原理和设置

(四)ucspi-tcp的原理和设置。 作者:peng 论坛ID:peng www.chinaunix.net QQ: 螃蟹 16360544 Qmail的开发者dan Bernstein 开发了ucspi-tcp(UNIX客户-服务器程序端口)包来取代inetd程序。...

红薯
2009/05/05
407
0
Nebula3学习笔记(7): 网络系统

Nebula3 的网络子系统提供了基于 TCP 协议的简单 C/S 通信模式 . 它并没有打算做成大厅 , 会话管理还有玩家数据同步的面向游戏的高级通信 . 这些以后会在更高层的 Nebula3 子系统中出现 . 使...

长平狐
2012/11/12
133
0

没有更多内容

加载失败,请刷新页面

加载更多

AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
38分钟前
2
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
5
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
3
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
昨天
3
0
nginx-rtmp-module的缺陷分析(二)

nginx-rtmp-module使用指令push和pull来relay媒体流数据,以便分布式部署服务。 当nginx-rtmp-module作为边缘服务器(一般不会向边缘服务器推流)时,使用pull从源服务器获取媒体流数据,俗称...

YoungSagit
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部