Domanda

NetworkStream.DataAvailable sa se il buffer di invio del mittente è vuoto? O indica semplicemente se il buffer di lettura del destinatario ha dati? La mia ipotesi è quest'ultima ...

In particolare, per alcuni lavori socket che coinvolgono una conversazione in corso, attualmente uso un prefisso di lunghezza in modo che il destinatario sappia esattamente quanti dati sono nel batch corrente; tuttavia, mi è stato inviato un .patch che suggerisce di utilizzare NetworkStream.DataAvailable. La mia preoccupazione è che questo mi dirà solo cosa ha ricevuto il destinatario, non ciò che il mittente ha originariamente inviato, ma non sono un esperto di socket.

Sbaglio? O è il prefisso di lunghezza la strada da percorrere?

(nota che non riesco semplicemente a leggere () fino a quando lo stream non viene chiuso, poiché più batch vengono inviati sulla stessa connessione ed è fondamentale che tratti ciascun batch come separato; se leggo troppo in un batch ( anche se viene bufferizzato e scartato), la conversazione si interromperà).

È stato utile?

Soluzione

Un lato di una connessione non saprà se il buffer di invio dell'altro lato è vuoto.

DataAvailable indica solo se ci sono dati in arrivo da leggere. Potresti usarlo prima di Read () , ma da solo non ti fornisce le informazioni che desideri. Non ti dice l'inizio e la fine di ogni lotto.

Ho già codificato conversazioni avanti e indietro in precedenza e ho usato prefissi di lunghezza nei dati. Quello che ho fatto è stato scrivere funzioni di supporto che leggessero un numero esatto di byte (blocchi alla volta) e non di più.

L'unica alternativa ai valori di lunghezza del batch nello stream è un modo per esaminare i dati in arrivo e riconoscere gli inizi e le finali dei batch.

Altri suggerimenti

Se hai bisogno di sapere quando il destinatario ha ricevuto tutti i dati per un determinato messaggio, allora devi assolutamente allungare il prefisso.

In genere definisco una struttura simile a questa che esce davanti a tutti i messaggi binari che invio.

struct Header
{
  int packetIdentifier;
  int protocolVersion;
  int messageType;
  int payloadSize;
}

L'identificatore ti consente di determinare se hai un messaggio valido del tuo tipo di protocollo. La versione consente di rivedere il protocollo. Il tipo di messaggio è il tipo di messaggio (ovvero: CommsOnline). La dimensione del payload è la dimensione del corpo del messaggio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top