skynet网络剖析

1.tcp
2.epoll
3.socket线程
4.gate服务
5.netpack 解包打包
6.service_gate.c 原理

数据流大概如下
thread_socket --> skynet_socket_poll -->forward_message
skynet_start.c
skynet节点启动时会启动一个线程专门处理socket事件

检测epoll事件


forward_message里 将tcp数据留发送到对应的服务的消息队列(即aocor的消息队列,一般是gate服务)

socket服务是怎么知道这条消息要往哪个服务发送呢?
在socket_server.c new_fd会把通过epoll_ctl add 将服务标识添加到 rbtree的event当中,这样就映射起来了
socket_server.c

socket_poll.h

socket是怎么检测有数据的呢?
socket_server.c
sp_wait返回事件的数目,并将触发的事件写入events数组中。

然后 forward_message_tcp 调用 read 把数据读出,每次从内核读出来的数据一开始是64个字节。

gate服务与netpack包解析
gate服务与agent中间还有个watchdog,数据进来会先到gate,gate会给watchdog发送一个请求,watchdog收到请求会启动一个agent。agent启动后会给gate发送请求forward。之后数据直接就gate发给agent,不经过watchdog。
这里主要将gate如何解析tcp数据流转化为应用层数据。

gate服务解包会调用c函数netpack.filter

filter_data 把type、 fd、 组装好的data(ligthuserdata)、size 返回

组装好的数据最终变成msg发送给服务处理

“more”:表示收到的数据不止一个tcp包,netpack.filter会把包依次放到队列里,然后回调函数一个个从队列中pop出来

这里贴上其它博客内容https://www.cnblogs.com/cnxkey/articles/15945319.html
这里讲到非常详细
主要数据结构 链表

当从内核tcp流读出的数据有两个包的数据的时候 是通过以下的递归来分隔一个个完整的逻辑数据包

service_gate.c是废弃的gate服务
与netpack分包类似,c的gate服务是用databuff这个ringbuff(环形buff)来进行分包的,把数据流分成一个个完整的包。

gate结构存了一个conn数值,conn存在databuffer
gate结构还存了一个环形队列 messagepoll

databuffer_push,就是把data放进环形队列。把databuffer和mp链接起来

环形队列初始化

另外一种分包模式,一个tcp一个服务
https://blog.codingnow.com/2016/03/skynet_tcp_package.html

【1.skynet网络剖析】相关推荐

  1. skynet 游戏服务器探索(1)--熟悉skynet(网络)

    因为做游戏服务器开发,大多数都跟脚本打交道,要么是lua,要么是python,要么是php,方便热更新的只有lua与php, php相关的游戏服务器开发,参考我另外的文章 https://blog.c ...

  2. skynet设计原理和使用

    skynet设计原理 一.多核并发编程方式 二.skynet 2.1.skynet简介 2.2.环境准备 2.3.编译安装 2.4.Actor 模型 2.5.消息队列 2.6.actor公平调度 三. ...

  3. 平台开发——skynet——⑤网关服务gate

    skynet外界通讯简介: 有两种 ①是游戏客互端使用 TCP 连接接入 skynet 节点.如果你用 skynet 实现一个 web 服务器的话,游戏客户端就可以等价于一个浏览器请求. 称为:gat ...

  4. 【从零开始学Skynet】基础篇(二):了解Skynet

    1.节点和服务 在下图所示的服务端系统中,每个Skynet进程(操作系统进程)都称为一个节点,每个节点都可以开启数千个Lua服务,每个服务都是一个Actor.不同节点可以部署在不同的物理机上,提供分布 ...

  5. skynet框架应用 (十二) snax框架

    12 snax框架 ​ snax 是一个方便 skynet 服务实现的简单框架.(简单是相对于 skynet 的 api 而言) ​ 使用 snax 服务先要在 Config 中配置 snax 用于路 ...

  6. skynet源码分析:服务,Actor模型,lua接口编程,demo演示Actor编程思维

    skynet刚开始是单进程多线程的,它是由一个一个的服务组成的.在skynet上做开发,实际上就是在写服务.服务与服务之间通过消息队列进行通信. 做为核心功能,Skynet 仅解决一个问题: 把一个符 ...

  7. skynet入门笔记

    入门观看博客笔记: 博客笔记: 第五篇 关于服务别名 别名注册与查询接口: 在skynet中,服务别名可以分为两种: 一种是本地别名,本地别名只能在当前skynet节点使用,本地别名必须使用. 开头, ...

  8. 学习记录四 运行skynet基础例子

    0 创建自己的测试目录 examples同级目录下创建  myexample文件夹,在里面添加study,study文件夹下添加config main.lua service1.lua socket1 ...

  9. 【skynet】skynet入口解析

    skynet入口解析 skynet入口 skynet总体架构 skynet入口函数 具体会有如下线程: 网络线程工作流程: 工作线程工作流程: 定时器线程工作流程: 监视器线程工作流程: 一.skyn ...

最新文章

  1. LUA C 交互 cocos
  2. FPGA之道(83)功能仿真之仿真语法(Graphic Waveform )
  3. WPF: x名称空间
  4. base64下载excel (使用blob)
  5. 去掉IntelliJ IDEA 中 mybatis 对应的 xml 文件警告
  6. source:读取文件 “/etc/profile” 时发生错误解决办法
  7. 机器学习系列(九)【最大熵模型】
  8. JS组件系列——表格组件神器:bootstrap table(二:父子表和行列调序)
  9. 金融银行业机器学习—机遇、风险、案例
  10. Flameshot——最好用的ubuntu截图工具
  11. vue引入,两种组件库vant,vue-ydui变量冲突问题
  12. 计算机网络各层设备故障及可行的解决方案
  13. java毕业设计高校学习社区mybatis+源码+调试部署+系统+数据库+lw
  14. 点云损失函数Chamfer Distance 和 Earth Mover‘s Distance
  15. 计算机专业硕士毕业论文,计算机专业硕士毕业论文致谢范文
  16. 随机获取数组中的一个元素
  17. 博弈的扩展式纳什均衡贝叶斯均衡是什么纳什均衡说明什么纳什均衡(Nash Equilibrium)
  18. 申请微信公众号的一些流程和注意
  19. 电脑翻译软件-在线电脑实时翻译软件
  20. [转]formValidator的一些验证实例

热门文章

  1. 培训python排行榜
  2. 3d效果图制作傻瓜软件_3D效果图制作哪个软件是最适合的?
  3. hwd分别是长宽高_DS-2CD7A47HWD-XZS 海康威视400万人脸比对摄像机 DS-2CD7A47HWD-XZS/JM
  4. 手机文件传到服务器,手机文件传输到服务器
  5. 掌财社:Java项目案例之客户信息管理系统的实现
  6. 盒子阴影 – box-shadow
  7. 【毕业设计】基于单片机无线充电的4轴飞行器 -物联网 嵌入式 stm32
  8. 【STM32H743+腾讯云IOT联合开发入坑及出坑经验分享】
  9. C语言 字符串分类统计 输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数
  10. 极大极小算法和AlphaBeta剪枝算法