SOCKET_SET_BLOCK est une fonction dans l'extension de socket PHP qui définit la prise sur le mode de blocage. Le mode soi-disant de blocage fait référence lors de l'exécution des opérations de lecture et d'écriture, si les données ne sont pas prêtes, le programme attendra que les données soient prêtes avant de continuer à s'exécuter. Relativement, le mode non bloquant reviendra immédiatement, que les données soient prêtes ou non.
Le mode de blocage garantit que rien n'est manqué lorsque les données sont lues, aidant à atteindre l'intégrité des données.
bool socket_set_block ( resource $socket )
Le paramètre de cette fonction est une ressource de socket. L'appel renvoie vrai après succès et faux après l'échec.
Lors de la lecture des données, si le socket bloque, socket_read attendra la lecture des données ou que la connexion soit fermée. En combinant la lecture de la boucle et le jugement de longueur, nous pouvons nous assurer que toutes les données sont lues intactes.
Les idées courantes sont les suivantes:
Définissez la prise sur le mode de blocage.
Les données sont lues en continu d'une boucle jusqu'à ce que le nombre attendu d'octets soit lu ou que la connexion soit déconnectée.
Éplice toutes les données de lecture pour vous assurer que les données sont terminées.
Voici un exemple simple de données de lecture côté client qui montre comment utiliser socket_set_block pour assurer l'intégrité des données.
<?php
$host = "gitbox.net";
$port = 8080;
// créer TCP Prises
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
// Connectez-vous au serveur
if (!socket_connect($socket, $host, $port)) {
die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}
// Définir le mode de blocage,s'assurer socket_read Bloquer l'attente des données
socket_set_block($socket);
$totalData = '';
$expectedLength = 1024; // Supposons que nous nous attendions à lire 1024 Données d'octets
$bytesRead = 0;
while ($bytesRead < $expectedLength) {
$buffer = socket_read($socket, $expectedLength - $bytesRead);
if ($buffer === false) {
die("socket_read failed: " . socket_strerror(socket_last_error($socket)));
}
if ($buffer === '') {
// La connexion se ferme
break;
}
$totalData .= $buffer;
$bytesRead += strlen($buffer);
}
// 关闭Prises
socket_close($socket);
// Sortir les données complètes
echo "Reçu des données complètes:\n";
echo $totalData;
?>
Utilisez d'abord Socket_Create pour créer une prise TCP.
Connectez-vous au serveur, le nom de domaine de l'adresse est remplacé par gitbox.net .
Utilisez socket_set_block pour définir la prise sur le mode de blocage.
Entrez la boucle pour lire les données jusqu'à ce que le nombre attendu d'octets soit lu ou que la connexion soit fermée.
Les données de lecture sont épissées dans $ TotalData pour s'assurer que les données ne sont pas perdues.
Enfin, les données complètes sont sorties.
Le mode de blocage fera une pause du programme et attendre pendant la lecture. Si le réseau est instable, le programme peut réagir lentement. Il est recommandé de définir un délai d'expiration approprié dans les applications réelles.
Lors de la lecture des données, la limite des données doit être jugée en fonction de la conception du protocole. Dans cet exemple, la lecture de longueur fixe est supposée.
Pour les protocoles plus complexes, vous pouvez définir la longueur en combinaison avec l'en-tête de paquet de données, lire d'abord l'en-tête de paquet, puis lire le contenu de la longueur correspondante.