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