Partager un exemple de collage/déballage de paquets TCP TCP

藏色散人
Libérer: 2023-04-11 09:00:01
avant
6509 Les gens l'ont consulté

Cet article vous présentera un exemple de collage/déballage de paquets TCP de PHP. J'espère que cela sera utile aux amis dans le besoin ~

Partager un exemple de collage/déballage de paquets TCP TCP

tcp En mode lien long, la méthode de longueur d'en-tête de message fixe est utilisée pour le déballage des messages. . Résolvez le problème du sac collant. Le 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 commercial, 2 octets ou 4 octets, lors de la lecture du message, lisez d'abord les bits de longueur du message, puis le message peut être. lire en fonction de la longueur spécifique du message. [Apprentissage recommandé : Tutoriel vidéo PHP]

pack/unpack peut regrouper des valeurs en binaire/décompresser des valeurs 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 corps du message. La longueur peut représenter un corps de message d'une longueur maximale de 2 ^ 16 - 1. Si cela ne suffit pas, vous pouvez utiliser 4 octets.

Assemblage de paquets

<?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;
Copier après la connexion

Paquet collant

// send
// 传输 $package 由 $foo $bar 两条消息组成 模拟粘包场景
// receive
Copier après la connexion

Déballage

<?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;
Copier après la connexion

Un scénario TCP souvent rencontré dans le travail quotidien peut être le mode de message unique de connexion courte, le client ferme la connexion après l'envoi d'un message, le 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 liaison 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.

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!

Étiquettes associées:
php
source:learnku.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal