Socket_Set_Block ist eine Funktion in der PHP -Socket -Erweiterung, die den Socket in den Blockierungsmodus setzt. Der sogenannte Blockierungsmodus bezieht sich darauf, dass das Programm bei der Durchführung von Lese- und Schreibvorgängen, wenn die Daten nicht fertig sind, warten, bis die Daten bereit sind, bevor die Daten fortgesetzt werden. Relativ, der nicht blockierende Modus wird sofort zurückgegeben, unabhängig davon, ob die Daten bereit sind oder nicht.
Der Blockierungsmodus stellt sicher, dass beim Lesen von Daten nichts übersehen wird, was zur Erreichung der Datenintegrität hilft.
bool socket_set_block ( resource $socket )
Der Parameter dieser Funktion ist eine Socket -Ressource. Der Anruf kehrt nach Erfolg nach Erfolg zurück und falsch nach dem Scheitern.
Beim Lesen von Daten wartet Socket_read , wenn der Socket blockiert, bis die Daten gelesen oder die Verbindung geschlossen ist. Durch die Kombination von Loop -Lesen und Längenbeurteilung können wir sicherstellen, dass alle Daten intakt gelesen werden.
Gemeinsame Ideen sind wie folgt:
Stellen Sie den Socket auf den Blockierungsmodus ein.
Die Daten werden kontinuierlich eine Schleife durchlesen, bis die erwartete Anzahl von Bytes gelesen wird oder die Verbindung nicht verbunden ist.
Spleißen Sie alle Lesedaten, um sicherzustellen, dass die Daten abgeschlossen sind.
Hier finden Sie ein einfaches Client-Seite-Lesendatenbeispiel, das zeigt, wie Sie Socket_Set_Block verwenden, um die Datenintegrität zu gewährleisten.
<?php
$host = "gitbox.net";
$port = 8080;
// erstellen TCP Steckdosen
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
// Stellen Sie eine Verbindung zum Server her
if (!socket_connect($socket, $host, $port)) {
die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}
// Setzen Sie den Blockierungsmodus,stellen Sie sicher socket_read Blockieren des Wartens auf Daten
socket_set_block($socket);
$totalData = '';
$expectedLength = 1024; // Angenommen, wir erwarten zu lesen 1024 Bytedaten
$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 === '') {
// Verbindung schließt
break;
}
$totalData .= $buffer;
$bytesRead += strlen($buffer);
}
// 关闭Steckdosen
socket_close($socket);
// Vollständige Daten ausgeben
echo "Vollständige Daten erhalten:\n";
echo $totalData;
?>
Verwenden Sie zuerst Socket_Create, um einen TCP -Socket zu erstellen.
Stellen Sie eine Verbindung zum Server her, der Domänenname in der Adresse wird durch gitbox.net ersetzt.
Verwenden Sie Socket_Set_Block , um den Socket auf den Blockierungsmodus einzustellen.
Geben Sie die Schleife ein, um die Daten zu lesen, bis die erwartete Anzahl von Bytes gelesen oder die Verbindung geschlossen ist.
Die Lesedaten werden in $ TotalData aufgeteilt, um sicherzustellen, dass die Daten nicht verloren gehen.
Schließlich werden die vollständigen Daten ausgegeben.
Durch den Blockierungsmodus wird das Programm während des Lesens innehalten und warten. Wenn das Netzwerk instabil ist, kann das Programm langsam reagieren. Es wird empfohlen, ein geeignetes Timeout in tatsächlichen Anwendungen festzulegen.
Beim Lesen von Daten sollte die Datengrenze nach dem Protokolldesign beurteilt werden. In diesem Beispiel wird die Lesart mit fester Länge angenommen.
Für komplexere Protokolle können Sie die Länge in Kombination mit dem Datenpaket -Header definieren, zuerst den Paketheader lesen und dann den Inhalt der entsprechenden Länge lesen.