所以,我想这有点宽泛,但我会尽量缩小范围。我有一台服务器(带有 EventMachine),有时数据包会被拆分,但有时它们会被缓冲。所以,我尝试创建一个可以缓冲/取消缓冲它们的函数。我确实设法制作了一些东西,但是它没有“按预期”工作。老实说,我什至怀疑我什至可以称之为“几乎没有功能”。
首先,我想指出数据包结构:
- 数据包的前四个字节是它的 ID,或数据包的名称 (
name
)。 - 接下来的四个字节是数据包的“msg”部分的长度(
len
)。 - msg 部分之前的最后四个字节是一个引用字段,它有多种用途(
ref
)。
注意:lenf
是 len 的原始格式,所以是一个字符串,我认为这并不重要。
缓冲代码
def split(data)
if ($packet_buffer != "" && !$packet_buffer.nil?)
data = $packet_buffer + data
$packet_buffer = ""
end
last = 0
packets = []
loop do
if data[last..-1].length < 8
$packet_buffer = data[last..-1]
break
end
name = data[last...last+=4]
lenf = data[last...last+4]
len = 0
data[last...last+=4].each_byte {|b| len+=b}
if !data[last+4..-1].nil? && data[last+4..-1].length < len
$packet_buffer = data
break
end
ref = data[last...last+=4]
msg = data[last...last+=len]
packets << (name << lenf << ref << msg)
break if data[last..-1].nil?
end
packets
end
TLDR
如何在 Ruby 中拆分缓冲和缓冲拆分数据包/数据(由 EventMachine 传递)?
更新:数据包通过 TCP 发送。数据来自用 C 语言制作的客户端,所以是的,它是一个字节流。
我不确定到底出了什么问题,但该方法似乎没有正确拆分或缓冲数据包。它在接收少量数据时工作正常(我假设这些数据既不是缓冲的也不是拆分的)。
有时它甚至可以成功拆分数据包,如果它们被缓冲,但缓冲似乎根本不起作用
我很确定我在这里搞砸了一些“逻辑”部分,但我就是不知道它是什么。任何帮助将不胜感激。
谢谢