Position actuelle: Accueil> Derniers articles> Utilisez Pack () pour envoyer des données brutes en conjonction avec Stream_Socket_Client ()

Utilisez Pack () pour envoyer des données brutes en conjonction avec Stream_Socket_Client ()

M66 2025-06-04

Dans la programmation réseau, nous devons parfois envoyer des données binaires brutes à un serveur distant, en particulier lors de l'implémentation de certains protocoles. PHP fournit un pack de fonctions très puissant () qui peut emballer les données en chaînes binaires dans un format spécifié. Combiné avec Stream_Socket_Client () , nous pouvons facilement envoyer ces données brutes sur une connexion TCP ou UDP.

Cet article introduira en détail comment utiliser la fonction PHP Pack () pour emballer les données et l'envoyer au serveur spécifié via Stream_Socket_Client () .


1. Fonction Introduction à Pack ()

La fonction Pack () est utilisée pour convertir les données en chaînes binaires. Son premier paramètre est la chaîne de format, et les paramètres suivants sont les données à emballer. La chaîne de format contient divers codes de format, tels que:

  • C - caractères non signés (1 octet)

  • n - entier court non signé (2 octets, grand endian)

  • N - unsigned long (4 octets, Big Endian)

  • une chaîne remplie de caractères NUL

  • A - chaîne remplie d'espace

Par exemple:

 $data = pack('Cnn', 0x01, 300, 400);

Ici, 0x01 est un octet, et 300 et 400 sont des entiers non signés de 2 octets.


2. Introduction à stream_socket_client ()

Stream_Socket_Client () est utilisé pour créer une connexion réseau pour le client et peut prendre en charge TCP, UDP et d'autres protocoles. Les syntaxes courantes sont les suivantes:

 $socket = stream_socket_client("tcp://m66.net:12345", $errno, $errstr, 30);
  • Le premier paramètre est l'adresse, le format est tcp: // nom de domaine: port

  • La connexion renvoie la ressource avec succès et l'échec renvoie faux

  • $ errno et $ errstr renverra les codes d'erreur et les messages d'erreur

  • Le dernier paramètre est le temps mort (secondes)

Grâce à cette connexion, nous pouvons utiliser fWrite () pour envoyer des données et Fread () pour recevoir des données.


3. Exemple: données de package avec pack () et envoyer

Supposons que nous devons envoyer un paquet de protocole au serveur, le format est le suivant:

  • Code de commande de 1 octet, fixé à 0x10

  • 2 octets d'identification utilisateur, Big Endian

  • Timestamp de 4 octets, Big Endian

  • Chaîne de 8 octets (si moins de 8 octets, rembourrage d'espace)

Exemple de code PHP:

 <?php

// Informations sur le serveur cible
$host = "m66.net";
$port = 12345;

// créer TCP connecter
$socket = stream_socket_client("tcp://$host:$port", $errno, $errstr, 10);
if (!$socket) {
    die("connecter失败: $errstr ($errno)\n");
}

// Préparer les données
$command = 0x10;
$userId = 1025;
$timestamp = time();
$username = "user123";

// Données d&#39;emballage
// C - 1Octet entier non signé
// n - 2Octet entier court non signé(Big endian)
// N - 4Octet entier long non signé(Big endian)
// A8 - La longueur est8chaîne,Remplissage d&#39;espace
$packedData = pack('CnNA8', $command, $userId, $timestamp, $username);

// Envoyer des données
fwrite($socket, $packedData);

// Lire la réponse du serveur(Supposons que le serveur reviendra 4 Code de réponse des octets)
$response = fread($socket, 4);
if ($response !== false) {
    $responseCode = unpack('N', $response)[1];
    echo "Code de réponse du serveur: $responseCode\n";
} else {
    echo "Aucune réponse du serveur reçu\n";
}

fclose($socket);

4. Résumé des points clés

  • L'utilisation de Pack () peut facilement convertir divers types de données en données binaires, adaptées à la transmission du réseau.

  • Stream_Socket_Client () est utilisé pour créer des connexions réseau et prend en charge plusieurs protocoles.

  • Lors de l'envoi de données binaires, assurez-vous que les deux parties comprennent le format de protocole de manière cohérente, en particulier la longueur des données et l'ordre des octets.

  • Lors de la lecture des données, unback () doit également être utilisé pour analyser les données binaires d'origine.