Comunicazione TCP

Ciao a tutti!
Mi sta succedendo una cosa "strana" con il mio Arduino Ethernet. Quando provo a comunicare una stringa l'aduino prima manda al PC il primo carattere di quella stringa ( quindi sblocca la read del programma server ) e poi manda la stringa tutta intera. E' normale?

Vi posto il codice presente su arduino:

 Ethernet.begin(_mac, _ip);
  // Se la connessione riesce
  if(_client.connect()) {
    _connesso = true;
    digitalWrite(_LEDA5OUT, HIGH);
    // Invio messaggio di connessione al server
    // ADD:"ID-Sensore";
    String message = "ADD:" + String(_id, DEC) +";" ;
    _client.println(message);
    return 1; 
  }
  else { 
     delay(5000);
     return 0;
  }

Ed il codice per la ricezione del messaggio sul server:

                    // Ascolto fino a che non arriva il terminatore di riga " ; "
                    do {
                        bytesRead = stream.Read(bytes, 0, 4096);
                        // Stringa in arrivo: ADD:"id_sensore"
                        data += ASCIIEncoding.ASCII.GetString(bytes, 0, bytesRead);
                        // Elimino spazi in arrivo
                        data = data.Trim();

                        MessageBox.Show("DATI: " + data);
                        MessageBox.Show("ultimo carattere: " + data[data.Length - 1].ToString());
                    }
                    while(data[data.Length-1].ToString() != ";");

In pratica prima mi arriva il carattere "A" e, successivamente mi arriva la stringa tutta intera.
Come mai?

Un saluto

Ma hai una duplicazione del carattere "A"?
Altrimenti è tutto normale, se invii "PIPPO" tramite TCP/IP può accadere che viene ricevuto prima "PI" e poi "PPO".
Se usi UDP allora è normale anche la duplicazione o la perdita di pacchetti.
Ciao

No non ci sono duplicazioni. Ah! Pensavo arrivasse tutta la stringa in una volta :slight_smile: Io ricevo prima il carattere A e poi il resto della stringa.

è giusto che il messaggio possa essere spezzato in più pacchetti, però sinceramente non capisco perchè lo faccia, in teoria per ottimizzare un pò ed evitare l'hoverhead della rete il messaggio dovrebe spedirlo tutto intero... ma quì sono particolari che puoi lasciar perdere

Diciamo che esiste un "buffer" sia a livello di hardware (scheda di rete) sia a livello di sistema operativo e di framework (classe Stream) dove vengono riposti i dati ricevuti.
Questo buffer viene svuotato al riempimento e/o periodicamente secondo certe politiche che non sono "esposte".
Aggiungo poi che il metodo NetworkStream.Read() non legge tutti i byte richiesti ma può ritornare prima ritornando il numero di byte letti.

Ciao