skynet源码阅读<2>--网络部分
先来看下socket_server的数据结构,这里简称为ss:
struct socket_server {
int recvctrl_fd;
int sendctrl_fd;
int checkctrl;
poll_fd event_fd;
int alloc_id;
int event_n;
int event_index;
struct socket_object_interface soi;
struct event ev[MAX_EVENT];
struct socket slot[MAX_SOCKET];
char buffer[MAX_INFO];
uint8_t udpbuffer[MAX_UDP_PACKAGE];
fd_set rfds;
};
我绘了一张简图,表述网络收发部分的处理流程,如下:

1)skynet启动时会创建单独的socket线程,在这个线程中,通过skynet-socket-poll轮循管道server-pipe。ss.sendctrl_fd是管道的写端,而ss.recvctrl_fd则是管道的读端。
2)lua-socket.c封装了一组接口,在lua-service中调用这些接口实现socket相关的处理。在调用这些接口时,实现中首先拿到与skynet-context-id,接着构建参数,然后通过ss.sendctrl_fd写入管道。
3)socket_server_poll中在select管道读端ss.recvctrl_fd时,收到命令后通过skynet-context-id找到关联的socket,再做相应处理,比如listen,accept,或是写入数据到缓存并找到socket关联的事件,打上或关闭write标记等。
4)另一方面,在socket_server_poll中也会检查event_fd是否有新的事件到来,比如可写时将缓存中数据写出等;处理完这波事件后才会检查下一波事件(sp_wait)。ss.event_n,ss.event_index,ss.ev就是做这些事的。在处理相关事件时,根据需要,会将消息(比如接收到的数据块)打包发送给socket关联的skynet-context,最后回调到lua-service中来。
其它一些具体的细节,比如epoll或是kqueue模型的使用等,请自行查阅文档。下一篇会以gate为例,揭示在网络处理在lua中的运行和操作流程。
skynet源码阅读<2>--网络部分的更多相关文章
- skynet源码阅读<3>--网关分析
继上一篇介绍了skynet的网络部分之后,这一篇以网关gate.lua为例,简单分析下其串接和处理流程. 在官方给出的范例中,是以examples/main.lua作为启动脚本的,在此过程中会创建wa ...
- skynet源码阅读<1>--lua与c的基本交互
阅读skynet的lua-c交互部分代码时,可以看到如下处理: struct skynet_context * context = lua_touserdata(L, lua_upvalueindex ...
- skynet 源码阅读笔记 bootstrap.lua
最近几周粗略看了 skynet 代码的 C 部分.遇到很多知识点以前只是知道,但并不十分了解,所以这是一个学习的过程. 从 main 函数开始,闷头一阵看下来,着实蛋疼. 当看了 skynet_mq. ...
- skynet源码阅读<5>--协程调度模型
注:为方便理解,本文贴出的代码部分经过了缩减或展开,与实际skynet代码可能会有所出入. 作为一个skynet actor,在启动脚本被加载的过程中,总是要调用skynet.start和sky ...
- skynet源码阅读<7>--死循环检测
在使用skynet开发时,你也许会碰到类似这样的警告:A message from [ :0100000f ] to [ :0100000a ] maybe in an endless loop (v ...
- skynet源码阅读<6>--线程调度
相比于上节我们提到的协程调度,skynet的线程调度从逻辑流程上来看要简单很多.下面我们就来具体做一分析.首先自然是以skynet_start.c为入口: static void start(int ...
- skynet源码阅读<4>--定时器实现
昨天和三石公聊天,他提到timer的实现原理,我当时迟疑了一下,心想timer不是系统底层时钟中断驱动上层进程/线程,累积计时实现的么?他简述了timer的实现,什么堆排序,优先级队列等,与我想象的不 ...
- 【原】AFNetworking源码阅读(一)
[原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...
- 【原】SDWebImage源码阅读(三)
[原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们 ...
随机推荐
- PHP提示Cannot modify header information - headers already sent by解决方法
PHP提示Cannot modify header information - headers already sent by解决方法 因为 header();发送头之前不能有任何输出,空格也不行, ...
- Linux上安装使用SSH
參考博客:http://blog.csdn.net/xqhrs232/article/details/50960520 Ubuntu安装使用SSH ubuntu默认并没有安装ssh服务,如果通过ssh ...
- collection包1.1.0都升级了什么功能
collection包1.1.0都升级了什么功能 jianfengye/collection(https://github.com/jianfengye/collection) 这个包喜迎第一个子版本 ...
- 成长笔记 - mysql-5.5.25-winx64安装步骤(及密码修改问题)
操作系统:Windows 7 64位 下载地址: http://download.mysql.cn/src/2012/0602/5611.html 1. 将mysql-5.5.25-winx64.zi ...
- Spring基于Setter函数的依赖注入(DI)
以下内容引用自http://wiki.jikexueyuan.com/project/spring/dependency-injection/spring-setter-based-dependenc ...
- Spring的Bean定义
以下内容引用自http://wiki.jikexueyuan.com/project/spring/bean-definition.html: Bean定义 被称作bean的对象是构成应用程序的支柱也 ...
- Visual Studio VS如何统计代码行数
编辑-查找和替换-在文件中查找,然后查找内容填写下面的东西,勾选使用正则表达式,点击查找全部 b*[^:b#/]+.*$ 在查找结果的最后一行显示了总的行数和文件数 ...
- SQL SELECT TOP, LIMIT, ROWNUM 子句
SQL SELECT TOP, LIMIT, ROWNUM 子句 SQL SELECT TOP 子句 SELECT TOP 子句用于规定要返回的记录的数目. SELECT TOP 子句对于拥有数千条记 ...
- 用Meta 取消流量器缓存方便调试
<!-- 禁止浏览器从本地缓存中调阅页面.--> <meta http-equiv="pragram" content="no-cache"& ...
- win32收不到F10按键消息解决的方法
在WM_KEYDOWN中处理F10(VK_F10)消息总是获取不到,后来用spy++监听窗体消息发现按下F10并没有WM_KEYDOWN消息产生,而是产生了WM_SYSKEYDOWN