Aktueller Standort: Startseite> Neueste Artikel> Verwenden Sie Pack (), um Rohdaten in Verbindung mit stream_socket_client () zu senden.

Verwenden Sie Pack (), um Rohdaten in Verbindung mit stream_socket_client () zu senden.

M66 2025-06-04

In der Netzwerkprogrammierung müssen wir manchmal rohe binäre Daten an einen Remote -Server senden, insbesondere bei der Implementierung bestimmter Protokolle. PHP bietet ein sehr leistungsstarkes Funktionspaket () , mit dem Daten in einem bestimmten Format in binäre Zeichenfolgen packen können. In Kombination mit stream_socket_client () können wir diese Rohdaten problemlos über eine TCP- oder UDP -Verbindung senden.

In diesem Artikel wird detailliert eingeführt, wie Pack () -Funktion von PHP verwendet wird, um Daten zu verpacken und an den angegebenen Server über stream_socket_client () an den angegebenen Server zu senden.


1. Einführung in die Funktion pack ()

Die Funktion Pack () wird verwendet, um Daten in binäre Zeichenfolgen umzuwandeln. Sein erster Parameter ist die Formatzeichenfolge, und nachfolgende Parameter sind die zu verpackten Daten. Die Formatzeichenfolge enthält verschiedene Formatcodes, wie z. B.:

  • C - Unsignierte Zeichen (1 Byte)

  • n - nicht signierte kurze Ganzzahl (2 Bytes, großer Endian)

  • N - nicht signiert lang (4 Bytes, Big Endian)

  • A - NUL Charakter gefüllte Zeichenfolge

  • A - Platz gefüllte Schnur

Zum Beispiel:

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

Hier ist 0x01 ein Byte, und 300 und 400 sind beide 2 Byte nicht signierte Ganzzahlen.


2. Einführung in stream_socket_client ()

Stream_Socket_Client () wird verwendet, um eine Netzwerkverbindung für den Client zu erstellen und kann TCP, UDP und andere Protokolle unterstützen. Häufige Syntaxe sind wie folgt:

 $socket = stream_socket_client("tcp://m66.net:12345", $errno, $errstr, 30);
  • Der erste Parameter ist die Adresse, das Format lautet TCP: // Domänenname: Port

  • Die Verbindung gibt die Ressource erfolgreich zurück und der Fehler gibt falsche zurück

  • $ errno und $ errstr gibt Fehlercodes und Fehlermeldungen zurück

  • Der letzte Parameter ist die Zeitüberschreitungszeit (Sekunden)

Durch diese Verbindung können wir FWRite () verwenden, um Daten zu senden und Fread () zu erhalten, um Daten zu empfangen.


3. Beispiel: Paketdaten mit pack () und senden

Angenommen, wir müssen ein Protokollpaket an den Server senden. Das Format lautet wie folgt:

  • 1 Byte -Befehlscode, auf 0x10 behoben

  • 2 Bytes der Benutzer -ID, Big Endian

  • 4 Byte Timestamp, Big Endian

  • 8 Byte -Zeichenfolge (wenn weniger als 8 Bytes, Space Polsterung)

Beispiel für PHP -Code:

 <?php

// Zielserverinformationen
$host = "m66.net";
$port = 12345;

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

// Daten vorbereiten
$command = 0x10;
$userId = 1025;
$timestamp = time();
$username = "user123";

// Verpackungsdaten
// C - 1Byte unsigned Ganzzahl
// n - 2Byte nicht signierte kurze Ganzzahl(Big Endian)
// N - 4Byte unsigned Long Ganzzahl(Big Endian)
// A8 - Die Länge ist8Saite,Raumfüllung
$packedData = pack('CnNA8', $command, $userId, $timestamp, $username);

// Daten senden
fwrite($socket, $packedData);

// Serverantwort lesen(Angenommen, der Server wird zurückgegeben 4 Byte -Antwortcode)
$response = fread($socket, 4);
if ($response !== false) {
    $responseCode = unpack('N', $response)[1];
    echo "Server -Antwortcode: $responseCode\n";
} else {
    echo "Keine Serverantwort empfangen\n";
}

fclose($socket);

4. Zusammenfassung der wichtigsten Punkte

  • Mit Pack () können verschiedene Datentypen einfach in binäre Daten umwandeln, die für die Netzwerkübertragung geeignet sind.

  • Stream_Socket_Client () wird verwendet, um Netzwerkverbindungen zu erstellen und mehrere Protokolle zu unterstützen.

  • Stellen Sie beim Senden von Binärdaten sicher, dass beide Parteien das Protokollformat konsequent verstehen, insbesondere die Datenlänge und die Byte -Reihenfolge.

  • Beim Lesen von Daten sollte expack () auch verwendet werden, um die ursprünglichen binären Daten zu analysieren.