lua socket客户端 lua string.pack字符串打包

这篇博客探讨了如何使用Lua实现socket客户端,并分享了关于字符串打包 (`string.pack`) 的示例。作者提到了在Lua层进行TCP封包解包的操作,并推荐参考云风skynet项目的client.lua代码来了解更多详情。
摘要由CSDN通过智能技术生成

https://www.runoob.com/manual/lua53doc/manual.html#6.4.2

<: 设为小端编码
>: 设为大端编码
=: 大小端遵循本地设置
![n]: 将最大对齐数设为 n (默认遵循本地对齐设置)
b: 一个有符号字节 (char)
B: 一个无符号字节 (char)
h: 一个有符号 short (本地大小)
H: 一个无符号 short (本地大小)
l: 一个有符号 long (本地大小)
L: 一个无符号 long (本地大小)
j: 一个 lua_Integer
J: 一个 lua_Unsigned
T: 一个 size_t (本地大小)
i[n]: 一个 n 字节长(默认为本地大小)的有符号 int
I[n]: 一个 n 字节长(默认为本地大小)的无符号 int
f: 一个 float (本地大小)
d: 一个 double (本地大小)
n: 一个 lua_Number
cn: n字节固定长度的字符串
z: 零结尾的字符串
s[n]: 长度加内容的字符串,其长度编码为一个 n 字节(默认是个 size_t) 长的无符号整数。
x: 一个字节的填充
Xop: 按选项 op 的方式对齐(忽略它的其它方面)的一个空条目
' ': (空格)忽略

比如

local text2 = "123456789012"
--  " > " 代表大端  s2表示加上2字节的头部长度  表示unsigned short
local text = string.pack(">s2", text2)
string.pack (fmt, v1, v2, ···)
返回一个打包了(即以二进制形式序列化) v1, v2 等值的二进制字符串。 字符串 fmt 为打包格式(参见 §6.4.2)。

string.unpack (fmt, s [, pos])
返回以格式 fmt (参见 §6.4.2) 打包在字符串 s (参见 string.pack) 中的值。 选项 pos(默认为 1 )标记了从 s 中哪里开始读起。 读完所有的值后,函数返回 s 中第一个未读字节的位置。

lua客户端

local socket = require("socket")

local host = "127.0.0.1"
local port = 9999

local sock = assert(socket.connect(host, port)) 
print("connect ok")


function m_send(buf)
    local text = string.pack(">s2", buf)--加上2字节的头部
    sock:send(text)
end

function m_recv1(buf)
    local text = string.unpack(">s2", buf, 1);
    return text
end

function m_recv2(buf)
    --取得头部2字节的内容,此为后续数据的长度
    local s = buf:byte(1) * 256 + buf:byte(2)

    --不足以一个包
    if #buf < (s+2) then
        return nil
    end

    --完整包
    return buf:sub
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值