Permette di leggere i dati memorizzati nel buffer di ricezione e li rimuove se non sono stati rilevati errori.
Il valore UDINT restituito indica il numero di byte scritti nel buffer fornito dall'applicazione.
Per ulteriori informazioni sui metodi di ricezione, consultare la sezione Metodo di ricezione.
Il comportamento dei metodi Peek e Receive potrebbe essere diverso per le connessioni con TLS e senza TLS. in particolare quando si scambiano grandi pacchetti di dati. Quando si eseguono i metodi su una connessione che utilizza TLS, può essere richiesta l'esecuzione di più chiamate di metodo finché i dati non vengono copiati o spostati nel buffer applicazione. In ogni caso, prima di elaborare i dati, verificare la quantità di dati copiati o spostati e se i dati sono completi.
Ingresso |
Tipo di dati |
Intervallo di valori valido |
Descrizione |
---|---|---|---|
i_pbyReceiveBuffer |
POINTER TO BYTE |
- |
Indirizzo iniziale del buffer per la scrittura dei dati ricevuti. |
i_udiReceiveBufferSize |
UDINT |
1 ... 2147483647 |
Numero di byte da leggere.
NOTA: Il valore non deve essere superiore alle dimensioni del buffer.
|
In_Out |
Tipo di dati |
Intervallo di valori valido |
Descrizione |
---|---|---|---|
iq_udiFillLevel |
UDINT |
1 ... 2147483647 |
Livello di riempimento del buffer creato dall'applicazione prima dell'operazione (i dati verranno scritti a questo offset) e il livello dopo che i byte ricevuti sono scritti nel buffer. |
I metodi di ricezione dei dati, forniti dai blocchi funzione FB_TCPClient/FB_TCPClient2 e FB_TCPServer/FB_TCPServer2 in questa libreria forniscono il parametro di I/O iq_udiFillLevel. Questo parametro determina l'offset nel buffer e quindi la posizione in cui vengono scritti i dati. A ogni esecuzione della funzione, il valore viene aggiornato aggiungendo il numero dei byte scritti nel valore originale.
Nei casi in cui i dati siano ricevuti in più pacchetti, ma debbano essere memorizzati in un buffer ed elaborati in un secondo momento, la rispettiva funzione di ricezione può essere richiamata più volte senza modificare il parametro iq_udiFillLevel dall'ultima chiamata di funzione.
La differenza della dimensione del buffer di ricezione (i_udiReceiveBufferSize) e il livello di riempimento consente di determinare il numero massimo di byte da leggere.
Le immagini seguenti illustrano il contenuto del buffer e la modifica del parametro iq_udiFillLevel per due chiamate di funzione, laddove la funzione è stata eseguita correttamente ogni volta.
Fase |
Descrizione |
Illustrazione |
---|---|---|
1 |
Prima della prima chiamata della funzione, il puntatore è impostato sul primo indice del buffer. Il livello di riempimento è impostato a 0. Il parametro i_udiReceiveBufferSize indica la dimensione assoluta del buffer in byte. |
![]() |
2 |
Su ciascuna chiamata di funzione, il buffer viene cancellato dall'inizio del livello di riempimento. Durante la prima chiamata di funzione in questo esempio, i dati disponibili sono stati spostati dallo stack TCP al buffer. Il livello di riempimento viene aggiornato dalla funzione e indica il numero di byte letti nel buffer. Quando nello stack TCP è disponibile spazio di memoria, il client o il server remoto viene informato dello spazio disponibile e di conseguenza invia il successivo pacchetto dati. La seconda chiamata di funzione viene eseguita senza modifiche dei parametri di ingresso. |
![]() |
3 |
Durante la seconda chiamata di funzione, i dati disponibili vengono di nuovo spostati dallo stack TCP al buffer. Il livello di riempimento viene aggiornato dalla funzione e quindi il valore è uguale al valore di i_udiReceiveBufferSize. Questo significa che il buffer di ricezione è pieno. Un'ulteriore chiamata di funzione verrebbe annullata con il risultato FillLevelOutOfRange Infine, se il buffer di ricezione è pieno, occorre elaborare i dati e aggiornare di conseguenza il valore del livello di riempimento del buffer. |
![]() |
In base al controller, la quantità di dati da spostare in una chiamata di funzione di uno dei metodi Receive, Send o Peek è limitata.
Controller |
Numero di byte che è possibile spostare in una volta* |
---|---|
M241, M251 |
2048 byte |
PacDrive LMC, M262 |
9.000.000 byte (limitato dalla memoria dell'applicazione) |
*Si tratta del valore massimo della differenza tra dimensione del buffer e livello di riempimento. |