TCP/IP, così come UDP, i pacchetti includono qualche riferimento alla loro dimensione . Lo IP header contiene un campo a 16 bit che specifica la lunghezza dell'intestazione IP e in byte. Lo TCP header contiene un campo a 4 bit che specifica la dimensione dell'intestazione TCP nelle parole a 32 bit. Lo UDP header contiene un campo a 16 bit che specifica la lunghezza dell'intestazione UDP e in byte.
Ecco la cosa.
Utilizzando i socket standard run-of-the-mill in Windows, sia che si utilizzi lo spazio dei nomi System.Net.Sockets in C# o la roba Winsock nativa in Win32, non si vedono mai le intestazioni IP/TCP/UDP . Queste intestazioni vengono eliminate in modo tale che ciò che ottieni quando leggi il socket è il carico utile effettivo, cioè i dati inviati.
Lo schema tipico di tutto ciò che ho visto e fatto utilizzando i socket è che si definisce un'intestazione a livello di applicazione che precede i dati che si desidera inviare. Come minimo, questa intestazione dovrebbe includere la dimensione dei dati da seguire. Questo ti permetterà di leggere ogni "messaggio" nella sua interezza senza dover indovinare la sua dimensione. Puoi avere la fantasia che desideri con esso, ad es. Modelli di sincronizzazione, CRC, versione, tipo di messaggio, ecc., Ma la dimensione del "messaggio" è tutta che hai bisogno di .
E per quello che vale, suggerirei di utilizzare un'intestazione anziché un delimitatore di fine pacchetto. Non sono sicuro se ci sia uno svantaggio significativo per il delimitatore EOP, ma l'intestazione è l'approccio utilizzato dalla maggior parte dei protocolli IP che ho visto.Inoltre, mi sembra più intuitivo elaborare un messaggio dall'inizio piuttosto che attendere che alcuni pattern appaiano nel mio stream per indicare che il mio messaggio è completo.
EDIT: Mi sono appena reso conto del progetto Buffers del protocollo Google. Da quello che posso dire, è uno schema di serializzazione/de-serializzazione binaria per WCF (sono sicuro che sia una grossolana semplificazione). Se si sta utilizzando WCF, non è necessario preoccuparsi della dimensione dei messaggi inviati perché l'impianto idraulico WCF si occupa di ciò dietro le quinte, il che probabilmente è il motivo per cui non è stato trovato nulla correlato alla lunghezza del messaggio nel protocollo Documentazione dei buffer Tuttavia, nel caso di prese, conoscere le dimensioni aiuterà enormemente come discusso sopra. La mia ipotesi è che serializziate i vostri dati usando i Protocol Buffers e poi virate su qualunque intestazione dell'applicazione vi venga in mente prima di inviarli. Sul lato ricevente, si estrae l'intestazione e quindi deserializzare il resto del messaggio.
fonte
2009-03-01 05:32:43
Se si intende protobuf-net, no non è solo per WCF; ci sono esempi di prese nel progetto. –