Aktueller Standort: Startseite> Neueste Artikel> SOCKKET_SET_BLOCK + SOCKKET_RECV UMSPRÜFTE Blockierungen und Empfangen von Daten

SOCKKET_SET_BLOCK + SOCKKET_RECV UMSPRÜFTE Blockierungen und Empfangen von Daten

gitbox 2025-05-26

Was ist Blockierungsempfang?

Der blockierte Empfang bezieht sich darauf, wann das Programm die Empfangsfunktion aufruft. Wenn keine Daten im Empfangspuffer vorliegen, wird das Programm ausgeführt und warten, bis die Daten eintreffen, bevor sie weiter ausgeführt werden. Dies stellt sicher, dass die empfangenen Daten vollständig und in Echtzeit sind. Wenn das Netzwerk jedoch nicht in gutem Zustand ist, kann das Programm lange warten.

Die Standard -Socket in PHP blockiert Modus. Wenn Socket_Set_NonBlock verwendet wird, um es auf nicht blockierende Einstellung zu setzen, kehrt Socket_Recv sofort zurück, wenn keine Daten vorhanden sind.

Funktion Einführung

  • SOCKKET_SET_BLOCK (Ressource $ Socket): bool

    Legt den angegebenen Socket in den Blockierungsmodus fest.

  • SOCKKET_RECV (Ressource $ Socket, String & $ BUF, int $ len, int $ flags): int | false

    Daten aus Socket empfangen. Im Blockierungsmodus wartet das Programm, wenn keine Daten vorhanden sind, bis die Daten eintreffen.

Codebeispiel

Das folgende Beispiel zeigt, wie ein TCP -Client nach der Verbindung zum Server erstellt wird, um den Socket auf den Blockierungsmodus zu setzen, und verwenden Sie dann Socket_Recv , um die Daten zu blockieren.

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

// Stellen Sie eine Verbindung zum Server her
$server_ip = 'gitbox.net';
$server_port = 8080;

$result = socket_connect($socket, $server_ip, $server_port);
if ($result === false) {
    die("socket_connect failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// aufstellensocketIm Blockierungsmodus(Standardmäßig ist es bereits blockiert)
socket_set_block($socket);

echo "Verbindung erfolgreich,Warten auf Datenerhalte...\n";

while (true) {
    $buffer = '';
    // aussocketDie blockiertesten Empfänge1024Byte
    $bytes = socket_recv($socket, $buffer, 1024, 0);
    if ($bytes === false) {
        echo "socket_recv failed: " . socket_strerror(socket_last_error($socket)) . "\n";
        break;
    } elseif ($bytes === 0) {
        // Verbindung schließt
        echo "Der Server schließt die Verbindung\n";
        break;
    } else {
        echo "Erhalten {$bytes} Byte数据: $buffer\n";
    }
}

// Schließungsocket
socket_close($socket);
?>

Auslaufprozessanalyse

  1. Erstellen Sie einen TCP -Sockel.

  2. Stellen Sie eine Verbindung zum angegebenen Server her (der Domänenname wird durch gitbox.net ersetzt).

  3. Rufen Sie Socket_Set_Block auf, um sicherzustellen, dass der Socket blockiert.

  4. Rufen Sie Socket_Recv auf, wenn derzeit keine Daten vorhanden sind, blockiert und warten Sie, bis die Daten lesbar sind.

  5. Drucken Sie nach Erhalt der Daten aus.

  6. Wenn der Server die Verbindung schließt, verlässt die Schleife und schließt den Socket.

Zusammenfassung

  • Socket_Set_Block kann den Socket explizit auf den Blockierungsmodus einstellen, um sicherzustellen, dass die Daten blockiert werden und das Warten auf Socket_Recv beim Aufrufen von Socket_Recv blockiert wird.

  • Der Blockierungsmodus eignet sich für Szenarien, in denen Daten in Echtzeit hoch sind und es Ihnen nichts ausmacht, zu warten.

  • Wenn Sie möchten, dass das Programm nicht blockiert wird, können Sie Socket_Set_NonBlock verwenden oder Socket Timeout festlegen.

Das Verständnis von Blockier- und nicht blockierenden Mechanismen wird dazu beitragen, Netzwerkkommunikationsprogramme flexibler zu entwerfen, um den unterschiedlichen Anwendungsanforderungen zu erfüllen.