Domanda

Sto sviluppando un'applicazione in C #, utilizzando il modello server-client, in cui il server invia un array di byte con una bitmap al cliente, il cliente lo carica nello schermo, invia un "OK" al server, e il server invia un'altra immagine, e così via.

La lunghezza dei deppends buffer delle immagini, di solito è compresa tra 60 KB e 90KB, ma ho visto che non importa. Se metto il client e il server nello stesso computer, utilizzando localhost, tutto funziona bene. Il server esegue beginSend, e il cliente fa EndReceive e l'intero buffer viene trasmesso.

Tuttavia, ora sto testando questo in una rete senza fili e ciò che accade è:

  • Il server invia l'immagine.
  • La funzione di callback data_received sul client si chiama, ma ci sono solo 1.460 byte da leggere (MTU -?? Il motivo per cui non dovrebbe essere solo in UDP)
  • La funzione di callback data_received sul client viene chiamato nuovamente, ora con il resto del buffer (sia che si tratti di 1000 byte o 100 kbyte) ...

È sempre così, un primo pacchetto di 1460 byte viene ricevuto, e quindi il secondo pacchetto contiene il resto.

posso ovviare a questo unendo sia byte array ricevuti, ma questo non mi sembra giusto. Io non sono nemmeno sicuro perché questo sta accadendo. E 'un po' di restrizione alla rete? Perché allora C # non aspetta per i dati interi da trasmettere? Voglio dire, è il protocollo TCP, non avrei dovuto preoccuparsi, giusto?

In ogni caso, qualsiasi aiuto sarebbe grande!
Acclamazioni

È stato utile?

Soluzione

E 'TCP - si dovrebbe trattare i dati come un flusso di . Si consiglia di non importa quanto il flusso è suddiviso in pacchetti, o fare ipotesi su di esso.

Se avete bisogno di ricevere un unico "blocco" dei dati, il modo più semplice per farlo in modo affidabile è quello di prefisso con la lunghezza (per esempio come un valore a 32-bit). Hai letto la lunghezza (notare che anche quei bytes potrebbe essere suddivisi su più pacchetti) e poi ripetutamente leggere (sia sincrono o asincrono) prendendo atto di quanto si legge ogni volta, prima di aver letto tutto i dati.

Altri suggerimenti

Avere una lettura di 9.2.4

  

Quando la dissezione di un protocollo di livello applicativo non si può assumere che ogni pacchetto TCP contiene esattamente una sola applicazione messaggio layer. Un messaggio di livello di applicazione può essere suddiviso in diversi pacchetti TCP.

aggiunta alla risposta di Giovanni:

int offset = 0;
int imagesize = 512;
byte[] buffer = new byte[512];

tcpChannel.Read(buffer, offset, imagesize);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top