基于cfadmin
的Lua C API
版本封装的KCP实现.
-
基于事件驱动模型, 不浪费CPU的空闲时间;
-
更加快的请求响应, 更优秀的公网交互体验;
-
完善的
API
提供, 简单好用更加适合自己; -
自动内存分配管理, 想要就
new
、用完就close
; -
客户端、服务器双向交互判断, 去除恶意请求带来的影响;
-
其他更多优点, 请自行探索...
-
将本项目克隆到
3rd
目录; -
进入目录执行
make build
命令编译;
使用前先导入API
: local lkcp = require "lua-kcp"
函数原型: lkcp:new(opt) return kcp end
使用lkcp:new(opt)
创建一个kcp
实例对象, 这个对象可用于后续的所有操作.
opt
是一个table
类型的参数, 内部必须包含以下属性作为参数:
opt.conv
- kcp
用的uint32
类型会话编号, 主要用作传输层的对端校验.
opt.ip
- 服务器或客户端用到的地址
opt.port
- 服务器或客户端用到的端口
函数原型: kcp:send(buffer) return boolean end
使用此方法将会向对端发送的字符串.
函数原型: kcp:recv() return buffer end
使用此方法会接收对端发送的字符串.
函数原型: kcp:setstream() return nil end
设置KCP
为流模式(默认为包模式), 需要客户端设置才有效.
函数原型: kcp:setmtu(mtu) return nil end
设置KCP
最大传输单元.
函数原型: kcp:setwnd(mtu) return nil end
设置KCP
滑动窗口大小(包).
函数原型: kcp:setmode(mode) return nil end
设置mode
传输模式: fast
(快速), normal
(普通).
函数原型: kcp:getsnd() return integer end
返回KCP
待发送的数据包数量.
函数原型: kcp:close() return nil end
释放资源.
示例代码 :
-- 注意:
-- 1. 将KCP设置为`fast`模式可以提升实时性;
-- 2. 建议使用KCP传输的数据包应该尽可能的小;
-- 3. 使用前请先做技术调研确认是否必须使用KCP;
-- 4. 不再使用的时候请注意销毁所有对象资源;
local lua_kcp = require "lua-kcp"
local cf = require "cf"
local k1 = lua_kcp:new { conv = 1, ip = "127.0.0.1", port = 9999 }
k1:setmode("fast")
local k2 = lua_kcp:new { conv = 1, ip = "localhost", port = 9999 }
k2:setmode("fast")
cf.fork(function ()
print("1.开始")
print("1.发送1:", k1:send("車"))
print("1.发送2:", k1:send("先生"))
print("1.发送3:", k1:send("車爪嘟"))
print("1.发送4:", k1:send(("車太太"):rep(200)))
print("1.结束", k1:getsnd())
cf.wait()
end)
print("2.开始")
print("2.接收1:", k2:recv())
print("2.接收2:", k2:recv())
print("2.接收3:", k2:recv())
print("2.接收4:", k2:recv())
print("2.结束", k2:getsnd())
k1:close(); k2:close();
cf.wait()
输出结果 :
[candy@MacBookPro:~/Documents/cfadmin] $ ./cfadmin
2.开始
1.开始
1.发送1: true
1.发送2: true
1.发送3: true
1.发送4: true
1.结束 5
2.接收1: 車
2.接收2: 先生
2.接收3: 車爪嘟
2.接收4: 車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太車太太
2.结束 0
-
下载wireshark, 然后进行安装.
-
按照这里的指引安装我们编写的
插件
, 如果您使用的不是8082
端口请修改为此端口. -
最后在
wireshark
的filter
上输入kcp
后按回车, 然后运行应用程序就能看到捕获的数据包了.
-
大、小包发送方法一致, 默认情况下按照包分割. 可以自行修改.
-
conv
必须为uint32
类型, 同时客户端与服务器必须一致. -
支持
IPv6
与IPv4
同时监听, 不可单独指定监听的IP
地址. -
UDP
服务端号分配方法请自行解决, 如无法自行解决请使用TCP
.