Position actuelle: Accueil> Derniers articles> Exemple d'application pack () dans la communication de socket

Exemple d'application pack () dans la communication de socket

M66 2025-06-03

Lors de la communication de socket en PHP, nous rencontrons souvent des situations où nous devons emballer (encapsuler) et déballer les données, en particulier lorsque nous devons transférer des données dans un format binaire spécifique. La fonction Pack () est l'arme pour résoudre ce problème. Cet article combinera un exemple simple pour expliquer l'utilisation spécifique de la fonction Pack () dans la communication du socket.


Quelle est la fonction Pack ()?

Pack () est une fonction intégrée de PHP, qui peut emballer les données en chaînes binaires en fonction du format spécifié. De cette façon, les données traitées sont plus compactes et pratiques pour transmettre sur le réseau.

La syntaxe de base est:

 string pack ( string $format , mixed $args [, mixed $... ] )
  • $ Format est une chaîne de format qui définit les règles d'emballage, telles que l'entier, le caractère, le point flottant, etc.

  • Les paramètres suivants sont des données dans le format correspondant.


Pourquoi la communication du socket nécessite-t-elle Pack ()?

Pendant la communication du socket, les données sont envoyées dans un flux d'octets. L'endianité des différentes machines peut être différente et l'envoi de textes ou de données normales peut entraîner l'analyse des erreurs du récepteur.

Utilisation de pack () peut:

  • Encoder les données dans un format fixe pour vous assurer que les formats des extrémités d'envoi et de réception sont cohérents.

  • Gérer les problèmes d'endianness (Big Endian, Little Endian).

  • Générez des données binaires avec une longueur fixe pour une transmission et une analyse faciles.


Expliquez l'application de pack () dans la communication de socket avec un exemple

Supposons que nous voulons envoyer un paquet de données via une prise TCP, le format est le suivant:

Champs taper illustrer
Longueur de paquet court non signé (2 octets) Longueur du package, à l'exclusion du champ de longueur de package lui-même
Numéro de commande court non signé (2 octets) ID de commande
données Chaîne Contenu spécifique

Envoyer un exemple de code

 <?php
// Simuler les données envoyées
$command = 1001;
$data = "Hello, socket communication!";

// Calculez la longueur des données
$dataLen = strlen($data);

// La longueur du package est la longueur du numéro de commande + Durée des données (2 + $dataLen)
$packetLen = 2 + $dataLen;

// utiliser pack Longueur du package et numéro de commande(utiliser网络字节序,Big endian)
$header = pack('n', $packetLen) . pack('n', $command);

// Package complet d&#39;épissage
$packet = $header . $data;

// Supposer qu&#39;il a été établi socket connecter,socket_write Envoyer des données
// socket_write($socket, $packet, strlen($packet));

echo "发送的二进制Durée des données: " . strlen($packet) . "\n";
echo "Données binaires16Représentation de catégorie: " . bin2hex($packet) . "\n";
?>

Instructions d'analyse

  • Pack («n», $ paquetlen) signifie emballer $ paquetlen dans un entier court non signé (2 octets) et Network Endianness (Big Endian).

  • pack ('n', $ Command) De même, emballez le numéro de commande.

  • Après l'épissage, le package suit le contenu des données.

Exemple d'analyse du récepteur

Après avoir reçu les données, vous pouvez l'analyser comme ceci:

 <?php
// Hypothèses $recvData Oui de socket Lire les données binaires
// Par exemple: $recvData = socket_read($socket, 1024);

// Présente la longueur et le numéro de commande du package
$header = substr($recvData, 0, 4);
list($packetLen, $command) = array_values(unpack('npacketLen/command', $header));

// Extraire le contenu des données
$data = substr($recvData, 4, $packetLen - 2);

echo "Longueur de paquet: $packetLen\n";
echo "Numéro de commande: $command\n";
echo "Contenu de données: $data\n";
?>

résumé

  • La fonction Pack () est un outil puissant pour l'emballage de données binaires et convient à divers protocoles de réseau et opérations de fichiers binaires.

  • Dans la communication de socket, l'utilisation rationnelle de pack () peut assurer un format de données cohérent et une communication stable.

  • Combiné avec la fonction Unleback () , l'analyse de données binaires peut être facilement effectuée.

  • Portez une attention particulière au problème de l'endianness. La communication du réseau adopte généralement le réseau Endianness (Big Endianness), et il est plus courant d'utiliser le format «N» pour emballer des entiers courts.

Si vous effectuez une communication de réseau basée sur des protocoles binaires, il est fortement recommandé de pratiquer Pack () et de déballer () plus, ce qui améliorera considérablement votre capacité à traiter les paquets.