Dans la programmation réseau, la transmission des données doit suivre strictement le format de protocole pour s'assurer que les extrémités d'envoi et de réception peuvent analyser correctement les données. La fonction Pack () dans PHP peut nous aider les données de package dans les chaînes binaires au format spécifié, tandis que socket_sendto () est utilisé pour envoyer des données à des adresses spécifiées via le protocole UDP. Cet article expliquera comment utiliser ces deux fonctions en combinaison pour réaliser l'emballage et l'envoi de données.
La fonction Pack () convertit les variables PHP en chaînes binaires en fonction du code de format spécifié. Par exemple:
$data = pack("Nn", 12345, 80);
Ici "nn" signifie:
N : entier long non signé (32 bits, Endianness Network, c'est-à-dire Big Endianness)
N : entier court non signé (16 bits, réseau endian)
Package entiers 12345 et 80 dans une chaîne binaire pour une transmission facile sur le réseau.
socket_sendto () est principalement utilisé pour que UDP puisse envoyer des données, et la signature de la fonction est la suivante:
int socket_sendto(resource $socket, string $buf, int $len, int $flags, string $addr, int $port)
$ socket : ressource de socket créée via socket_create ()
$ buf : les données à envoyer
$ Len : longueur des données envoyées
$ drapeaux : drapeau, généralement réglé sur 0
$ addr : adresse IP de destination
$ port : port cible
Supposons que nous devons envoyer un paquet contenant "ID de message" et "code d'état", l'ID de message est utilisé comme entier de 4 octets, et le code d'état est utilisé comme entier de 2 octets.
<?php
// créer UDP Socket
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()));
}
// Préparer les données:informationIDet code d'état
$messageId = 1001; // 4 Entier d'octet
$statusCode = 200; // 2 Entier d'octet
// utiliser pack() Données de l'emballage de fonction,Commande d'octet de réseau(Big endian)
$data = pack("Nn", $messageId, $statusCode);
// Adresse et port de destination
$ip = "m66.net";
$port = 12345;
// Envoyer des données
$sent = socket_sendto($socket, $data, strlen($data), 0, $ip, $port);
if ($sent === false) {
echo "socket_sendto() failed: " . socket_strerror(socket_last_error($socket));
} else {
echo "Envoyé avec succès {$sent} Données d'octets à {$ip}:{$port}\n";
}
// fermeture socket
socket_close($socket);
?>
Grâce à la fonction Pack () , nous pouvons coder de manière flexible divers types de données dans des formats binaires qui répondent aux exigences des protocoles de réseau. Combiné avec socket_sendto () , les données emballées peuvent être envoyées au serveur spécifié via le protocole UDP pour obtenir une communication réseau efficace.