Dans PHP, les fonctions SOCKET_RECVMSG et SOCKET_CMSG_SPACE sont généralement utilisées pour gérer la communication de socket sous-jacente. Lorsque nous devons traiter les messages liés au réseau, nous devons souvent traiter les en-têtes de message, les données et les informations de contrôle connexes. La fonction SOGKET_RECVMSG peut être utilisée pour recevoir des données et les stocker dans le tampon de message, et la taille de l'espace des informations de contrôle peut être calculée via socket_cmsg_space . Cet article expliquera en détail comment combiner ces deux fonctions pour calculer efficacement l'espace de message.
La fonction socket_recvmsg est une fonction de socket sous-jacente en PHP pour recevoir des messages réseau. Il peut non seulement recevoir des données, mais également des informations de contrôle des processus liées aux messages. Son prototype de fonction est le suivant:
socket_recvmsg($socket, $message, $flags);
$ socket : la prise qui doit recevoir des données.
$ Message : un tableau que les magasins ont reçu des données, contenant généralement le tampon des données.
$ drapeaux : l'indicateur qui reçoit des données, généralement une valeur entière, peut être défini sur différents indicateurs, tels que msg_peek , etc.
La fonction socket_cmsg_space est utilisée pour calculer l'espace requis lors de la réception de messages. Ceci est généralement utilisé pour calculer la taille des informations de contrôle, garantissant que nous allouons suffisamment d'espace pour les messages reçus. Le prototype est le suivant:
socket_cmsg_space($level, $type);
Niveau $ : niveau de contrôle des messages, généralement au niveau du protocole, tel que Sol_socket .
$ type : contrôle le type de message, tel que SO_RCVBUF , etc.
Lorsque vous utilisez ces deux fonctions en combinaison, nous devons d'abord utiliser socket_cmsg_space pour calculer l'espace de message de contrôle attendu. Ensuite, nous pouvons recevoir des données via socket_recvmsg et nous assurer que suffisamment de mémoire est allouée pour stocker les données et les informations de contrôle.
<?php
// Créer une douille
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
// Port de lier
socket_bind($socket, '0.0.0.0', 12345);
// L'espace requis pour calculer les informations de contrôle du message
$level = SOL_SOCKET;
$type = SO_RCVBUF;
$control_space = socket_cmsg_space($level, $type);
// Calculez l'espace tampon requis pour recevoir des messages
$buffer_size = 1024 + $control_space;
// Créer un tampon de message
$message = socket_cmsg_space($level, $type);
$buffer = str_repeat("\0", $buffer_size);
// utiliser socket_recvmsg Recevoir des données
$bytes_received = socket_recvmsg($socket, $message, 0);
// Traiter les données reçues
if ($bytes_received !== false) {
echo "Reçu $bytes_received Données d'octets: " . bin2hex($message) . PHP_EOL;
} else {
echo "Recevoir des données失败: " . socket_strerror(socket_last_error($socket)) . PHP_EOL;
}
// Fermez la douille
socket_close($socket);
?>
Dans l'exemple ci-dessus, nous créons d'abord une prise UDP et lions un port. Ensuite, nous utilisons la fonction socket_cmsg_space pour calculer l'espace requis pour recevoir des informations de contrôle et calculer la taille totale du tampon en fonction de cet espace. Enfin, utilisez la fonction socket_recvmsg pour recevoir les données et les stocker dans la variable Message $ .
En combinant les fonctions socket_recvmsg et socket_cmsg_space , nous pouvons nous assurer qu'il existe suffisamment d'espace pour stocker les données et contrôler les informations lors de la réception de données réseau. La fonction socket_cmsg_space est particulièrement utile car elle nous aide à calculer l'espace qui doit être alloué pour les informations de contrôle, tandis que socket_recvmsg est utilisé pour la réception réelle des messages. Ces deux fonctions peuvent se combiner pour nous permettre de gérer la communication du réseau sous-jacente de manière plus flexible et efficace.
Si vous avez des demandes plus élevées pour la communication sous-jacente de socket, en comprenant comment ces deux fonctions peuvent vous aider à mieux recevoir et à traiter les messages.