4 Длина заголовка и данных

Обзор

Заголовок присутствует в сообщениях ответа и запроса между компонентами Zabbix. Это требуется для определения длины сообщения. Заголовок состоит из:

<ПРОТОКОЛ> - "ZBXD" (4 байта).
       <ФЛАГИ> - флаги протокола, (1 байт). 0x01 - Протокол передачи данных Zabbix, 0x02 - сжатие.
       <ДЛИНА_ДАННЫХ> - размер данных (4 байта). число 1 форматируется в 01/00/00/00 (четыре байта, 32-битное число в little-endian формате).
       <ЗАРЕЗЕРВИРОВАНО> - зарезервировано для расширений протокола (4 байта).

Когда включено сжатие (флаг 0x02), <ЗАРЕЗЕРВИРОВАНО> байты содержит размер данных без сжатия, 32-битное число в little-endian формате.

Чтобы не израсходовать память полностью (в теории) Zabbix протокол ограничен на прием данных только 128МБ за одно соединение.

Реализация

Здесь представлены выдержки кода, которые показывают как добавить заголовок Zabbix протокола к data, которые вы хотите отправить, чтобы получить packet вам необходимо отправлять на Zabbix, так чтобы он интерпретировался корректным образом.

Язык Код
bash printf -v LENGTH '%016x' "${#DATA}"PACK=""for (( i=14; i>=0; i-=2 )); do PACK="$PACK\\x${LENGTH:$i:2}"; doneprintf "ZBXD\1$PACK%s" "$DATA"
Java byte[] header = new byte[] {'Z', 'B', 'X', 'D', '\1',(byte)(data.length & 0xFF),(byte)((data.length >> 8) & 0xFF),(byte)((data.length >> 16) & 0xFF),(byte)((data.length >> 24) & 0xFF),'\0', '\0', '\0', '\0'};| |<|byte[] packet = new byte[header.length + data.length];System.arraycopy(header, 0, packet, 0, header.length);System.arraycopy(data, 0, packet, header.length, data.length);
PHP $packet = "ZBXD\1" . pack('P', strlen($data)) . $data;или$packet = "ZBXD\1" . pack('V', strlen($data)) . "\0\0\0\0" . $data;
Perl my $packet = "ZBXD\1" . pack('<Q', length($data)) . $data;илиmy $packet = "ZBXD\1" . pack('V', length($data)) . "\0\0\0\0" . $data;
Python packet = "ZBXD\1" + struct.pack('<Q', len(data)) + data