Lesen und Entfernen der im Empfangspuffer gespeicherten Daten.
Liest die im Empfangspuffer gespeicherten Daten und entfernt sie anschließend, wenn kein Fehler erkannt wurde.
Der UDINT-Rückgabewert verweist auf die Anzahl der in den von der Anwendung bereitgestellten Puffer geschriebenen Bytes.
Zusätzliche Informationen zu den Empfangsmethoden finden Sie im Abschnitt Empfangsmethode.
Hinweise für Verbindungen mit TLS
Das Verhalten der Methoden Peek und Receive ist möglicherweise bei Verbindungen mit oder ohne TLS unterschiedlich. Diese gilt insbesondere, wenn große Datenpakete ausgetauscht werden. Bei der Ausführung der Methoden in einer Verbindung mit TLS ist kann es notwendig sein, dass mehrere Methodenaufrufe ausgeführt werden müssen, bis alle Daten in den Anwendungspuffer kopiert oder verschoben wurden. Überprüfen Sie in jedem Fall vor der Verarbeitung der Daten, welche Menge Daten kopiert oder verschoben wurde und ob die Daten vollständig sind.
Eingabe |
Datentyp |
Gültiger Bereich |
Beschreibung |
---|---|---|---|
i_pbyReceiveBuffer |
POINTER TO BYTE |
- |
Startadresse des Puffers, in den die empfangenen Daten geschrieben werden. |
i_udiReceiveBufferSize |
UDINT |
1 ... 2147483647 |
Anzahl der zu lesenden Bytes. HINWEIS: Der Wert darf die Größe des Puffers nicht überschreiten. |
HINWEIS: Um eine Zugriffsverletzung aufgrund eines ungültigen Zeigerzugriffs auf den Speicher zu vermeiden, verwenden Sie den arithmetischen Operator SIZEOF in Verbindung mit dem Zielpuffer, um den Wert für i_udiReceiveBufferSize zu bestimmen.
Eingang/Ausgang |
Datentyp |
Gültiger Bereich |
Beschreibung |
---|---|---|---|
iq_udiFillLevel |
UDINT |
1 ... 2147483647 |
Füllungsniveau des von der Anwendung bereitgestellten Puffers vor der Operation (Daten werden an diesen Offset geschrieben) und Füllungsniveau nachdem die empfangenen Bytes in den Puffer geschrieben wurden. |
oFB_TCPClient/FB_TCPClient2
Die von den Funktionsbausteinen FB_TCPClient/FB_TCPClient2 und FB_TCPServer/FB_TCPServer2 in dieser Bibliothek bereitgestellten Methoden für den Empfang von Daten umfassen den Ein-/Ausgangsparameter iq_udiFillLevel. Dieser Parameter bestimmt das Offset im Puffer und damit die Position, an der die Daten geschrieben werden. Bei jeder Ausführung der Funktion wird der Wert aktualisiert, d. h. der ursprüngliche Wert wird um die Anzahl der geschriebenen Bytes erhöht.
In Fällen, in denen Daten in mehreren Paketen empfangen werden, aber in einem Puffer gespeichert werden müssen, um später gemeinsam verarbeitet zu werden, kann die betreffende Empfangsfunktion ohne Änderung des Parameters iq_udiFillLevel vom letzten Funktionsaufruf wiederholt aufgerufen werden.
Die Differenz zwischen der Größe des Empfangspuffers (i_udiReceiveBufferSize) und dem Füllungsniveau wird zur Bestimmung der maximalen Anzahl an zu lesenden Bytes verwendet.
Beispiel für einen Funktionsaufruf
Die nachstehende Abbildung veranschaulicht den Inhalt des Puffers und die Änderung des Parameters iq_udiFillLevel für zwei Funktionsaufrufe, bei denen die Funktion jedes Mal erfolgreich ausgeführt wurde.
Schritt |
Beschreibung |
Abbildung |
---|---|---|
1 |
Vor dem ersten Aufruf der Funktion wird der Zeiger auf den ersten Index des Puffers gesetzt. Das Füllungsniveau wird auf 0 eingestellt. Der Parameter i_udiReceiveBufferSize gibt die absolute Größe des Puffers in Byte an. |
![]()
|
2 |
Bei jedem Funktionsaufruf wird der Puffer ab Beginn des Füllungsniveaus gelöscht. Beim ersten Funktionsaufruf in diesem Beispiel werden die verfügbaren Daten aus dem TCP-Stapel in den Puffer verschoben. Das Füllungsniveau wird von der Funktion aktualisiert und verweist dann auf die Anzahl der im Puffer gelesenen Bytes. Sobald im TCP-Stapel Speicherplatz verfügbar ist, wird der dezentrale Standort über den verfügbaren Speicherplatz informiert. Daraufhin wird das nächste Datenpaket gesendet. Der zweite Funktionsaufruf wird ohne Änderung des Eingangsparameters ausgeführt. |
![]()
|
3 |
Beim zweiten Funktionsaufruf werden die verfügbaren Daten erneut aus dem TCP-Stapel in den Puffer verschoben. Das Füllungsniveau wird von der Funktion aktualisiert und entspricht dann dem Wert von i_udiReceiveBufferSize. Das bedeutet, dass der Empfangspuffer voll ist. Ein weiterer Funktionsaufruf würde mit dem Ergebnis FillLevelOutOfRange abgebrochen werden. Bei vollem Empfangspuffer müssen Sie die Verarbeitung der Daten starten und den Wert für das Füllungsniveau des Puffers entsprechend aktualisieren. |
![]()
|
Datengrenzen pro Funktionsaufruf
Je nach Steuerung ist die Menge der bei einem Funktionsaufruf einer der Methoden ReceiveSend und Peek zu verschiebenden Daten begrenzt.
Steuerung |
Anzahl der Bytes, die direkt verschoben werden können* |
---|---|
M258, LMC058, M241, M251 |
2048 Byte |
LMC078, PacDrive LMC, M262 |
> 10.000.000 Byte (begrenzt durch den Anwendungsspeicher) |
*Das entspricht dem maximalen Wert für die Differenz zwischen Puffergröße und Füllungsniveau. |