Aktueller Standort: Startseite> Neueste Artikel> Die richtige Haltung für die Verwendung von Socket_Set_Block nach Socket_Connect

Die richtige Haltung für die Verwendung von Socket_Set_Block nach Socket_Connect

gitbox 2025-05-26

1. Beziehung zwischen Socket_Connect und Blockierungsmodus

Standardmäßig sind Sockets in PHP im Blockierungsmodus und das Aufrufen von Socket_Connect blockiert, bis die Verbindung erfolgreich ist oder nicht zurückgekehrt ist. Wenn Sie jedoch sicherstellen möchten, dass nachfolgende Lese- und Schreibvorgänge nach der Verbindung blockiert bleiben, können Sie Socket_Set_Block verwenden, um sie explizit festzulegen.

Es ist zu beachten, dass Socket_Set_Block nach Socket_Connect aufgerufen werden muss, um wirksam zu werden. Weil:

  • Das Einstellen des Blockierungsmodus vor dem Verbindungsaufbau kann durch socket_connect zurückgesetzt werden.

  • Die Einstellung nach der Verbindung stellt sicher, dass sich alle nachfolgenden Operationen im Blockierungsmodus befinden.


2. Beispiel eines korrekten Aufrufs bei Socket_Set_Block

Hier ist ein vollständiges Beispiel, das zeigt, wie Sie Socket_Set_Block aufrufen, nachdem eine Verbindung erfolgreich ist:

 <?php
// Erstellen a TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create scheitern: " . socket_strerror(socket_last_error()) . "\n");
}

// Stellen Sie eine Verbindung zum Server her
$address = 'gitbox.net';
$port = 80;
if (!socket_connect($socket, $address, $port)) {
    die("socket_connect scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// Nach erfolgreicher Verbindung,Setzen Sie den Blockierungsmodus
if (!socket_set_block($socket)) {
    die("socket_set_block scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// Jetzt socket Es ist blockiert,Lesen und Schreibvorgänge können durchgeführt werden
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));

// Lesen Sie die Antwort
$response = '';
while ($out = socket_read($socket, 2048)) {
    $response .= $out;
}

// Schließung socket
socket_close($socket);

// Ausgangsantwort
echo $response;
?>

3.. Punkte zu beachten

  • Stellen Sie sicher, dass Socket_Set_Block aufgerufen wird, nachdem Socket_Connect erfolgreich ist, um das Einstellen nach dem Verbindungsfehler zu vermeiden.

  • Socket_Set_Block gibt einen booleschen Wert zurück, und die Fehlermeldung kann über socket_last_error erhalten werden, wenn sie fehlschlägt.

  • Wenn Sie vor der Verbindung Socket_Set_Block aufrufen, kann dies durch interne Anrufe während der Verbindung überschrieben werden, was zu ungültigen Blockierungseinstellungen führt.

  • Der Standard -Socket -Modus von PHP blockiert normalerweise, aber in einigen Szenarien (z. B. Socket_Set_Nonblock , die zuvor aufgerufen wurde) muss er wieder auf Blockierung zurückgesetzt werden.


Zusammenfassend möchten Sie sicherstellen, dass der Blockierungsmodus wirksam wird, der Schlüssel ist, socket_set_block aufzurufen, nachdem Socket_Connect erfolgreich ist, um sicherzustellen, dass nachfolgende Lesen- und Schreibvorgänge auf blockierende Weise durchgeführt werden, wodurch häufige Probleme wie die Unfähigkeit, Daten oder Versagen im Nicht-Blocking-Modus zu lesen, vermeiden.