Заголовок и длина данных присутствуют в сообщениях ответа и запроса между компонентами 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 |