网游服务器大多提供了网关服务,用于作为用户和内部服务器组之间通信代理.网关服务一方面将用户消息从客户端分发到正确的内部服务器.

另一方面将来自内部服务器的数据包转发给客户端.一般对于网关应用来说,压力最大的就是广播服务。一个用户的在游戏中产生的行为消息

可能要广播给周数百个能看得见他的其它玩家.下面用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编写网关服务的更多相关文章

  1. Spring Cloud 网关服务 zuul 二

    有一点上篇文章忘了 讲述,nacos的加载优先级别最高.服务启动优先拉去配置信息.所以上一篇服务搭建我没有讲述在nacos 中心创建的配置文件 可以看到服务端口和注册中心都在配置文件中配置化 属性信息 ...

  2. Spring Cloud API网关服务 5.2

    为什么需要API网关 通过前面内容的学习,我们已经可以构建一个简单的微服务架构系统.这个系统可以使用Spring Boot实现微服务的开发,使用Spring Cloud Eureka实现注册中心以及服 ...

  3. 阿里云DMS发布数据库网关服务: 打通网络限制 开启数据库统一管理的万能钥匙

    概述 阿里云数据管理DMS在云端可提供专业的数据库服务,除对标本地数据库软件的基础功能外,还包含性能诊断.数据追踪.跨实例SQL查询(含异构数据库类型之间)等专业性功能,同时提供审计安全和企业级数据库 ...

  4. 网关服务Kong和konga介绍安装使用教程

    介绍 Kong是一款基于OpenResty(Nginx + Lua模块)编写的高可用.易扩展的,由Mashape公司开源的API Gateway项目.Kong是基于NGINX和Apache Cassa ...

  5. 一个网关服务性能问题的Dump分析

    本篇文章分为三部分,首先简单介绍一下分析的工具Windbg,其次针对一个网关服务性能问题进行逐步刨析,最后针对性能问题的分析总结. 一 Windbg介绍 1.Windbg是个非常强大的调试器,它设计了 ...

  6. C#编写window服务,一步一步(1)

    Window服务是啥,这里就不废话了,如何用在哪里用也不废话了,这里我这篇文章只是详述了我在vs2012中创建window服务的经过,希望对你有所帮助. 另外:我在编写服务过程中参考了 Profess ...

  7. C#编写windows服务

    项目要求: 数据库用有一张表,存放待下载文件的地址,服务需要轮训表将未下载的文件下载下来. 表结构如下: 过程: VS--文件-->新建项目-->windows-->windows服 ...

  8. 在python中编写socket服务端模块(二):使用poll或epoll

    在linux上编写socket服务端程序一般可以用select.poll.epoll三种方式,本文主要介绍使用poll和epoll编写socket服务端模块. 使用poll方式的服务器端程序代码: i ...

  9. 编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法

    原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Con ...

随机推荐

  1. 第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍

    第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍 Requests请求 Requests请求就是我们在爬虫文件写的Requests() ...

  2. Microsoft Jet 数据库引擎打不开文件,它已经被别的用户以独占方式打开,或没有查看数据的权限。

    System.Data.OleDb.OleDbException (0x80004005): Microsoft Jet 数据库引擎打不开文件'D:\wwwroot\gonghouxie\wwwroo ...

  3. Java处理JSON的工具类(List、Map和JSON之间的转换)——依赖jsonlib支持Map嵌套

    原文链接:http://www.itjhwd.com/java_json/ 代码 package com.itjh.mmp.util; import java.io.BufferedReader; i ...

  4. HTTP 错误 500.19 配置文件错误 ( 0x8007000d,0x80070032)

    HTTP 错误 500.19 - Internal Server Error无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息模块 IIS Web Core 通知 未知 处理程序 尚未确定 ...

  5. IDEA VS 快捷键 大全

    [参考]IntelliJ IDEA 常用 黄金 快捷键  总结 不断更新     一.VS常用快捷键 (01).快速插入foreach.try等循环:Tab + Tab; (02).回到光标前一位置: ...

  6. YII2常用数据库操作

    //1.简单查询 $admin=Admin::model()->findAll($condition,$params); $admin=Admin::model()->findAll(&q ...

  7. 《C程序猿从校园到职场》带领大家从校园走向职场

    七夕节刚过.就有好消息传来:本人新书<C程序猿从校园到职场>正式出版并在各大电商平台上发售了! 以下.让我们一起来赞赏一下纸质书的"风採"吧. 本书文件夹 第1章 概述 ...

  8. ClientScript.GetCallbackEventReference实现局部刷新

    使用ClientScript.GetCallbackEventReference实现局部刷新是.NET支持的一种前后台代码调用的方式:其实实现局部刷新这样方式有很多种,最经典也常用的莫过于jQuery ...

  9. 基于maven使用IDEA创建多模块项目

    原文地址:http://blog.csdn.net/williamhappy/article/details/54376855 鉴于最近学习一个分布式项目的开发,讲一下关于使用IntelliJ IDE ...

  10. iview 下拉刷新loadTop报错解决

    <div class="noData" v-if="lifeList.length==0"> <img src="../assets ...