自己想实现一个tcp 粘包,残包的功能。  先看看一些开源的库是怎么实现的。

首先开启一个线程。使劲的执行: skynet_socket_poll
skynet_socket_poll  这个玩意是干嘛的呢?就是处理socket消息
工作流:
socket_message -> skynet_socket_message -> skynet_message -> skynet_context_push(message_queue)
通过源码追踪,发现数据都到message_queue了
 
 
既然有一个功能是:  把原始数据经过各种封装处理后流向message_queue了
猜测: 那么肯定有一个功能: 使劲的取message_queue,然后把原始数据加工成程序方便使用的对象
 
根据这个思路查找:
在skynet_start.c文件中, 很容易就找到了和队列相关的东西。 
就是thread_worker, 这个线程就是使劲的执行: skynet_context_message_dispatch
skynet_context_message_dispatch 这个玩意是干嘛的呢?
就是从全局队列拿出一个队列, 然后对这个队列使劲 skynet_mq_pop 并 dispatch_message
dispatch_message就是把  skynet_message 交给 skynet_cb 回调处理。
 
那么在这之前肯定有注册回调地方。
 

通过全局查找,找到了注册的地方。

有几个默认的处理skynet_message回调:

forward_cb

mainloop

logger_cb

launch_cb

在lua-skynet.c中有一个没有圈出来, 这个调的到了_cb, 里面有一个lua_pcall,  这个其实已经调用到了lua的逻辑层。

此lua回调是通过 skynet.core.callback  注册的。
简单跟踪了一下: 最终都会到 skynet.dispatch_message
到lua层,应该不会用lua去处理粘包的问题吧。 
 
 
在service_gate.c文件中有一个_cb,这个回调的功能是,处理了三种原始数据

PTYPE_TEXT,

PTYPE_CLIENT,
PTYPE_SOCKET
 
PTYPE_SOCKET分支处理流程:
dispatch_socket_message  -> dispatch_message -> databuffer_push -> _forward(

databuffer_read, 读取一个完整包
skynet_send,发送一个完整包

)

 
至此找到了skynet处理粘包和残包的地方。 文件在: databuffer.h。  
有点不明白云风为什么不写在 c文件里,而要写在头文件里。
 
 
话说回来,我怎么记得有人说粘包残包的逻辑在netpack文件, 我就问你真的看源码了吗,还是对分包残包有什么误解。
 
 
扫了一遍c代码,总体感觉还不错。性能应该不错。但是我怎么感觉可以更高效啊,层次更合理啊。
居然处理分包是在一个gate服务中。
gate只是一个名字吧,其实就是对三种数据类型处理的一个封装。  
总的来说,这个逻辑处理都在worker上面完成。  
 
发送数据都是在worker线程。
 
send ->  skynet_socket_sendbuffer -> socket_server_send
发送是没有队列的,直接走socket立即发送
 
有一个线程thread_socket, 只处理外部发过来的数据。  包括连接,断开等等
 
 至少得4核的CPU才能把skynet发挥到极致。

skynet 初步分析的更多相关文章

  1. Azure底层架构的初步分析

    之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...

  2. 基于Spark和SparkSQL的NetFlow流量的初步分析——scala语言

    基于Spark和SparkSQL的NetFlow流量的初步分析--scala语言 标签: NetFlow Spark SparkSQL 本文主要是介绍如何使用Spark做一些简单的NetFlow数据的 ...

  3. S2-052 RCE漏洞 初步分析

    PS:初步分析,只是分析了Struts2 REST插件的部分,本来菜的抠脚不敢发,但看到各大中心发的也没比我高到哪里去,索性发出来做个记事! 漏洞描述 2017年9月5日,Apache Struts发 ...

  4. DirectUI的初步分析-转

    DirectUI的初步分析(一) 最近由于项目的需要学习了一下DirectUI方面的东西,主要借鉴的是一个国外程序员写的代码(见引用一),看了后发现它更多的是探讨一种实现的可能性和思路,和实际应用还是 ...

  5. Netfilter之连接跟踪实现机制初步分析

    Netfilter之连接跟踪实现机制初步分析 原文: http://blog.chinaunix.net/uid-22227409-id-2656910.html 什么是连接跟踪 连接跟踪(CONNT ...

  6. drf安装与APIView初步分析

    drf安装 1. pip install djangorestframework 2. 在settings文件中注册app : INSTALLED_APPS = [..., 'rest_framewo ...

  7. python简易的大乐透数据获取及初步分析

    该项目从网上爬取并分析彩票数据,为用户查看和初步分析往期数据提供一种简易的工具. https://github.com/unknowcry/Lottery # -*- coding: utf-8 -* ...

  8. linux 时钟源初步分析linux kernel 时钟框架详细介绍

    初步概念: 看datasheet的关于时钟与定时器的部分, FCLK供给cpu, HCLK供给AHB总线设备(存储器控制器,中断控制器.LCD控制器.DMA.USB主机控制器等), PCLK供给APB ...

  9. 2018-08-27 使用JDT核心库解析JDK源码后初步分析API命名

    源自术语词典API项目 · Issue #85 · program-in-chinese/overview, 打算先用早先的代码提取JDK API中的类/方法/参数名, 看看有哪些词需要翻译. 源码在 ...

随机推荐

  1. SPL常用函数

    使用SPL_AUTOLOAD_REGISTER装载类 <?php /** * libs/Test.class.php */ class Test { function __construct() ...

  2. js 遍历删除数组

    $(function(){ var aa = [1,1,2,3,3,4,4,5]; alert(aa); for (var i = aa.length-1;i >= 0 ;i--) { if ( ...

  3. pytest跳过指定的测试或模块

    参考Allure官方文档,pytest官方文档 实现setup/teardown 1.运行带指定标记的测试 @pytest.mark.tags ,这里的tags可以自定义 命令行执行:pytest - ...

  4. Java——枚举类(疯狂Java讲义6.9)

    枚举类:有限而固定的类,使用enum关键字定义. 一个Java源文件中最多只能定义一个public访问权限的枚举类. 1.可实现一个或多个接口,默认集成了java.lang.Enum类(实现java. ...

  5. 【转】eclipse找不到或无法加载主类

    Eclipse错误: 找不到或无法加载主类或项目无法编译10种解决大法! 今天启动项目,又遇到找不到或无法加载主类的情况,清除项目后无法编译,bin文件夹下没有.class文件,至少遇到3次这个问题了 ...

  6. SpringCloud Eureka Client和Server侧配置及Eureka高可用配置

    一.Eureka注册中心和客户端配置Demo. 1.Server端 a.使用Idea创建Spring项目,如下所示: b.相关配置 application.yaml配置文件如下: # eureka本身 ...

  7. Java实现 LeetCode 654 最大二叉树(递归)

    654. 最大二叉树 给定一个不含重复元素的整数数组.一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素. 左子树是通过数组中最大值左边部分构造出的最大二叉树. 右子树是通过数组中最 ...

  8. Java实现 蓝桥杯VIP 基础练习 字符串对比

    问题描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei 2:两个字符串不仅长度相 ...

  9. Java实现 LeetCode 434 字符串中的单词数

    434. 字符串中的单词数 统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符. 请注意,你可以假定字符串里不包括任何不可打印的字符. 示例: 输入: "Hello, my nam ...

  10. Java实现 LeetCode 77 组合

    77. 组合 给定两个整数 n 和 k,返回 1 - n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], ...