Áú»¢¶Ä²©

This is a translation of the original English documentation page. Help us make it better.

6 Cap?alera

Vista general

La cap?alera ¨¦s present a tots els missatges de petici¨® i de resposta entre els components de Áú»¢¶Ä²©. ?s necessari determinar la longitud del missatge, si ¨¦s comprimit o no, i si ¨¦s o no un paquet gros.

El protocol de comunicacions de Áú»¢¶Ä²© tenen una mida limitada de paquet d'1Go per connexi¨®. El l¨ªmit d'1Go s'aplica tant a la longitud de les dades del paquet rebut com a la de les dades no comprimides.

Quan s'envia la configuraci¨® al proxy de Áú»¢¶Ä²©, el l¨ªmit de mida del paquet s'incrementa a 4Go per permetre sincronitzar configuracions grans. Quan la longitud de les dades abans de la compressi¨® passa de 4Go, el servidor de Áú»¢¶Ä²© engega autom¨¤ticament l'¨²s de format de paquets grans (flag 0x04), que augmenta el l¨ªmit de la mida del paquet a 16Go.

Veieu que mentre un format de gran paquet pot emprar-se per enviar qualsevol informaci¨®, actualment nom¨¦s el sincronitzar de configuraci¨® del proxy Áú»¢¶Ä²© pot manejar els paquets superiors a 1Go.

Estructura

La cap?alera es composa de quatre camps. Tots els nombres de la cap?alera s¨®n amb format little-endian.

Camp Mida Mida
(paquet gros)
¶Ù±ð²õ³¦°ù¾±±è³¦¾±¨®
<PROTOCOL> 4 4 "ZBXD" or 5A 42 58 44
<FLAGS> 1 1 Indicadors de protocol:
0x01 - Protocol de comunicacions Áú»¢¶Ä²©
0x02 - compressi¨®
0x04 - paquet gros
<DATALEN> 4 8 Longitud de les dades.
<RESERVED> 4 8 Quan la compressi¨® sigui emprada (0x02 flag) - la longitud de les dades no comprimides
Quan no s'empra la compressi¨® - 00 00 00 00

Exemples

Aqu¨ª hi ha alguns extractes de codi que ensenyen com afegir una cap?alera de protocol Áú»¢¶Ä²© a les dades que volem enviar dins l'ordre per obtindre el paquet que hem d'enviar a Áú»¢¶Ä²©, per tal que sigui interpretat correctament. Aquestes mostres de codi suposen que les dades no s¨®n superiors a 1Go i, per tant, el format de paquet gros no s'empra pas.

Python
packet = b"ZBXD\1" + struct.pack("<II", len(data), 0) + data

or

def zbx_create_header(plain_data_size, compressed_data_size=None):
           protocol = b"ZBXD"
           flags = 0x01
           if compressed_data_size is None:
               datalen = plain_data_size
               reserved = 0
           else:
               flags |= 0x02
               datalen = compressed_data_size
               reserved = plain_data_size
           return protocol + struct.pack("<BII", flags, datalen, reserved)
       
       packet = zbx_create_header(len(data)) + data
Perl
my $packet = "ZBXD\1" . pack("(II)<", length($data), 0) . $data;

or

sub zbx_create_header($;$)
       {
           my $plain_data_size = shift;
           my $compressed_data_size = shift;
       
           my $protocol = "ZBXD";
           my $flags = 0x01;
           my $datalen;
           my $reserved;
       
           if (!defined($compressed_data_size))
           {
               $datalen = $plain_data_size;
               $reserved = 0;
           }
           else
           {
               $flags |= 0x02;
               $datalen = $compressed_data_size;
               $reserved = $plain_data_size;
           }
       
           return $protocol . chr($flags) . pack("(II)<", $datalen, $reserved);
       }
       
       my $packet = zbx_create_header(length($data)) . $data;
PHP
$packet = "ZBXD\1" . pack("VV", strlen($data), 0) . $data;

or

function zbx_create_header($plain_data_size, $compressed_data_size = null)
       {
           $protocol = "ZBXD";
           $flags = 0x01;
           if (is_null($compressed_data_size))
           {
               $datalen = $plain_data_size;
               $reserved = 0;
           }
           else
           {
               $flags |= 0x02;
               $datalen = $compressed_data_size;
               $reserved = $plain_data_size;
           }
           return $protocol . chr($flags) . pack("VV", $datalen, $reserved);
       }
       
       $packet = zbx_create_header(strlen($data)) . $data;
Bash
datalen=$(printf "%08x" ${#data})
       datalen="\\x${datalen:6:2}\\x${datalen:4:2}\\x${datalen:2:2}\\x${datalen:0:2}"
       printf "ZBXD\1${datalen}\0\0\0\0%s" "$data"