使用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 ...
随机推荐
- MySQL 服务(mysqld)crash
场景: 数据从 10.165.98.190 自建MySQL同步至 阿里云 MongoDB过程中,mysql服务会崩溃,同步数据失败. 原因分析: 经DBA 分析,10.165.98.1 ...
- 关于session_cache_expire 的理解
session_cache_limiter,它是session在客户端的缓存方式,有nocache,private,private_no_expire,publice主这几种. cache是属于浏览器 ...
- C# IEnumerator的详解
迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式.简单来说,迭代器模式使得你能够获取到序列中的所有元素而 ...
- AOP (面向切面编程)
AOP (面向切面编程) 留个参考的地址,还没看呢:http://www.cnblogs.com/zhaolb/p/4875167.html
- gradle 的安装
前言: 我不是一个勤奋好学的人,奔着新技术就跑去尝试学习.但是在工作或者学习的过程中,遇到了的技术,还是得一个坎一个坎的迈过去.把今天遇到的坎变成明天的垫脚石. 想学习一下 spring 的源码,然后 ...
- Java SE 8 并发增强
1.原子值 java5开始,提供了一些原子操作的类,如AtomicInteger.AtomicLong等 这些类提供了诸如incrementAndGet这样的原子操作方法. 单数如果想进行复杂操作,则 ...
- c/c++ 代码中使用sse指令集加速
使用SSE指令,首先要了解这一类用于进行初始化加载数据以及将暂存器的数据保存到内存相关的指令, 我们知道,大多数SSE指令是使用的xmm0到xmm8的暂存器,那么使用之前,就需要将数据从内存加载到这些 ...
- Java多线程——线程范围内共享变量和ThreadLocal
多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. package java_ ...
- window.frames[]在Firefox下无法兼容的解决方式
html代码段: <iframe id="fr" src="ProjectTree.aspx?IsFree=true&f=yes&IsCheckPr ...
- UNIX环境编程学习笔记(28)——多线程编程(三):线程的取消
lienhua342014-11-24 1 取消线程 pthread 提供了pthread_cancel 函数用于请求取消同一进程中的其他线程. #include <pthread.h> ...