Skip to content

lua kcp implemented by cfadmin.

License

Notifications You must be signed in to change notification settings

cfadmin-cn/lua-kcp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Lua-kcp

基于cfadminLua C API版本封装的KCP实现.

优势

  • 基于事件驱动模型, 不浪费CPU的空闲时间;

  • 更加快的请求响应, 更优秀的公网交互体验;

  • 完善的API提供, 简单好用更加适合自己;

  • 自动内存分配管理, 想要就new、用完就close;

  • 客户端、服务器双向交互判断, 去除恶意请求带来的影响;

  • 其他更多优点, 请自行探索...

构建

  1. 将本项目克隆到3rd目录;

  2. 进入目录执行make build命令编译;

内置API

使用前先导入API: local lkcp = require "lua-kcp"

1. 创建对象


函数原型: lkcp:new(opt) return kcp end

使用lkcp:new(opt)创建一个kcp实例对象, 这个对象可用于后续的所有操作.

opt是一个table类型的参数, 内部必须包含以下属性作为参数:

opt.conv - kcp用的uint32类型会话编号, 主要用作传输层的对端校验.

opt.ip - 服务器或客户端用到的地址

opt.port - 服务器或客户端用到的端口

2. 发送与接收


函数原型: kcp:send(buffer) return boolean end

使用此方法将会向对端发送的字符串.

函数原型: kcp:recv() return buffer end

使用此方法会接收对端发送的字符串.

3. 获取、修改属性


函数原型: 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待发送的数据包数量.

4. 关闭


函数原型: 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端口请修改为此端口.

  • 最后在wiresharkfilter上输入kcp后按回车, 然后运行应用程序就能看到捕获的数据包了.

许可

MIT

最后

  • 大、小包发送方法一致, 默认情况下按照包分割. 可以自行修改.

  • conv必须为uint32类型, 同时客户端与服务器必须一致.

  • 支持IPv6IPv4同时监听, 不可单独指定监听的IP地址.

  • UDP服务端号分配方法请自行解决, 如无法自行解决请使用TCP.