自己想实现一个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. day18 迭代器

    1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,只能往后走不能往前退: 2,可迭代对象:实现了迭代器协议的对象(如何实现: ...

  2. APP元素定位和操作

    webdriver 提供了八种元素定位方法: 在 Python 语言中对应的定位方法如下:find_element_by_id()find_element_by_name()find_element_ ...

  3. Android_存储之scoped storage&媒体文件

    Scoped storage 文件存储介绍了内部存储和外部存储相关的内容.因为外部存储容易读写,所以在手机中经常看到很多“乱七八糟”的文件或文件夹,这些就是应用肆意创建的. Android Q(10) ...

  4. Eclipse中java文件选中变量名,相同变量都变色显示 .

    第一步设置高亮显示的颜色: Window-->preferences-->General-->Editors-->Text Editors-->Annotations-- ...

  5. eatwhatApp开发实战(十四)

    之前我们就输入框EditText做了优化,而这次,我们为app添加拨打电话的功能. 首先是布局,将activity_shop_info.xml中对应的电话那一栏进行重新设计: <Relative ...

  6. [Android-NDK编译] ndk 编译 c++ 兼容性问题汇总整理

    1.__int64找不到符号 采用int64_t来代替: #if defined(__ANDROID__) typedef int64_t __int64; #endif 2.<sys/io.h ...

  7. zsh 使用通配符功能

    zsh 使用通配符功能 默认情况下 zsh 是不支持通配符 (*) 匹配的: 第一步,打开zsh配置文件 $ vi .zshrc 第二步,最后一行添加下面语句到文本中,保存.退出: setopt no ...

  8. rewrite和return的简单需求

    Rewrite 需求作业 背景:现在我有一个网站,www.linux.com www.linux.com访问主页面 friend.linux.com访问交友页面 blog.linux.com访问博客页 ...

  9. elasticsearch中保存时间格式

    利用logstash从文档中导入数据到es中,若未事先设定数据格式,有可能存储时间并未保存为date格式而是text格式. 时间若保存为text,则在会以字符串数组格式存储在es中,是乱序,不好查询. ...

  10. (Java实现) 洛谷 P1012 拼数

    题目描述 设有nn个正整数(n≤20)(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3n=3时,3个整数13,312,343联接成的最大整数为:3433121334331213 ...