Заголовок и длина данных присутствуют в сообщениях ответа и запроса между компонентами Zabbix. Это требуется для определения длины сообщения.
<HEADER> - "ZBXD\x01" (5 байт)
<DATALEN> - размер данных (8 байт). число 1 отформатируется в 01/00/00/00/00/00/00/00 (восемь байт, 64-битное число в little-endian формате)
Чтобы не израсходовать память полностью (в теории) Zabbix протокол ограничен на прием данных только 128МБ за одно соединение.
Здесь представлены выдержки кода, которые показывают как добавить заголовок Zabbix протокола к data
, которые вы хотите отправить, чтобы получить packet
вам необходимо отправлять на Zabbix, так чтобы он интерпретировался корректным образом.
Язык | Код |
---|---|
bash | printf -v LENGTH '%016x' "${#DATA}"PACK=""for i in {14..0..-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 |