Dans PHP, lors de l'envoi de messages à l'aide de socket_sendmsg , plus d'informations de contrôle des messages (telles que des descripteurs de fichiers, etc.) peuvent être nécessaires. Pour éviter le débordement de tampon lors de l'envoi de messages, PHP fournit la fonction SOGKET_CMSG_SPACE , qui peut calculer la taille de l'espace adaptée aux informations de contrôle. Cet article discutera de plusieurs questions auxquelles il faut faire attention lors de l'utilisation de ces deux fonctions.
La fonction SOGKET_SENDMSG permet à l'utilisateur d'ajouter des informations de contrôle supplémentaires lors de l'envoi de messages. Ces informations de contrôle sont transmises à travers des «messages de contrôle», qui peuvent contenir des informations indépendantes des données elle-même, telles que l'envoi de descripteurs de fichiers, des données supplémentaires, etc.
Par exemple, dans une application, le client envoie des données via socket_sendmsg et souhaite également accompagner un descripteur de fichiers afin que le serveur puisse accéder au fichier. Socket_sendmsg doit définir correctement la structure des messages et les informations de contrôle sont transmises via les données CMSG .
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 8080);
$msg = "Hello World";
$controlData = socket_cmsg_space($socket, SOL_SOCKET, SCM_RIGHTS, strlen($msg));
// Puis utiliser socket_sendmsg Envoyer des informations sur les données et le contrôle
La fonction socket_cmsg_space renvoie la taille de l'espace tampon pouvant accueillir des informations de contrôle spécifiées. Il nous aide à réserver suffisamment d'espace pour fournir des messages de contrôle lors de l'envoi de données à l'aide de socket_sendmsg . Cette fonction est particulièrement utile car la taille du message de contrôle peut varier selon la plate-forme.
$space = socket_cmsg_space($socket, SOL_SOCKET, SCM_RIGHTS, strlen($msg));
La valeur de rendement de l'espace $ représente ici l'espace disponible lorsqu'il est passé à socket_sendmsg sur la prise actuelle, en octets.
Les informations de contrôle sont passées par une structure spéciale dans socket_sendmsg . Cette structure doit calculer l'espace approprié via socket_cmsg_space avant l'envoi.
Lors de l'envoi d'informations de contrôle à l'aide de socket_sendmsg , ces messages de contrôle doivent être construits strictement dans le format prédéterminé. Par exemple, lors de l'envoi de descripteurs de fichiers, nous devons utiliser SCM_RIGHTS comme type de message de contrôle.
$control = pack("i", $fd); // Les descripteurs de fichiers doivent être emballés au format binaire
$buf = socket_sendmsg($socket, $msg, $control, $space);
Lorsque vous utilisez socket_cmsg_space pour calculer l'espace, vous devez vous assurer qu'il y a suffisamment d'espace réservé aux informations de contrôle. S'il n'y a pas d'espace insuffisant, socket_sendmsg peut échouer ou les informations envoyées peuvent être tronquées, ce qui entraîne des messages incomplets.
D'une manière générale, lors de l'envoi de données, utilisez la fonction socket_cmsg_space pour calculer l'espace requis et lors de l'appel socket_sendmsg , assurez-vous que le tampon a été entièrement alloué.
$spaceNeeded = socket_cmsg_space($socket, SOL_SOCKET, SCM_RIGHTS, strlen($msg));
if ($spaceNeeded < strlen($control)) {
// Traitant d'un espace insuffisant
}
Dans les applications pratiques, certaines erreurs et exceptions courantes doivent être remarquées, en particulier lors de l'envoi de messages à l'aide de socket_sendmsg :
Débordement de tampon : si le calcul spatial des informations de contrôle est inexact, il peut provoquer un débordement de tampon.
Troncature du message : Le calcul inexact de la taille des informations de contrôle peut entraîner une transmission de messages incomplète.
Différences de plate-forme : différentes plates-formes peuvent avoir un traitement différent de la taille des informations de contrôle. L'utilisation de socket_cmsg_space peut assurer une compatibilité multiplateforme.
Lorsque vous envoyez des informations de contrôle à l'aide de socket_sendmsg , assurez-vous de calculer l'espace requis en fonction de la taille des données et utilisez la fonction socket_cmsg_space pour vous assurer que des tampons suffisants sont réservés.
Assurez-vous que les informations de contrôle sont du format et du type correct et sont compatibles avec le système cible.
Les conditions d'erreur et les conditions d'exception sont très importantes pour vous assurer que vous êtes pleinement préparé pour l'envoi d'échecs ou de débordements de tampon.
En utilisant correctement socket_cmsg_space et socket_sendmsg , vous pouvez transférer des données et contrôler les informations plus efficacement et en toute sécurité.