使用kendynet编写网关服务
网游服务器大多提供了网关服务,用于作为用户和内部服务器组之间通信代理.网关服务一方面将用户消息从客户端分发到正确的内部服务器.
另一方面将来自内部服务器的数据包转发给客户端.一般对于网关应用来说,压力最大的就是广播服务。一个用户的在游戏中产生的行为消息
可能要广播给周数百个能看得见他的其它玩家.下面用kendynet编写一个简单的网关服务,当然这只是一个示例程序,它只是简单的把来自一
连接的数据发往另一个连接.真实网络游戏中的网关服务要复杂得多.
首先介绍一下基本设计,
static msgdisp_t disp_to_server;
static msgdisp_t disp_to_client;
sock_ident to_server;
首先定义两个消息处理器,一个用户处理来自用的消息,一个用于处理来自内部服务器的消息.
然后是一个sock_ident,用于表示与内部服务器的连接.
接着在main函数中:
asynnet_t asynet = asynnet_new();//3个poller,1个用于监听,1个用于处理客户端连接,1个用于处理服务器连接
msgdisp_t disp_to_server = new_msgdisp(asynet,
to_server_connect,
to_server_connected,
NULL,
to_server_process,
NULL); msgdisp_t disp_to_client = new_msgdisp(asynet,
to_client_connect,
NULL,
NULL,
to_client_process,
NULL); thread_t service1 = create_thread(THREAD_JOINABLE);
thread_t service2 = create_thread(THREAD_JOINABLE); to_client_ip = argv[];
to_client_port = atoi(argv[]); to_server_ip = argv[];
to_server_port = atoi(argv[]); thread_start_run(service1,service_toserver,(void*)disp_to_server);
sleepms();
thread_start_run(service2,service_toclient,(void*)disp_to_client);
先创建一个异步网络引擎,传入参数3,表示创建3个poller,其中第1个用于处理监听套接口,第2个用于处于与内部服务器
的连接,第3个用户处理和客户端的连接.
接着用不同的消息回调函数创建两个消息服务.
最后创建两个单独的线程分别运行两个消息服务.
接着再来看一下回调服务的处理:
void to_server_connected(msgdisp_t disp,sock_ident sock,const char *ip,int32_t port,uint32_t err)
{
to_server = sock;
} int32_t to_client_process(msgdisp_t disp,sock_ident sock,rpacket_t rpk)
{
if(!eq_sockident(sock,to_server)){
//from cliet,send to server
push_msg(disp_to_server,(msg_t)rpk);
}else
{
//from server,send to client
sock_ident client = read_from_rpacket(rpk);
asyn_send(client,wpk_create_by_other((struct packet*)rpk));
}
return ;
} void to_client_connect(msgdisp_t disp,sock_ident sock,const char *ip,int32_t port)
{
//用第3个poller处理到客户端的连接
disp->bind(disp,,sock,,*,);
} int32_t to_server_process(msgdisp_t disp,sock_ident sock,rpacket_t rpk)
{
if(!eq_sockident(sock,to_server)){
//from cliet,send to server
asyn_send(to_server,wpk_create_by_other((struct packet*)rpk));
}else{
//from server,send to client
push_msg(disp_to_client,(msg_t)rpk);
}
return ;
} void to_server_connect(msgdisp_t disp,sock_ident sock,const char *ip,int32_t port)
{
//用第二个poller处理到服务器的连接
disp->bind(disp,,sock,,*,);
}
首先注意两个connect回调,对于server绑定到2号poller,对于client绑定到3号poller.
然后再看两个process函数.对于client的process函数来说,如果发现发包的套接口不是to_server,就将数据包
投递给disp_to_server,由disp_to_server将这个数据包发送给内部服务.如果发现数据包是来自to_server,
那么就从数据包中读出发送目标,然后将数据包发送给目标客户端.
server的process函数则正好相反,将来自to_server的消息投递给disp_to_client.将来自客户端的消息从to_server
发送出去.一个简单的消息转发服务就这样实现了。
完整的示例程序可以参看:
https://github.com/sniperHW/luanet/blob/master/kendynet/test/gateservice.c
使用kendynet编写网关服务的更多相关文章
- Spring Cloud 网关服务 zuul 二
有一点上篇文章忘了 讲述,nacos的加载优先级别最高.服务启动优先拉去配置信息.所以上一篇服务搭建我没有讲述在nacos 中心创建的配置文件 可以看到服务端口和注册中心都在配置文件中配置化 属性信息 ...
- Spring Cloud API网关服务 5.2
为什么需要API网关 通过前面内容的学习,我们已经可以构建一个简单的微服务架构系统.这个系统可以使用Spring Boot实现微服务的开发,使用Spring Cloud Eureka实现注册中心以及服 ...
- 阿里云DMS发布数据库网关服务: 打通网络限制 开启数据库统一管理的万能钥匙
概述 阿里云数据管理DMS在云端可提供专业的数据库服务,除对标本地数据库软件的基础功能外,还包含性能诊断.数据追踪.跨实例SQL查询(含异构数据库类型之间)等专业性功能,同时提供审计安全和企业级数据库 ...
- 网关服务Kong和konga介绍安装使用教程
介绍 Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用.易扩展的,由Mashape公司开源的API Gateway项目.Kong是基于NGINX和Apache Cassa ...
- 一个网关服务性能问题的Dump分析
本篇文章分为三部分,首先简单介绍一下分析的工具Windbg,其次针对一个网关服务性能问题进行逐步刨析,最后针对性能问题的分析总结. 一 Windbg介绍 1.Windbg是个非常强大的调试器,它设计了 ...
- C#编写window服务,一步一步(1)
Window服务是啥,这里就不废话了,如何用在哪里用也不废话了,这里我这篇文章只是详述了我在vs2012中创建window服务的经过,希望对你有所帮助. 另外:我在编写服务过程中参考了 Profess ...
- C#编写windows服务
项目要求: 数据库用有一张表,存放待下载文件的地址,服务需要轮训表将未下载的文件下载下来. 表结构如下: 过程: VS--文件-->新建项目-->windows-->windows服 ...
- 在python中编写socket服务端模块(二):使用poll或epoll
在linux上编写socket服务端程序一般可以用select.poll.epoll三种方式,本文主要介绍使用poll和epoll编写socket服务端模块. 使用poll方式的服务器端程序代码: i ...
- 编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法
原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Con ...
随机推荐
- 看视频 shell入门视频补充的 shell脚本基本知识(TMD有点乱)
命令的组合: 1. 多个命令的顺序分隔: 1. 顺序分隔,使用 ; 顺序执行; 2. 逻辑与分隔, 使用 && , 一旦前面的命令执行失败,后面的命令就不会执行; ...
- 第三百八十二节,Django+Xadmin打造上线标准的在线教育平台—xadmin管理员详情页面布局,导航图标设置
第三百八十二节,Django+Xadmin打造上线标准的在线教育平台—xadmin进阶 1.后台管理员详情页面布局 后台管理员详情页面,区块是可以拖动的,而且分为了很多个区块 这个页面的布局在xadm ...
- (转)并行编译 Xoreax IncrediBuild
出自:http://blog.csdn.net/yockie/article/details/16867457 以前完全没有接触过分布式编译,今天因工作需要尝试了一下,绝对很强大,体验也非常好,绝对让 ...
- Git -- 从远程库克隆
上次我们讲了先有本地库,后有远程库的时候,如何关联远程库. 现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆. 首先,登陆GitHub,创建一个新的仓库,名字叫gitskill ...
- Linux set unset命令
Linux unset命令: 功能说明:unset是一个内建的Unix shell命令,在Bourne shell家族(sh.ksh.bash等)和C shell家族(csh.tcsh等)都有实现. ...
- Java注解Annotation学习笔记
一.自定义注解 1. 使用关键字 @interface 2. 默认情况下,注解可以修饰 类.方法.接口等. 3. 如下为一个基本的注解例子: //注解中的成员变量非常像定义接口 public @int ...
- Spring集成线程池
自己在程序中手动New很容易造成线程滥用,创建线程也是比较消耗资源的操作,所以建议如果有此需求,将线程池统一交给Spring框架进行管理. 如下: <!--Spring 集成线程池,不允许自己开 ...
- CentOS系统很卡的基本排查方法
来源:http://www.centoscn.com/CentOS/Intermediate/2017/1012/9032.html 一. 查看内存使用情况 1. free命令可查看内存使用情况 2 ...
- Redis锁的简单应用
本文版权归博客园和作者本人吴双共同所有 .转载爬虫请注明地址,博客园蜗牛 http://www.cnblogs.com/tdws/p/5712835.html 蜗牛Redis系列文章目录http:// ...
- js sendBeacon
页面性能日志: DNS解析耗时 TCP链接耗时 SSL安全链接耗时 网络请求耗时 DOM解析耗时 资源加载耗时 首包时间 白屏时间 首次可交换时间 Dom Ready时间 页面完全加载时间. 如某些统 ...