自己想实现一个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分支处理流程:
dispatch_socket_message -> dispatch_message -> databuffer_push
未完待续
skynet 初步分析
原文:https://www.cnblogs.com/dzqdzq/p/12856410.html