Я реализую протокол BitTorent с помощью Java через этот spec. В разделе сообщений все сообщения фиксированной длины, кроме 2 из них; для одного из них это единственное сообщение переменной после рукопожатия, поэтому я могу проверить других и предположить, что это кусочное сообщение, когда другие сообщения не встречались. Но для следующего сообщенияРазбор сообщения переменной длины
bitfield: <len=0001+X><id=5><bitfield>
Сообщение битового может быть отправлено только сразу после того, как последовательность квитирования завершается, и, прежде чем какие-либо другие сообщения отправляются. Это необязательно, и его не нужно отправлять, если клиент не имеет частей.
Битовое сообщение представляет собой переменную длину, где X - длина битового поля. Полезная нагрузка - это битовое поле, представляющее куски, которые были успешно загружены. Высокий бит в первом байте соответствует фрагменту индекса 0. Биты, которые очищаются, указывают на недостающую часть, а биты набора указывают действительную и доступную деталь. Запасные биты в конце устанавливаются на ноль.
Недостаток неправильной длины считается ошибкой. Клиенты должны отказаться от соединения, если они получают битовые поля, которые не имеют нужного размера, или если в битовом поле установлен какой-либо из запасных бит.
Я не могу придумать способ разобрать его, если я не знаю длины; как я могу найти идентификатор в потоке байтов?
Редактировать: В полезной нагрузке битового поля есть 0 или 1 для каждой части файла торрента, длина сообщения будет меняться в зависимости от размера содержимого торрента. Поэтому я не думаю, что могу предположить, что количество штук всегда будет соответствовать 5-байтовому числу.
Пунктуация, пожалуйста! – JesperE
Эй, у него есть двоеточие! – skaffman
Я положил эту точку с запятой. : P –