データを 1 バイト ストリームとして送信するように構成された名前付きパイプを使用して、2 つのアプリケーション間でシリアル化されたデータ構造を送信しています。シリアル化されたデータは、サイズが大幅に変化します。送信側では、これは問題ではありません。送信するバイト数を正確に調整できます。
受信 (読み取り) 側のバッファーを、読み取る正確なバイト数に設定するにはどうすればよいですか? 送信(書き込み)側のデータの大きさを知る方法はありますか?
PeekNamedPipe を見てきましたが、この関数はバイト型の名前付きパイプには役に立たないように見えますか?
lpBytesLeftThisMessage [出力、オプション] このメッセージに残っているバイト数を受け取る変数へのポインター。バイト型の名前付きパイプまたは匿名パイプの場合、このパラメーターはゼロになります。データを読み取る必要がない場合、このパラメーターは NULL にすることができます。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365779(v=vs.85).aspx
必要なバッファ サイズを正確に判断できない場合、このような状況をどのように処理するのが最善でしょうか?
送信コード
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
);
読み取りコード:
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
);
上記のコードでは、PeakNamedPipe 関数がすべてのnumBytesToRead変数に対して 0 を返すため、バッファーのサイズは常に 0 です。このバッファサイズを正確に設定する方法はありますか? そうでない場合、そのような状況を処理する最善の方法は何ですか? 助けてくれてありがとう!