Beim Schreiben von PHP -Netzwerkkommunikationsprogrammen ist es häufig erforderlich, binäre Datenpakete zu erstellen, die einem bestimmten Protokollformat entsprechen. In diesem Fall ist die Pack () -Funktion ein unverzichtbares Werkzeug. Es kann PHP -Variablen im angegebenen Format in binäre Zeichenfolgen verpacken, wodurch es für die Kommunikation mit dem zugrunde liegenden Netzwerk oder der zugrunde liegenden Hardware geeignet ist.
Pack () ist eine integrierte Funktion in PHP, und seine grundlegende Syntax lautet wie folgt:
string pack(string $format, mixed ...$values)
$ format ist eine Formatzeichenfolge, mit der die Möglichkeit zum Verpacken nachfolgender Daten angegeben wird.
$ values ist der Wert, der verpackt werden muss.
Die über Pack () erstellten Daten werden normalerweise verwendet, um eine binäre Struktur zu erstellen, die einem bestimmten Kommunikationsprotokollformat entspricht, z.
Hier sind einige gemeinsame Formatfiguren und ihre Bedeutungen:
Formatzeichen | beschreiben | Anzahl der besetzten Bytes |
---|---|---|
C | Nicht signiertes Zeichen (8 Bit) | 1 |
N | Nicht signiert kurz (16-Bit, Netzwerk Endian) | 2 |
N | Nicht signiert lang (32 Bit, Netzwerk Endiangness) | 4 |
A | NUL Fertiger Zeichenfolge (angegebene Länge) | Variable |
A | Eine Zeichenfolge mit gefüllten Leerzeichen (angegebene Länge) | Variable |
H | Hexadezimale Zeichenfolge (hohe Bitpriorität) | Alle zwei Bytes |
X | Füllen Sie Bytes aus (überspringen Sie ein Byte) | 1 |
In Netzwerkprotokollen sind N und N besonders häufig, weil sie "Netzwerkendian" (Big-Endian Endian) sind und für die plattformübergreifende Kommunikation geeignet sind.
Angenommen, wir müssen ein Protokollpaket erstellen, die Struktur lautet wie folgt:
1 Byte: Versionsnummer (nicht signierte 8 Bit)
2 Bytes: Nachrichtentyp (nicht signierte 16 Bit)
4 Bytes: Benutzer -ID (nicht signierte 32 Bit)
10 Bytes: Benutzername (ASCII, Raumfüllung)
Wir können Pack () auf folgende Weise verwenden:
<?php
$version = 1; // 1 Byte
$type = 100; // 2 Byte
$userId = 123456789; // 4 Byte
$username = 'Alice'; // am meisten 10 Byte,Vollständige Räume
$packet = pack('CnNA10', $version, $type, $userId, $username);
echo bin2hex($packet); // View verpackte Hexadezimalergebnisse
?>
Das von diesem Code generierte $ -Paket sind Binärdaten, die dem Protokollformat entsprechen und direkt über Socket oder Stream an den Remote -Dienst gesendet werden können.
Unter der Annahme, dass die Remote -Server -Adresse M66.NET und der Port 9000 lautet, können Sie die oben generierten Binärdaten über eine TCP -Verbindung senden:
<?php
$fp = stream_socket_client("tcp://m66.net:9000", $errno, $errstr, 5);
if (!$fp) {
die("Verbindung ist fehlgeschlagen: $errstr ($errno)");
}
// Erstellung von Datenpaketen
$packet = pack('CnNA10', 1, 100, 123456789, 'Alice');
// Daten senden
fwrite($fp, $packet);
// Eine Antwort erhalten
$response = fread($fp, 1024);
// Schließen Sie die Verbindung
fclose($fp);
echo "Serverantwort: " . bin2hex($response);
?>
Dies ist ein vollständiger grundlegender Prozess beim Erstellen eines Binärpakets mit Pack () und dem Senden an einen Remote -Server (z. B. M66.net ).
Verwenden Sie Bin2hex () oder pack (), um anzuzeigen und zu überprüfen, ob die verpackten Daten den Erwartungen entsprechen.
Verwenden Sie Netzwerkpaket -Erfassungs -Tools wie Wireshark, um gesendete Daten zu analysieren.
Achten Sie auf die Endiangess. Die meisten Netzwerkprotokolle verwenden das Netzwerk -Byte -Bestellformat.
Pack () ist ein leistungsstarkes Werkzeug in PHP zum Umgang mit den zugrunde liegenden Binärprotokollen. Durch das Mastering können Sie nicht nur helfen, mit dem C/C ++ - Server effizient zu kommunizieren, sondern auch dabei helfen, verschiedene angepasste Protokolldesigns zu implementieren. Pack () ist eine Funktion, die einem detaillierten Verständnis und einer Anwendung verdient, ob Sie das Spielentwicklung, das Internet der Dinge durchführen oder Ihr eigenes Anwendungsschichtprotokoll erstellen.