Maison  >  Article  >  développement back-end  >  php - exemple de collage/déballage de paquets TCP

php - exemple de collage/déballage de paquets TCP

步履不停
步履不停original
2019-06-29 17:54:122733parcourir

php - exemple de collage/déballage de paquets TCP

En mode lien long TCP, la longueur d'en-tête de message fixe est utilisée pour le déballage du message afin de résoudre le problème persistant.

Protocole d'en-tête de message fixe

fixe les N premiers octets de l'en-tête du message comme bits de longueur du message. Combiné avec le scénario métier, 2 octets ou 4 octets, lors de la lecture du message, lisez la longueur du message. bit en premier. Vous pouvez lire le contenu du message en fonction de la longueur spécifique du message.

pack/unpack peut regrouper les valeurs en binaire/décompresser les binaires en valeurs. Pour des modes spécifiques, veuillez vous référer à l'utilisation détaillée de pack/unpack. Ici, nous choisissons une longueur d'en-tête fixe de 2 octets pour représenter le. longueur du corps du message. Le maximum peut représenter 2 ^16 - 1 longueur du corps du message, si cela ne suffit pas, vous pouvez utiliser 4 octets.

Paquets groupés

<?php// msg protocol// | ---- dataLen ---- | data |// | - fixed 2bytes  - |// 模拟客户端连续发送2条消息$foo = "hello world";
$bar = "i am sqrt_cat";
$package = "";// 使用 n 打包 固定2bytes$fooLenn = pack("n", strlen($foo));
$package = $fooLenn . $foo;
$barLenn = pack("n", strlen($bar));
$package .= $barLenn . $bar;

Paquets bâtons

// send// 传输 $package 由 $foo $bar 两条消息组成 模拟粘包场景
// receive

Déballer

<?php
// 解析第1条消息 取前 2bytes 按 n 解包
$fooLen = unpack("n", substr($package, 0, 2))[1];
// 使用包消息体长度定义读取消息体
// 从第 3byte 开始读 前 2bytes表示长度
$foo = substr($package, 2, $fooLen);
echo $foo . PHP_EOL;

// 解析第2条消息 取前 2bytes 按 n 解包
// 0 ~ (2 + fooLen) - 1 字节序为 fooLen . foo
// (2 + fooLen) ~ (2 + fooLen) + 2 - 1 为 barLen
$barLen = unpack("n", substr($package, (2 + $fooLen), 2))[1];
$bar    = substr($package, (2 + $fooLen) + 2, $barLen);
echo $bar . PHP_EOL;

Un scénario TCP souvent rencontré dans le travail quotidien peut être le mode de connexion courte à un seul message, le client ferme la connexion après l'envoi d'un message et le serveur lit EOF en boucle pour obtenir un message complet. Cependant, s'il y a plusieurs messages dans une connexion courte ou dans un mode de connexion longue, des paquets persistants peuvent se produire et le client ne peut pas confirmer que le message a été lu via EOL sans fermer le serveur. Cela nécessite de définir des protocoles et de déballer.

Pour plus d'articles techniques liés à PHP, veuillez visiter la colonne Tutoriel PHP pour apprendre !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn