ru:manual:appendix:protocols:header_datalen

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
ru:manual:appendix:protocols:header_datalen [2018/06/26 06:31]
127.0.0.1 external edit
ru:manual:appendix:protocols:header_datalen [2019/12/02 07:24] (current)
Line 3: Line 3:
 === Обзор === === Обзор ===
  
-Заголовок ​и длина данных ​присутствуют в сообщениях ответа и запроса между компонентами Zabbix. Это требуется для определения длины сообщения. +Заголовок присутствует в сообщениях ответа и запроса между компонентами Zabbix. Это требуется для определения длины сообщения. ​Заголовок состоит из:
 <​code>​ <​code>​
-<HEADER> - "ZBXD\x01" (байт) +<ПРОТОКОЛ> - "​ZBXD"​ (байта)
-<DATALEN> - размер данных (байт). число 1 отформатируется в 01/​00/​00/​00/​00/00/00/00 (восемь байт, ​64-битное число в little-endian формате)+<​ФЛАГИ>​ - флаги протокола,​ (1 байт). 0x01 - Протокол передачи данных Zabbix, 0x02 - сжатие. 
 +<ДЛИНА_ДАННЫХ> - размер данных (байта). число 1 форматируется в 01/00/00/00 (четыре байта32-битное число в little-endian формате)
 +<​ЗАРЕЗЕРВИРОВАНО>​ - зарезервировано для расширений протокола (4 байта).
 </​code>​ </​code>​
 +
 +Когда включено сжатие (флаг 0x02), <​ЗАРЕЗЕРВИРОВАНО>​ байты содержит размер данных без сжатия,​ 32-битное число в little-endian формате.
  
 Чтобы не израсходовать память полностью (в теории) Zabbix протокол ограничен на прием данных только 128МБ за одно соединение. Чтобы не израсходовать память полностью (в теории) Zabbix протокол ограничен на прием данных только 128МБ за одно соединение.
 +
 +=== Реализация ===
 +
 +Здесь представлены выдержки кода, которые показывают как добавить заголовок Zabbix протокола к ''​data'',​ которые вы //​хотите//​ отправить,​ чтобы получить ''​packet''​ вам //​необходимо//​ отправлять на Zabbix, так чтобы он интерпретировался корректным образом.
 +
 +^Язык^Код^
 +|bash|<​code bash>
 +printf -v LENGTH '​%016x'​ "​${#​DATA}"​
 +PACK=""​
 +for (( i=14; i>=0; i-=2 )); do PACK="​$PACK\\x${LENGTH:​$i:​2}";​ done
 +printf "​ZBXD\1$PACK%s"​ "​$DATA"​
 +</​code>​|
 +|Java|<​code 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);​
 +</​code>​|
 +|PHP|<​code PHP>
 +$packet = "​ZBXD\1"​ . pack('​P',​ strlen($data)) . $data;
 +</​code>​или<​code PHP>
 +$packet = "​ZBXD\1"​ . pack('​V',​ strlen($data)) . "​\0\0\0\0"​ . $data;
 +</​code>​|
 +|Perl|<​code Perl>
 +my $packet = "​ZBXD\1"​ . pack('<​Q',​ length($data)) . $data;
 +</​code>​или<​code Perl>
 +my $packet = "​ZBXD\1"​ . pack('​V',​ length($data)) . "​\0\0\0\0"​ . $data;
 +</​code>​|
 +|Python|<​code Python>
 +packet = "​ZBXD\1"​ + struct.pack('<​Q',​ len(data)) + data
 +</​code>​|
 +