Dans PHP, socket_getsockname et socket_cmsg_space sont deux fonctions couramment utilisées lors de la programmation des réseaux à l'aide de sockets. Ils aident les développeurs à obtenir des informations détaillées sur les prises, en particulier lors de la gestion des communications réseau. Cet article présentera comment combiner ces deux fonctions pour obtenir des informations sur socket.
La fonction socket_getsockname est utilisée pour obtenir les informations d'adresse locale associées à une prise connectée. Ceci est très important pour obtenir l'état de connexion entre l'hôte actuel et l'hôte distant. La fonction est définie comme suit:
int socket_getsockname ( int $socket , string &$address , int &$port )
$ socket : est une ressource de socket valide.
$ Adresse : Renvoie l'adresse locale de la prise.
$ port : renvoie le numéro de port de la prise.
La fonction socket_cmsg_space est utilisée pour renvoyer l'espace requis pour les données de contrôle des messages actuelles (CMSG). Son objectif est de calculer la taille des données de contrôle des messages pour un protocole spécifique afin d'allouer correctement l'espace aux messages de contrôle.
int socket_cmsg_space ( int $level , int $type )
$ Niveau : Spécifie la couche de protocole, généralement Sol_Socket .
$ type : contrôle le type de message, tel que SO_RCVBUF .
Pour mieux comprendre comment ces deux fonctions sont utilisées en combinaison, voici un simple exemple de code PHP qui montre comment utiliser socket_getsockname et socket_cmsg_space pour obtenir des informations sur socket.
<?php
// Créer un TCP Prises
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "Prises创建失败: " . socket_strerror(socket_last_error()) . "\n";
exit();
}
// 绑定Prises
$address = '127.0.0.1';
$port = 8080;
if (socket_bind($socket, $address, $port) === false) {
echo "Prises绑定失败: " . socket_strerror(socket_last_error()) . "\n";
exit();
}
// 获取Prises的本地地址和端口
if (socket_getsockname($socket, $localAddress, $localPort) === false) {
echo "获取Prises信息失败: " . socket_strerror(socket_last_error()) . "\n";
} else {
echo "Prises本地地址: $localAddress\n";
echo "Prises本地端口: $localPort\n";
}
// Obtenez un espace de message de contrôle
$level = SOL_SOCKET;
$type = SO_RCVBUF;
$space = socket_cmsg_space($level, $type);
echo "Contrôlez la taille de l'espace du message: $space\n";
// 关闭Prises
socket_close($socket);
?>
Créer un socket : tout d'abord, créez une prise TCP via socket_create . AF_INET signifie l'utilisation du protocole IPv4, SOCK_stream signifie à l'aide de sockets Stream et Sol_TCP est le protocole de couche de transport.
Socket lié : utilisez Socket_Bind pour lier la prise à une adresse locale et un port spécifiques (dans cet exemple, l'adresse est 127.0.0.1 et le port est 8080 ).
Obtenez des informations sur socket : obtenez l'adresse locale et le port de la prise via la fonction socket_getsockname et sortez-le.
Calculez la taille de l'espace du message de contrôle : socket_cmsg_space calcule l'espace de message de contrôle requis et sort sa taille. Ici, nous utilisons SO_RCVBUF pour obtenir la taille du message de contrôle du tampon de réception.
Socket de fermeture : utilisez la fonction Socket_Close pour fermer la prise.
Cette combinaison de socket_getsockname et socket_cmsg_space vous permet d'obtenir des informations détaillées de manière flexible sur les sockets dans la programmation réseau, en particulier dans les scénarios suivants:
Débogage du réseau : il peut être utilisé pour déboguer les connexions de socket, obtenir des adresses et des ports locaux et aider à résoudre les problèmes de connexion.
Contrôle du flux de données : En calculant la taille de l'espace du message de contrôle, les développeurs peuvent gérer efficacement les tampons de réception et d'envoi pour assurer l'efficacité et la stabilité de la transmission des données.
Lorsque vous utilisez socket_getsockname , assurez-vous que le socket a été lié avec succès, sinon la fonction renvoie une erreur.
Lors du calcul de l'espace de message de contrôle, différentes tailles d'espace peuvent être nécessaires en fonction de différents protocoles et types de messages de contrôle, assurez-vous d'utiliser le niveau et les paramètres de type corrects.