知识大全 使用kendynet编写网关服务
Posted 消息
篇首语:有上不去的天,没过不去的关。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用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( );// 个poller 个用于监听 个用于处理客户端连接 个用于处理服务器连接 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 service = create_thread(THREAD_JOINABLE); thread_t service = 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(service service_toserver (void*)disp_to_server); sleepms( ); thread_start_run(service service_toclient (void*)disp_to_client);
先创建一个异步网络引擎 传入参数 表示创建 个poller 其中第 个用于处理监听套接口 第 个用于处于与内部服务器
的连接 第 个用户处理和客户端的连接
接着用不同的消息回调函数创建两个消息服务
最后创建两个单独的线程分别运行两个消息服务
接着再来看一下回调服务的处理:
void to_server_connected(msgdisp_t disp sock_ident sock const char *ip int _t port uint _t err) to_server = sock; int _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 int _t port) //用第 个poller处理到客户端的连接 disp >bind(disp sock * ); int _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 int _t port) //用第二个poller处理到服务器的连接 disp >bind(disp sock * );
首先注意两个connect回调 对于server绑定到 号poller 对于client绑定到 号poller
然后再看两个process函数 对于client的process函数来说 如果发现发包的套接口不是to_server 就将数据包
投递给disp_to_server 由disp_to_server将这个数据包发送给内部服务 如果发现数据包是来自to_server
那么就从数据包中读出发送目标 然后将数据包发送给目标客户端
server的process函数则正好相反 将来自to_server的消息投递给disp_to_client 将来自客户端的消息从to_server
发送出去 一个简单的消息转发服务就这样实现了
cha138/Article/program/Web/201404/30642相关参考
用C#编写发手机中文短信息Windows服务 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 最近
网络环境下病毒的防范分以下层次,用户可根据自己的实际情况进行选择配置: 1)、配置网关型防病毒服务器的防病毒软件,对进出信息网络系统的数据包进行病毒检测和清除;网关型防病毒服务器应尽可能与防火墙
网络环境下病毒的防范分以下层次,用户可根据自己的实际情况进行选择配置: 1)、配置网关型防病毒服务器的防病毒软件,对进出信息网络系统的数据包进行病毒检测和清除;网关型防病毒服务器应尽可能与防火墙
汽车网关的作用是啥?汽车网关是汽车内部通信局域网的核心,通过它可以实现各条总线上信息的共享以及实现汽车内部的网络管理和故障诊断功能。汽车网关控制器主要有以下3个功能:a、报文路由:网关具有转发报文的功
知识大全 天翼宽带家庭网关设置路由器时,显示需要输入网关账号和密码,输入拨号的账号和密码不对,怎么办
天翼宽带家庭网关设置路由器时,显示需要输入网关账号和密码,输入拨号的账号和密码不对,怎么办?首先电脑连接网络,使用本地连接,看看能否上网,能够就往下面看,全部设置完成后追问,设置路由器的时候不要接猫换
基本步骤 说明 HostNamedmserver WinServerOracleDatabaseMicrosoftSQLServer UserName:UserPassword:User
cha138/Article/program/Oracle/201311/19062
ADSL+RH8.0透明网关指南 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一)概述: 利
知识大全 Linux 上的邮件网关(杀病毒)AntiVir MailGate
Linux上的邮件网关(杀病毒)AntiVirMailGate 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
后台监控软件为了达到隐蔽监控的目的应该满足正常运行时不显示在任务栏上在按Ctrl+Alt+Del出现的任务列表中也不显示管理员可以通过热键调出隐藏的运行界面要作到这些必须把当前进程变为一个系统服务