自己想实现一个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. ubuntu 安装 swftoos

    一:下载依赖: freetype下载地址 : http://ftp.twaren.net/Unix/NonGNU/freetype/ jpegsrc:下载地址 http://www.ijg.org/f ...

  2. 【HTTP】Web及网络基础&HTTP基础

    HTTP协议访问Web 一.大体访问过程 1. 浏览器地址栏输入URL 2. 浏览器从服务端获取文件资源 3. 浏览器显示Web页面 二.HTTP的版本历史 1. HTTP/0.9 没有作为正式的标准 ...

  3. [JavaWeb基础] 023.线程安全(二)

    上一篇我们讲解了线程安全的问题,那么要解决线程安全的问题,我们就必须用到线程同步,保证线程之间不互相影响而产生脏数据,下面我们来讲讲具体的实现吧. 首先我们看下例子,我们有个Outputter类,用于 ...

  4. [wordpress使用]001_环境安装

    Wordpress强大的可扩展性和易用性等功能,使得越来越多的人选择它来建立自己的博客和网站.那么新手朋友该如何入手呢,今天制作这个教程就是旨在帮助新手朋友快速入门,从而为今后WP建站打下坚实的基础. ...

  5. SET运算符

    -- SET操作符: -- union   联合去重 两个表的字段个数和类型都得一样,起别名 应该在第一个表上操作,,排序按照第一列从小到大来排的 select employee_id, depart ...

  6. BZOJ1001 狼抓兔子 题解

    裸的最小割,转化成最大流即可. #include <bits/stdc++.h> int n,m; int S,T; int mincost; int head[6001000],tot= ...

  7. GNS3内网配置虚拟机测试

    一.背景:考虑在GNS3内网配置一台虚拟机系统,用于大流量测试. 二.环境: 1.win10系统已安装:GNS3和配套GNS3VM虚拟机(版本号:2.2.7):vmware虚拟机winxp(名称为:W ...

  8. 从软件开发到 AI 领域工程师:模型训练篇

    前言 4 月热播的韩剧<王国>,不知道大家有没有看?我一集不落地看完了.王子元子出生时,正逢宫内僵尸作乱,元子也被咬了一口,但是由于大脑神经元尚未形成,寄生虫无法控制神经元,所以医女在做了 ...

  9. SpringBoot—单元测试模板(controller层和service层)

    介绍 概述   在开发过程中,我们经常会一股脑的写各种业务逻辑,经常等全部大功告成的时候,打个jar包放环境里跑跑看看能不能通,殊不知在各个业务方法中已经漏洞百出,修复一个打一个包,再继续修复,这种效 ...

  10. Java实现 LeetCode 398 随机数索引

    398. 随机数索引 给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引. 您可以假设给定的数字一定存在于数组中. 注意: 数组大小可能非常大. 使用太多额外空间的解决方案将不会通过测试 ...