Używam potoków nazwanych skonfigurowanych do wysyłania danych jako strumienia jednobajtowego w celu przesyłania serializowanych struktur danych między dwiema aplikacjami. Serializowane dane zmieniają się dość dramatycznie. Po stronie wysyłającej to nie jest problem, mogę dostosować liczbę bajtów do wysłania dokładnie.Nazwane potoki, Jak poznać dokładną liczbę bajtów do odczytania po stronie czytania. C++, Windows
Jak ustawić bufor na końcu odbierającym (Reading) na dokładną liczbę bajtów do odczytania? Czy istnieje sposób, aby wiedzieć, jak duże są dane po stronie wysyłania (pisania)?
Spojrzałem na PeekNamedPipe, ale funkcja wydaje się bezużyteczna dla bajtów o nazwanych nazwanych potokach?
lpBytesLeftThisMessage [się opcjonalnie] Wskaźnik zmiennej, która odbiera liczbę pozostałych bajtów w tym komunikacie. Ten parametr będzie wynosił zero dla nazwanych potoków lub dla anonimowych potoków. Ten parametr może mieć wartość NULL, jeśli nie można odczytać danych.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365779(v=vs.85).aspx
jaki sposób można obsłużyć takiej sytuacji najlepiej, jeśli nie można określić dokładną wymaganą wielkość bufora?
Wysyłanie Kod
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
);
Kod Reading:
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
);
W powyższym kodzie buforze jest zawsze od wielkości 0 w funkcji PeakNamedPipe zwraca 0 dla wszystkich numBytesToRead zmiennych. Czy istnieje sposób na dokładne ustawienie tego rozmiaru bufora? Jeśli nie, jaki jest najlepszy sposób poradzenia sobie z taką sytuacją? Dzięki za pomoc!
Prostym sposobem jest napisać długości, potem dane. Odbiornik może następnie w prosty sposób odczytać długość i przydzielić bufor. W odróżnieniu od sposobu, w jaki działa tryb wiadomości przewodowych. –