使用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 ...
随机推荐
- [ACM] POJ 1611 The Suspects (并查集,输出第i个人所在集合的总人数)
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 21586 Accepted: 10456 De ...
- Type cvc-complex-type.2.4.c: The matching wildcard is strict...
这个问题困扰了我两次,分别说一下原因:1. 如网上一些网友所言,是在配置Spring的标签库的时候有拼写错误或者遗漏.下面贴一个标准3.0的吧: <?xml version="1.0& ...
- UISegmentedControl: 增加代理方法
UISegmentedControl 没有代理方法可以设置,不能在选择之前做预处理.为此,重写了 UISegmentedControl 创建文件 RFSegmentedControl,继承自 UISe ...
- 移动端H5地图离线瓦片方案(1)(2)
2在作者另一篇 移动端H5地图离线瓦片方案 文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 移动端的网速和 ...
- XCODE 添加不同IOS版本的模拟器
一.XCode->Preferences->Downloads, 可以下载模拟器.
- 【WP8】自定义配置存储类
之前在WP7升级到WP8的时候遇到配置不兼容的问题 情景:之前只有一个WP7版本,现在需要发布WP8版本,让用户可以从原来的WP7版本升级到WP8版本 一般情况下从WP7升级到WP8没什么问题 但是在 ...
- what's the help of "unnecessary" pointer comparison
引述自http://c-programming.itags.org/q_c-programming-language_191518.html 源代码中的宏min中使用了 (void) (&_x ...
- SSM框架快速整合实例——学生查询
一.快速准备 SSM 框架即 Spring 框架.SpringMVC 框架.MyBatis 框架,关于这几个框架的基础和入门程序,我前面已经写过几篇文章作为基础和入门介绍了.这里再简单的介绍一下: 1 ...
- 【机翻】Deep Plug-and-Play Super-Resolution for Arbitrary
论文 (PDF) Deep Plug-and-Play Super-Resolution for Arbitrary Blur Kernels https://www.researchgate.net ...
- QT运行出错:QObject::connect: Parentheses expected以及QObject::connect: No such slot ***
我在QGraphicsScene子类中添加了item的弹出菜单,并连接Action到槽函数,结果槽函数不起作用,输出:QObject::connect: No such slot *** C++ C ...