というわけで、ちょっと大雑把ですが、できる限り絞ってみます。サーバー (EventMachine を使用) があり、パケットが分割されることもありますが、バッファリングされることもあります。そこで、それらをバッファリング/アンバッファリングする関数を作成してみました。私は何かを作ることができましたが、それは「期待どおり」に機能していません. 正直なところ、「ほとんど機能していない」とは言えません。
何よりもまず、パケット構造を指摘したいと思います。
- パケットの最初の 4 バイトは、その ID またはパケットの名前です (
name
)。 - 次の 4 バイトは、パケットの「msg」部分の長さです (
len
)。 - また、msg 部分の前の最後の 4 バイトは参照フィールドで、さまざまな用途があります (
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 で作成されたクライアントから取得されるため、バイト ストリームです。
正確に何が問題なのかはわかりませんが、このメソッドはパケットを適切に分割またはバッファリングしていないようです。少量のデータを受信している間は問題なく動作します(バッファリングも分割もされていないと思います)。
パケットがバッファリングされている場合、パケットを正常に分割することさえありますが、バッファリングがまったく機能していないようです
ここで「ロジック」の一部を台無しにしていると確信していますが、それが何であるかはわかりません。どんな助けでも大歓迎です。
ありがとう