当前位置: 首页 > article >正文

skynet.netpack四个核心函数详解

目录

  • 1. `netpack.filter(queue, msg, sz)`
  • 2. `netpack.pop(queue)`
  • 3. `netpack.tostring(msg, sz)`
  • 4. `netpack.clear(queue)`
  • 完整使用场景示例
  • 总结

在这里插入图片描述

在 Skynet 中,netpack 模块提供了四个核心函数,用于处理网络数据包的接收、粘包解析和队列管理。以下是这四个函数的详细解析:


1. netpack.filter(queue, msg, sz)

作用:

  • 粘包处理:将原始网络数据流(msg)分割为完整的消息包,并将未处理完的数据缓存到 queue 中。
  • 队列管理:将分割后的完整消息包存入队列,供后续逐个处理。

参数:

  • queue:用于缓存消息包的队列(通常是一个表)。
  • msg:接收到的原始二进制数据(lightuserdatastring)。
  • sz:数据长度。

返回值:

  • 完整消息包数量:返回本次处理得到的完整消息包数量。

工作原理:

  1. 协议解析:根据预设的协议(如两字节大端长度头)解析 msg
  2. 数据分割:将 msg 按消息头指示的长度分割为多个完整包。
  3. 缓存处理:未组成完整包的数据部分会被保留在 queue 中,等待下次数据到达时继续处理。

示例:

local queue = {}
local msg = socket.read(fd)  -- 读取原始数据
local count = netpack.filter(queue, msg, #msg)

2. netpack.pop(queue)

作用:

  • 取出消息包:从队列 queue 中弹出一个完整的消息包。
  • 遍历队列:通过循环调用 netpack.pop,可逐个处理所有缓存的完整消息包。

参数:

  • queue:通过 netpack.filter 维护的消息队列。

返回值:

  • 消息包信息:返回三个值:fd(连接的套接字描述符)、msg(消息内容)、sz(消息长度)。若队列为空,返回 nil

示例:

while true do
    local fd, msg, sz = netpack.pop(queue)
    if not fd then break end
    -- 处理消息,如解析并分发给业务逻辑
    handle_request(fd, msg, sz)
end

3. netpack.tostring(msg, sz)

作用:

  • 数据转字符串:将二进制数据 msg 转换为可打印的字符串,用于调试或日志记录。
  • 非破坏性操作:不修改原始数据,仅生成其字符串表示。

参数:

  • msg:二进制数据(lightuserdatastring)。
  • sz:数据长度。

返回值:

  • 字符串:数据的十六进制或可打印字符表示。

示例:

local msg_str = netpack.tostring(msg, sz)
print("Received data:", msg_str)

4. netpack.clear(queue)

作用:

  • 清空队列:释放队列 queue 中所有缓存的消息包占用的内存。
  • 资源回收:在连接关闭或需要重置时调用,避免内存泄漏。

参数:

  • queue:通过 netpack.filter 维护的消息队列。

示例:

function on_disconnect(fd)
    netpack.clear(queue)  -- 清理队列
    socket.close(fd)
end

完整使用场景示例

local skynet = require "skynet"
local socket = require "skynet.socket"
local netpack = require "skynet.netpack"

local queue = {}  -- 消息队列

-- 处理客户端连接
socket.start(fd, function(fd, data)
    -- 1. 处理粘包,分割数据
    local count = netpack.filter(queue, data, #data)

    -- 2. 逐个取出完整消息包
    for _ = 1, count do
        local _, msg, sz = netpack.pop(queue)
        if msg then
            -- 3. 转换为字符串记录日志
            local msg_str = netpack.tostring(msg, sz)
            skynet.error("Received:", msg_str)

            -- 4. 处理业务逻辑
            handle_request(fd, msg, sz)
        end
    end
end)

-- 连接关闭时清理队列
socket.on_close(fd, function()
    netpack.clear(queue)
end)

总结

函数作用典型场景
netpack.filter粘包处理与队列填充接收原始网络数据流时调用
netpack.pop从队列中取出完整消息包处理已分割的完整消息包
netpack.tostring二进制数据转字符串调试或日志记录
netpack.clear清空队列并释放内存连接关闭或重置时调用

通过这四个函数,Skynet 能够高效地处理网络通信中的粘包问题,并提供灵活的数据管理机制,适用于高并发、低延迟的服务器开发场景。


http://www.kler.cn/a/610762.html

相关文章:

  • 机器学习都有哪些算法?
  • Golang 的 Waitgroup 锁用 Java的话要怎么实现?
  • LIMS应用的意义-LIMS厂家排名推荐
  • 全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练
  • Docker镜像迁移方案
  • Rust从入门到精通之入门篇:3.Hello World
  • [问题收集]mysql主从分离过程中,数据不同步可能导致的后果以及应对策略
  • Ubuntu 重置密码方法
  • Android studio无法查看源码
  • 2.4 Gannt图【甘特图】
  • 多级缓存和数据一致性问题
  • 鸿蒙Flutter开发故事:不,你不需要鸿蒙化
  • 宝塔docker flarum默认登录账号密码,crazymax/flarum镜像默认登录账号密码
  • 【leetcode hot 100 215】数组中的第K个最大元素
  • Python----计算机视觉处理(Opencv:梯度处理:filiter2D算子,Sobel,Laplacian)
  • 鸿蒙HarmonyOS NEXT之无感监听
  • WPF TextBox实现键盘enter后实时读取TextBox中的值
  • BP神经网络+NSGAII算法(保真)
  • CentOS 7 挂载与卸载文件系统
  • 《TypeScript 7天速成系列》第4天:TypeScript模块与命名空间:大型项目组织之道