我正在使用配置为将数据作为单字节流发送的命名管道,以在两个应用程序之间发送序列化数据结构。序列化数据的大小变化很大。在发送端,这不是问题,我可以调整要发送的字节数。
如何将接收(读取)端的缓冲区设置为要读取的确切字节数?有没有办法知道发送(写入)端的数据有多大?
我看过 PeekNamedPipe,但该函数对于字节类型的命名管道似乎没用?
lpBytesLeftThisMessage [out, optional] 指向变量的指针,该变量接收此消息中剩余的字节数。对于字节类型的命名管道或匿名管道,此参数将为零。如果没有要读取的数据,此参数可以为 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
);
在上面的代码中,缓冲区的大小始终为 0,因为 PeakNamedPipe 函数为所有numBytesToRead变量返回 0。有没有办法精确设置这个缓冲区大小?如果不是,那么处理这种情况的最佳方法是什么?谢谢你的帮助!