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

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

藏色散人
藏色散人avant
2022-11-29 16:52:246514parcourir

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;

Paquet collant

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

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;

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer