介绍
与 “testkcp” 模块进行集成,以实现延迟模拟的功能。模拟的延迟和丢包情况可以帮助测试和评估 “testkcp” 的性能和可靠性,用于测试和调试网络应用程序的性能和稳定性。
testkcp.lua文件分析可见上一篇lua-kcp文件分析-testkcp.lua
核心代码分析
- 此方法用于创建一个 DelayPacket 对象。它接受一个参数 data,用于初始化对象的数据属性。
--delay packet
function DelayPacket.new(data)
local self = {}
self.data = data
self.ts = 0
setmetatable(self, {__index = DelayPacket})
return self
end
- 此方法用于创建一个 LatencySM 对象,即延迟模拟器对象。
- 它接受三个可选参数:lostrate(丢包率),rttmin(最小往返时间RTT),rttmax(最大往返时间RTT)。
function LatencySM.new(lostrate, rttmin, rttmax)
local self = {}
lostrate = lostrate or 10
rttmin = rttmin or 60
rttmax = rttmin or 125
self.lostrate = lostrate/2
self.rttmin = rttmin/2
self.rttmax = rttmax/2
self.tunnel01 = {}
self.tunnel10 = {}
setmetatable(self, {__index = LatencySM})
return self
end
- 此方法用于将数据发送到指定的频道(peer)。
- 两个参数:peer(频道的标识,测试用例中是0或1)和 data(待发送的数据)。
- 在 “testkcp” 模块中,这个方法可以被用来模拟延迟发送数据包到远程频道。
function LatencySM:send(peer, data)
local ra = rand()
if rand() < self.lostrate then
return
end
local pkt = DelayPacket.new(data)
local nowt = getms()
local delay = self.rttmin
if self.rttmax > self.rttmin then
delay = delay + rand() % (self.rttmax - self.rttmin)
end
pkt:setts(nowt + delay)
if peer == 0 then
table.insert(self.tunnel01, pkt)
else
table.insert(self.tunnel10, pkt)
end
end
- 此方法用于从指定的频道(peer)接收数据。
- 一个参数:peer。
- 在 “testkcp” 模块中,这个方法可以被用来模拟延迟从远程频道接收数据包,并返回接收到的数据长度和数据,以便测试和评估网络应用程序的性能和稳定性。
function LatencySM:recv(peer)
local tunnel
if peer == 0 then
tunnel = self.tunnel10
else
tunnel = self.tunnel01
end
if #tunnel == 0 then
return -1
end
local pkt = tunnel[1]
local nowt = getms()
if nowt < pkt:getts() then
return -2
end
table.remove(tunnel, 1)
local ret = pkt:getdata()
return #ret, ret
end