Metodo Receive

Panoramica

Tipo:

Metodo

Disponibile a partire da:

V1.0.4.0

Task

Lettura di dati memorizzati nel buffer di ricezione e rimozione dei dati.

Descrizione funzionale

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.

Considerazioni per connessioni che utilizzano TLS

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.

Interfaccia

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.
NOTA: Per impedire la violazione di accesso provocata dall'accesso non valido del puntatore alla memoria, utilizzare l'operatore aritmetico SIZEOF insieme al buffer di destinazione per determinare il valore di i_udiReceiveBufferSize.

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.

Utilizzato da

  • FB_TCPClient/FB_TCPClient2

Metodi di ricezione

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.

Esempio di chiamata di funzione

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.

Limiti dati per chiamata di funzione

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.