Position actuelle: Accueil> Derniers articles> La posture correcte pour l'utilisation de socket_set_block après socket_connect

La posture correcte pour l'utilisation de socket_set_block après socket_connect

gitbox 2025-05-26

1. Relation entre socket_connect et mode de blocage

Par défaut, les prises en PHP sont en mode de blocage, l'appel Socket_Connect bloquera jusqu'à ce que la connexion soit réussie ou échouée à revenir. Mais si vous souhaitez vous assurer que les opérations de lecture et d'écriture suivantes restent bloquées après la connexion, vous pouvez utiliser socket_set_block pour le définir explicitement.

Il convient de noter que socket_set_block doit être appelé après socket_connect pour prendre effet. parce que:

  • Réglage du mode de blocage avant l'établissement de connexion peut être réinitialisé par socket_connect .

  • Le réglage après la connexion garantit que toutes les opérations suivantes sont en mode de blocage.


2. Exemple d'appel correct à socket_set_block

Voici un exemple complet montrant comment appeler socket_set_block une fois une connexion réussie:

 <?php
// Créer un TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create échouer: " . socket_strerror(socket_last_error()) . "\n");
}

// Connectez-vous au serveur
$address = 'gitbox.net';
$port = 80;
if (!socket_connect($socket, $address, $port)) {
    die("socket_connect échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// Après une connexion réussie,Définir le mode de blocage
if (!socket_set_block($socket)) {
    die("socket_set_block échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// Maintenant socket C&#39;est bloqué,Les opérations de lecture et d&#39;écriture peuvent être effectuées
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));

// Lisez la réponse
$response = '';
while ($out = socket_read($socket, 2048)) {
    $response .= $out;
}

// fermeture socket
socket_close($socket);

// Réponse de sortie
echo $response;
?>

3. Points à noter

  • Assurez-vous que socket_set_block est appelé après que socket_connect réussisse pour éviter de le régler après la défaillance de la connexion.

  • socket_set_block renvoie une valeur booléenne et le message d'erreur peut être obtenu via socket_last_error en cas d'échec.

  • Si vous appelez socket_set_block avant la connexion, il peut être écrasé par des appels internes pendant la connexion, ce qui entraîne des paramètres de blocage non valides.

  • Le mode de socket par défaut de PHP est généralement bloque, mais dans certains scénarios (tels que socket_set_nonblock qui a été appelé auparavant), il doit être réinitialisé au blocage.


En résumé, si vous souhaitez vous assurer que le mode de blocage prend effet, la clé consiste à appeler socket_set_block après le succès de socket_connect , afin de s'assurer que les opérations de lecture et d'écriture ultérieures sont effectuées de manière bloquante, évitant ainsi des problèmes communs tels que l'incapacité à lire les données ou à ne pas écrire de mode non bloquant.