Итак, я думаю, что это немного широко, но я постараюсь сузить это настолько, насколько смогу. У меня есть сервер (с EventMachine), и иногда пакеты делятся, но иногда они буферизируются. Итак, я попытался создать функцию, которая будет буферизовать / снять с них буфер. Мне удалось что-то сделать, однако это не работает «как ожидалось». Честно говоря, я сомневаюсь, что могу даже назвать это «едва функциональным».
Прежде всего я хотел бы указать на структуру пакета:
- Первые четыре байта пакета - это его идентификатор или имя пакета (
name
).
- Следующие четыре байта являются длиной части пакета «msg» (
len
).
- И последние четыре байта перед частью сообщения - это поле ссылки, которое имеет различное использование (
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
Как разделить буферизованный и разделить буфер пакетов / данных (переданных EventMachine) в Ruby?
Обновление: Пакеты отправляются по TCP. Данные поступают от клиента, созданного на C, так что да, это поток байтов.
Я не уверен, что именно не так, но метод, похоже, не разделяет и не буферизует пакеты должным образом. Он отлично работает, пока получает небольшие объемы данных (которые, я полагаю, не буферизируются и не разделяются).
Иногда он даже успешно разделяет пакеты, если они буферизируются, но, похоже, буферизация не работает вообще
Я вполне уверен, что я испортил некоторую часть "логики" здесь, однако я просто не могу понять, что это такое. Любая помощь будет принята с благодарностью.
Спасибо