Lors de la programmation des réseaux utilisant PHP, Socket_Recv est une fonction couramment utilisée pour lire les données d'une prise connectée. Cependant, nous rencontrons parfois des situations où aucune donnée n'est reçue après avoir appelé Socket_Recv , ce qui fait que le programme ne fonctionne pas correctement. Cet article analysera les causes possibles de cette situation en profondeur et donnera des solutions correspondantes.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'gitbox.net', 80);
$buffer = '';
$bytes = socket_recv($socket, $buffer, 2048, 0);
if ($bytes === false) {
echo "socket_recv erreur: " . socket_strerror(socket_last_error($socket));
} elseif ($bytes === 0) {
echo "La connexion est fermée,Aucune réception de données";
} else {
echo "Reçu {$bytes} Données d'octets: " . $buffer;
}
socket_close($socket);
Ici, l'accent est mis sur la valeur de retour de $ octets :
Entier positif: les données ont été reçues avec succès, indiquant le nombre d'octets reçus.
0: L'autre partie a clôturé la connexion et il n'y avait pas de données.
Faux : une erreur s'est produite.
C'est la situation la plus courante. Si le pair (serveur ou client) n'envoie aucune donnée, socket_recv ne peut naturellement pas recevoir le contenu. Dans la programmation réseau, les deux parties doivent envoyer et recevoir des données strictement conformes à l'accord.
Bien que Socket_Connect soit appelé, la connexion peut ne pas être vraiment établie ou bloquée par le périphérique réseau intermédiaire. À l'heure actuelle, l'opération de lecture ne peut renvoyer aucune donnée.
Lors de l'appel Socket_recv , si la longueur du tampon est définie trop petite ou que les paramètres d'indicateur de lecture sont incorrects, les données peuvent ne pas être lues.
En mode blocage, socket_recv attendra que les données arrivent avant le retour.
En mode non bloquant, socket_recv renverra immédiatement 0 ou FAUX s'il n'y a pas de données à lire (spécifiquement dépendant de l'environnement).
Si le mode non bloquant n'est pas correctement traité, il peut être mal jugé comme aucune donnée.
Des exceptions de déconnexion ou de réseau inattendu feront que socket_recv renvoie 0 ou false et ne peut pas recevoir de données.
Les connexions et les transferts de données peuvent être testés à l'aide d'outils de saisie de package tels que Wireshark ou outil de ligne de commande simple telnet gitbox.net 80 .
Utilisez socket_last_error () et socket_strorror () pour en savoir plus sur les informations d'erreur spécifiques.
$errorCode = socket_last_error($socket);
if ($errorCode !== 0) {
echo "Socket erreur码: {$errorCode},erreur信息:" . socket_strerror($errorCode);
}
Assurez-vous d'utiliser la taille du tampon appropriée et de lire les drapeaux. La taille du tampon est généralement recommandée comme étant 1024-8192 octets.
Si vous utilisez le mode non bloquant, vous pouvez revenir au test de mode de blocage:
socket_set_block($socket);
Pour éviter un blocage à long terme ou sans état de données, une logique de jugement de délai de temps et de réessayer peut être ajoutée.
La cause profonde de socket_recv ne recevant pas de données est principalement due à des problèmes de connexion réseau, le pair n'envoie pas de données ou les paramètres de paramètres de lecture sont inappropriés. En vérifiant raisonnablement l'état de la connexion, en réglant le mode de blocage et en débogage de la transmission du réseau, les problèmes peuvent être localisés et résolus efficacement. Le débogage des patients est la clé de la programmation réseau. La compréhension du protocole sous-jacent et du processus de flux de données peut considérablement améliorer l'efficacité du développement.