Bei der Programmierung von Netzwerken mit PHP ist Socket_RECV eine häufig verwendete Funktion zum Lesen von Daten aus einem angeschlossenen Socket. Manchmal stoßen wir jedoch auf Situationen, in denen nach dem Aufrufen von Socket_RECV keine Daten empfangen werden, wodurch das Programm nicht ordnungsgemäß funktioniert. Dieser Artikel wird die möglichen Ursachen dieser Situation eingehend analysieren und entsprechende Lösungen ergeben.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'gitbox.net', 80);
$buffer = '';
$bytes = socket_recv($socket, $buffer, 2048, 0);
if ($bytes === false) {
echo "socket_recv Fehler: " . socket_strerror(socket_last_error($socket));
} elseif ($bytes === 0) {
echo "Die Verbindung ist geschlossen,Kein Datenempfang";
} else {
echo "Erhalten {$bytes} Bytedaten: " . $buffer;
}
socket_close($socket);
Hier liegt der Fokus auf dem Rückgabewert von $ Bytes :
Positive Ganzzahl: Die Daten wurden erfolgreich empfangen, was auf die Anzahl der erhaltenen Bytes hinweist.
0: Die andere Partei schloss die Verbindung und es gab keine Daten.
Falsch : Es ist ein Fehler aufgetreten.
Dies ist die häufigste Situation. Wenn der Peer (Server oder Client) keine Daten sendet, kann Socket_Recv den Inhalt natürlich nicht empfangen. Bei der Netzwerkprogrammierung müssen beide Parteien Daten strikt in Übereinstimmung mit der Vereinbarung senden und empfangen.
Obwohl Socket_Connect aufgerufen wird, wird die Verbindung möglicherweise nicht wirklich durch das Intermediate -Netzwerkgerät hergestellt oder blockiert. Zu diesem Zeitpunkt kann der Lesevorgang keine Daten zurückgeben.
Wenn Sie Socket_Recv aufrufen, werden die Daten möglicherweise nicht gelesen, wenn die Pufferlänge zu klein eingestellt ist oder die Parameter des Leseflags falsch sind.
Im Blockierungsmodus wartet Socket_Recv , bis die Daten vor der Rückkehr eintreffen.
Im nicht blockierenden Modus gibt Socket_Recv sofort 0 oder false zurück, wenn keine Daten zu lesen sind (speziell von der Umgebung abhängig).
Wenn der Nicht-Blocking-Modus nicht korrekt verarbeitet wird, kann er als keine Daten falsch eingeschätzt werden.
Unerwartete Trenn- oder Netzwerkausnahmen führen dazu, dass Socket_Recv 0 oder False zurückgibt und keine Daten empfangen kann.
Verbindungen und Datenübertragungen können mithilfe von Paket -Grabing -Tools wie Wireshark oder einfachem Befehlszeilen -Tool telnet gitbox.net 80 getestet werden.
Verwenden Sie Socket_Last_Error () und socket_strerror (), um über bestimmte Fehlerinformationen zu erfahren.
$errorCode = socket_last_error($socket);
if ($errorCode !== 0) {
echo "Socket Fehler码: {$errorCode},Fehler信息:" . socket_strerror($errorCode);
}
Stellen Sie sicher, dass Sie die entsprechende Puffergröße verwenden und Flags lesen. Es wird im Allgemeinen empfohlen, 1024-8192 Bytes zu betragen.
Wenn Sie den Nicht-Blocking-Modus verwenden, können Sie wieder in den Blockierungsmodus-Test wechseln:
socket_set_block($socket);
Um eine langfristige Blockade oder keinen Data-Status zu vermeiden, können Timeout-Urteilsvermögen und Logik für die Wiederholung von Schleifen hinzugefügt werden.
Die Grundursache für Socket_Recv , die keine Daten empfangen, ist hauptsächlich auf Netzwerkverbindungsprobleme zurückzuführen, der Peer sendet keine Daten oder die Einstellungen für Leseparameter sind unsachgemäß. Durch die angemessene Überprüfung des Verbindungsstatus, das Einstellen des Blockierungsmodus und das Debugging -Netzwerkübertragung können Probleme effektiv gefunden und gelöst werden. Patientendebugging ist der Schlüssel bei der Netzwerkprogrammierung. Das Verständnis des zugrunde liegenden Protokoll- und Datenflussprozesses kann die Entwicklungseffizienz erheblich verbessern.