Estoy utilizando Canalizaciones con nombre configuradas para enviar datos como una secuencia de bytes únicos para enviar estructuras de datos serializados entre dos aplicaciones. Los datos serializados cambian de tamaño dramáticamente. En el lado del envío, esto no es un problema, puedo ajustar el número de bytes para enviar exactamente.Canalizaciones con nombre, cómo saber el número exacto de bytes para leer en el lado de lectura. C++, Windows
¿Cómo puedo configurar el búfer en el extremo de recepción (Lectura) con el número exacto de bytes para leer? ¿Hay alguna manera de saber qué tan grande es la información en el lado de envío (Escritura)?
He mirado PeekNamedPipe, pero la función parece inútil para byte mecanografiado named pipes?
lpBytesLeftThisMessage [a cabo, opcional] Un puntero a una variable que recibe el número de bytes restantes en este mensaje. Este parámetro será cero para las tuberías con nombre de tipo de byte o para las tuberías anónimas. Este parámetro puede ser NULL si no se deben leer datos.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365779(v=vs.85).aspx
¿Cómo se puede manejar una situación de este tipo mejor si no se puede determinar el tamaño del búfer exacta requerida?
Envío de Código
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
);
Código de lectura:
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
);
En el código anterior búfer siempre es de tamaño 0 como la función PeakNamedPipe devuelve 0 para todos los numBytesToRead variables. ¿Hay alguna manera de establecer este tamaño de búfer exactamente? Si no, ¿cuál es la mejor manera de manejar una situación así? ¡Gracias por cualquier ayuda!
Un enfoque simple es escribir la longitud primero, luego los datos. El receptor puede leer primero la longitud y asignar el búfer. No muy diferente a la forma en que funciona el modo de mensaje de tubería. –