Sto utilizzando Named Pipe configurato per inviare dati come flusso di un singolo byte per inviare strutture di dati serializzate tra due applicazioni. I dati serializzati cambiano in dimensioni abbastanza drammatiche. Dal lato dell'invio, questo non è un problema, posso regolare il numero di byte da inviare esattamente.Named Pipes, Come sapere il numero esatto di byte da leggere sul lato di lettura. C++, Windows
Come posso impostare il buffer sul lato di ricezione (Lettura) sul numero esatto di byte da leggere? C'è un modo per sapere quanto sono grandi i dati sul lato di invio (Scrittura)?
Ho visto PeekNamedPipe, ma la funzione appare inutile per le pipe denominate byte digitate?
lpBytesLeftThisMessage [out, opzionale] Un puntatore a una variabile che riceve il numero di byte rimanenti in questo messaggio. Questo parametro sarà zero per pipe denominate di tipo byte o per pipe anonime. Questo parametro può essere NULL se nessun dato deve essere letto.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365779(v=vs.85).aspx
Come si fa a gestire una situazione del genere meglio se non è possibile determinare l'esatta dimensione del buffer necessaria?
Invio codice
string strData;
strData = "ShortLittleString";
DWORD numBytesWritten = 0;
result = WriteFile(
pipe, // handle to our outbound pipe
strData.c_str(), // data to send
strData.length(), // length of data to send (bytes)
&numBytesWritten, // will store actual amount of data sent
NULL // not using overlapped IO
);
lettura di codice:
DWORD numBytesToRead0 = 0;
DWORD numBytesToRead1 = 0;
DWORD numBytesToRead2 = 0;
BOOL result = PeekNamedPipe(
pipe,
NULL,
42,
&numBytesToRead0,
&numBytesToRead1,
&numBytesToRead2
);
char * buffer ;
buffer = new char[numBytesToRead2];
char data[1024]; //1024 is way too big and numBytesToRead2 is always 0
DWORD _numBytesRead = 0;
BOOL result = ReadFile(
pipe,
data, // the data from the pipe will be put here
1024, // number of bytes allocated
&_numBytesRead, // this will store number of bytes actually read
NULL // not using overlapped IO
);
Nel codice precedente tampone è sempre di dimensione 0 come funzione PeakNamedPipe restituisce 0 per tutti numBytesToRead variabili. C'è un modo per impostare esattamente questa dimensione del buffer? In caso contrario, qual è il modo migliore per gestire una situazione del genere? Grazie per qualsiasi aiuto!
Un approccio semplice è quello di scrivere la lunghezza, poi i dati. Il ricevitore può quindi leggere prima la lunghezza e allocare il buffer. Non diversamente dal modo in cui funziona la modalità messaggio pipe. –