Décoder un websocket cadre
Je suis en train de décoder un websocket image, mais je ne suis pas de succès quand il s'agit de décodage de l'étendue de la charge utile. Voici ce que j'ai fait jusqu'à présent:
char *in = data;
char *buffer;
unsigned int i;
unsigned char mask[4];
unsigned int packet_length = 0;
int rc;
/* Expect a finished text frame. */
assert(in[0] == '\x81');
packet_length = ((unsigned char) in[1]) & 0x7f;
mask[0] = in[2];
mask[1] = in[3];
mask[2] = in[4];
mask[3] = in[5];
if (packet_length <= 125) { **//This decoding works**
/* Unmask the payload. */
for (i = 0; i < packet_length; i++)
in[6 + i] ^= mask[i % 4];
rc = asprintf(&buffer, "%.*s", packet_length, in + 6);
} else
if (packet_length == 126) { **//This decosing does NOT work**
/* Unmask the payload. */
for (i = 0; i < packet_length; i++)
in[8 + i] ^= mask[i % 4];
rc = asprintf(&buffer, "%.*s", packet_length, in + 8);
}
Ce que je fais mal? Comment puis-je encoder l'étendue de la charge utile?
Vous devez vous connecter pour publier un commentaire.
Si packet_length est de 126, 2 octets donner la longueur de la lecture des données.
Si packet_length est de 127, le 8 octets suivants donnent la longueur de données à lire.
Le masque est contenue dans les 4 octets suivants (d'après la longueur).
Le message décodé suit cette.
La données de cadrage section de la spec a une illustration intéressante de ce.
Si vous re-commander votre code à quelque chose comme
puis les choses devraient fonctionner.
Le point de friction est à > 125 octets de charge utile.
Le format est assez simple, permet de dire que vous envoyer dix un en JavaScript:
Le serveur va recevoir:
Mais maintenant, disons que vous envoyez 126 un en JavaScript:
Le serveur va recevoir:
Si la longueur de la charge utile est > 125, l'octet 1 aura la valeur 0xfe, le changement de format, puis à:
Exemple de code en C#: