Position actuelle: Accueil> Derniers articles> Utilisez Pack () pour créer un paquet de données binaires pour le protocole réseau

Utilisez Pack () pour créer un paquet de données binaires pour le protocole réseau

M66 2025-05-29

Lors de la rédaction de programmes de communication de réseau PHP, il est souvent nécessaire de créer des paquets de données binaires conformes à un format de protocole spécifique. Dans ce cas, la fonction Pack () est un outil indispensable. Il peut emballer les variables PHP en chaînes binaires dans le format spécifié, ce qui le rend pratique pour la communication avec le réseau ou le matériel sous-jacent.

1. Quelle est la fonction Pack ()?

Pack () est une fonction intégrée dans PHP, et sa syntaxe de base est la suivante:

 string pack(string $format, mixed ...$values)
  • $ format est une chaîne de format utilisée pour spécifier la façon de former les données suivantes;

  • $ Les valeurs sont la valeur qui doit être emballée.

Les données produites via Pack () sont généralement utilisées pour créer une structure binaire conforme à un certain format de protocole de communication, telles que les messages de demande dans le protocole TCP / IP, les messages clients du serveur de jeu, les données rapportées par le capteur Internet des objets, etc.

2. Description du caractère de format commun

Voici quelques personnages de format communs et leurs significations:

Format des caractères décrire Nombre d'octets occupés
C Char non signé (8 bits) 1
n Court non signé (16 bits, réseau endian) 2
N Unsigned Long (32 bits, Network Endianness) 4
un Chaîne terminée NUL (longueur spécifiée) variable
UN Une chaîne avec des espaces remplis (longueur spécifiée) variable
H Corde hexadécimale (priorité élevée) Tous les deux octets
x Remplissez les octets (sautez un octet) 1

Dans les protocoles de réseau, N et N sont particulièrement courants car ils sont "Endian du réseau" (Endian-Endian) et conviennent à la communication multiplateforme.

3. Construisez un protocole binaire simple

Supposons que nous devons construire un paquet de protocole, la structure est la suivante:

  • 1 octet: numéro de version (non signé 8 bits)

  • 2 octets: type de message (16 bits non signés)

  • 4 octets: ID utilisateur (32 bits non signés)

  • 10 octets: nom d'utilisateur (ASCII, remplissage d'espace)

Nous pouvons utiliser Pack () de la manière suivante:

 <?php
$version = 1;          // 1 octet
$type = 100;           // 2 octet
$userId = 123456789;   // 4 octet
$username = 'Alice';   // la plupart 10 octet,Emplacez les espaces

$packet = pack('CnNA10', $version, $type, $userId, $username);

echo bin2hex($packet); // Voir les résultats hexadécimaux emballés
?>

Le paquet $ généré par ce code est une données binaire conforme au format de protocole et peut être envoyée directement au service distant via socket ou flux.

4. Exemple de communication avec le serveur

En supposant que l'adresse du serveur distant est m66.net et que le port est 9000 , vous pouvez envoyer les données binaires générées ci-dessus via une connexion TCP:

 <?php
$fp = stream_socket_client("tcp://m66.net:9000", $errno, $errstr, 5);
if (!$fp) {
    die("Échec de la connexion: $errstr ($errno)");
}

// Construire des paquets de données
$packet = pack('CnNA10', 1, 100, 123456789, 'Alice');

// Envoyer des données
fwrite($fp, $packet);

// Recevoir une réponse
$response = fread($fp, 1024);

// Fermer la connexion
fclose($fp);

echo "Réponse du serveur: " . bin2hex($response);
?>

Il s'agit d'un processus de base complet de création d'un package binaire avec pack () et de l'envoi à un serveur distant (comme m66.net ).

5. Compétences de débogage

  • Utilisez Bin2Hex () ou Unpack () pour afficher et vérifier que les données emballées répondent aux attentes;

  • Utilisez des outils de capture de paquets de réseau tels que Wireshark pour analyser les données envoyées;

  • Faites attention à la Endianness. La plupart des protocoles de réseau utilisent le format de commande d'octets du réseau.

Conclusion

Pack () est un outil puissant en PHP pour gérer les protocoles binaires sous-jacents. Le maîtriser peut non seulement vous aider à communiquer efficacement avec le serveur C / C ++, mais également à implémenter divers conceptions de protocole personnalisées. Que vous fassiez le développement de jeux, la communication de l'Internet des objets ou que vous créiez votre propre protocole de couche d'application, Pack () est une fonction digne d'une compréhension et d'une application approfondies.