stream_socket_recvfrom ist eine Funktion in PHP, mit der UDP -Protokoll- oder TCP -Protokolldaten empfangen werden. Der Prototyp ist wie folgt:
<span><span><span class="hljs-title function_ invoke__">stream_socket_recvfrom</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$length</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$flags</span></span><span> = </span><span><span class="hljs-number">0</span></span><span> ] ) : </span><span><span class="hljs-keyword">string</span></span><span>|</span><span><span class="hljs-literal">false</span></span><span>
</span></span>$ Socket : Die Socket -Ressource zum Lesen von Daten, die normalerweise über stream_socket_client oder stream_socket_server erstellt wurden.
$ Länge : Die maximale Anzahl von Bytes zu lesen.
$ flags : Flag -Parameter, Standard ist 0 und muss nicht normal geändert werden.
Rückgabewert:
Wenn Sie erfolgreich sind, geben Sie die Lesedatenzeichenfolge zurück.
Gibt falsche zurück, wenn es fehlgeschlagen ist.
Wenn wir feststellen , dass stream_socket_recvfrom keine Daten nicht empfangen können, können wir bei den folgenden Aspekten beheben.
Stellen Sie zunächst sicher, dass die Netzwerkverbindung normal ist. Die Funktion von Stream_Socket_Recvfrom hängt von der Verbindung zwischen Socket und Netzwerk ab. Wenn Probleme mit der Netzwerkverbindung vorhanden sind, z. B. der Zielhost, der nicht erreichbar ist, ist die Firewall -Einstellung unangemessen, die Daten werden natürlich nicht empfangen.
Fehlerbehebung Methode :
Verwenden Sie den Befehl ping , um zu überprüfen, ob der Zielhost erreichbar ist.
Überprüfen Sie die Server- und Client -Firewall -Einstellungen, um sicherzustellen, dass der UDP- oder TCP -Port geöffnet ist.
Im UDP -Protokoll kann Stream_Socket_Recvfrom keine Daten empfangen, wenn der Socket nicht ordnungsgemäß an den angegebenen Port gebunden ist oder wenn die empfangenen Daten nicht ordnungsgemäß angehört werden. Wenn die Verbindung im TCP -Protokoll nicht korrekt hergestellt wird, können Daten nicht empfangen werden.
Fehlerbehebung Methode :
Stellen Sie sicher, dass Stream_Socket_Server den angegebenen Port korrekt erstellt und hört.
Verwenden Sie Socket_Bind (), um zu bestätigen, dass der Socket korrekt an den lokalen Port gebunden ist (insbesondere bei der Verwendung von UDP).
Wenn das Sendenende keine Daten ordnungsgemäß sendet oder das gesendete Datenpaket verloren geht, kann das empfangende Ende natürlich nicht in der Lage sein, die Daten zu empfangen. Die Instabilität des Netzwerks, Fehler beim Senden des Programms oder beim Senden von Datenformat können dazu führen, dass Daten nicht geliefert werden.
Fehlerbehebung Methode :
Drucken Sie Protokolle im Sendenende oder verwenden Sie ein Netzwerkpaket -Erfassungs -Tool (z. B. Wireshark), um zu bestätigen, ob die Daten korrekt gesendet werden.
Überprüfen Sie, ob der Sendecode Daten im richtigen Format sendet.
Wenn das Timeout beim Aufrufen von Stream_Socket_Recvfrom nicht festgelegt wird oder die Zeitüberschreitungszeit zu kurz ist, werden die Daten möglicherweise nicht rechtzeitig gelesen. Dies kann insbesondere in Netzwerkumgebungen geschehen, in denen die Datenübertragung langsam oder verzögert ist.
Fehlerbehebung Methode :
Verwenden Sie die Funktion stream_set_timeout , um die Zeitlimitzeit des Sockets zu lesen. Zum Beispiel:
<span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// Stellen Sie die Auszeit auf10Zweite</span></span><span>
</span></span>Stellen Sie sicher, dass der Empfänger mögliche Netzwerkverzögerungen bearbeiten kann.
Der Lesemodus von Stream_Socket_Recvfrom (wie z. B. Nicht-Blocking-Modus) kann den Datenempfang beeinflussen. Wenn sich der Socket im nicht blockierenden Modus befindet, wird falsch zurückgegeben, wenn keine Daten gelesen werden, anstatt auf die Daten zu warten.
Fehlerbehebung Methode :
Um zu überprüfen, ob der Nicht-Blocking-Modus verwendet wird, können Sie das Blockierungsverhalten der Socket über stream_set_blocking anpassen:
<span><span><span class="hljs-title function_ invoke__">stream_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>); </span><span><span class="hljs-comment">// Einstellen auf den Blockierungsmodus</span></span><span>
</span></span>Die zweite Parameterlänge von stream_socket_recvfrom bestimmt die maximale Anzahl von Bytes pro Lesen. Wenn das Paket diese Größe überschreitet, wird der Überschuss verworfen, was dazu führt, dass die vollständigen Daten nicht in der Lage sind, die vollständigen Daten zu erhalten.
Fehlerbehebung Methode :
Stellen Sie sicher, dass der Längeparameter groß genug ist, um das komplette Paket zu erhalten. Wenn Sie sich über die Größe des Pakets nicht sicher sind, können Sie die Länge auf einen größeren Wert einstellen oder dynamisch einstellen.
Der Empfänger kann Daten in einem bestimmten Format erwarten. Wenn das empfangene Datenformat keine Erwartungen entspricht, kann es auch dazu führen, dass die Daten nicht korrekt analysiert werden, was sich als "nicht empfangene Daten" manifestiert.
Fehlerbehebung Methode :
Überprüfen Sie den Verarbeitungscode der empfangenen Daten, um sicherzustellen, dass das Format und das Protokoll der Daten mit dem Absender übereinstimmen.
Drucken Sie die empfangenen Daten und prüfen Sie, ob die Daten korrekt analysiert werden.
Protokollierung : Durch Hinzufügen von Protokollierung sowohl zum Senden als auch zum Empfangsenden kann das Verfolgen des Datenflusss schnell Probleme finden.
Netzwerkpaketaufnahme : Verwenden Sie Tools wie Wireshark oder TCPDump, um Netzwerkdatenpakete zu erfassen, und überprüfen Sie, ob die Daten an den Zielgerät übertragen wurden.
Schritt für Schritt : Beginnen Sie mit einer einfachen Situation und stellen Sie sicher, dass die Funktion jedes Schritts normal ist. Verwenden Sie beispielsweise Stream_Socket_SendTO , um einfache Daten zu senden, um zu bestätigen, ob der Empfänger sie empfangen kann.