int
main(
int
argc,
const
char
**
argv)
wcout
<<
"
Creating an instance of a named pipe...
"
<<
endl;
//
Create a pipe to send data
HANDLE pS = CreateNamedPipe(L
"
\\\\.\\pipe\\my_pipe
"
, PIPE_ACCESS_DUPLEX,
0
,
1
,
100
,
100
,
0
, NULL);
//
Open the named pipe
HANDLE pC = CreateFile(L
"
\\\\.\\pipe\\my_pipe
"
, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ |
FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if
(pC ==
INVALID_HANDLE_VALUE)
wcout
<<
"
Failed to connect to pipe.
"
<<
endl;
return
1
;
wcout
<<
"
Test PeekNamedPipe #1.
"
<<
endl;
DWORD PipeByteNum
=
0
;
BOOL res
= PeekNamedPipe(pC, NULL,
0
, NULL, &
PipeByteNum, NULL);
if
(!
res)
wcout
<<
"
PeekNamedPipe() - failed.
"
<<
endl;
return
1
;
wcout
<<
"
- Number of bytes in pipe:
"
<< PipeByteNum << endl <<
endl;
wcout
<<
"
Sending data to pipe...
"
<<
endl;
const
wchar_t* data = L
"
Hello Pipe World
"
;
DWORD numBytesWritten
=
0
;
BOOL result
= WriteFile(pS, data, wcslen(data) *
sizeof
(wchar_t), &
numBytesWritten, NULL);
if
(result)
wcout
<<
"
Number of bytes sent:
"
<< numBytesWritten <<
endl;
wcout
<<
"
Failed to send data.
"
<<
endl;
return
1
;
wcout
<<
"
Test PeekNamedPipe #2.
"
<<
endl;
PipeByteNum
=
0
;
res
= PeekNamedPipe(pC, NULL,
0
, NULL, &
PipeByteNum, NULL);
if
(!
res)
wcout
<<
"
PeekNamedPipe() - failed.
"
<<
endl;
return
1
;
wcout
<<
"
- Number of bytes in pipe:
"
<< PipeByteNum << endl <<
endl;
wcout
<<
"
Reading data from pipe...
"
<<
endl;
//
The read operation will block until there is data to read
wchar_t buffer[
128
];
DWORD numBytesRead
=
0
;
result
= ReadFile(pC, buffer,
5
*
sizeof
(wchar_t), &
numBytesRead, NULL);
if
(result)
buffer[numBytesRead
/
sizeof
(wchar_t)] =
'
\0
'
;
//
null terminate the string
wcout <<
"
Number of bytes read:
"
<< numBytesRead <<
endl;
wcout
<<
"
Message:
"
<< buffer <<
endl;
wcout
<<
"
Failed to read data from the pipe.
"
<<
endl;
return
1
;
wcout
<<
"
Test PeekNamedPipe #3.
"
<<
endl;
PipeByteNum
=
0
;
DWORD bytesAvail
=
0
;
BOOL isOK
= PeekNamedPipe(pC, NULL,
0
, NULL, &
bytesAvail, NULL);
//
Allocate buffer and peek data from pipe
DWORD bytesRead =
0
;
std::vector
<wchar_t>
buffer_(bytesAvail);
isOK
= PeekNamedPipe(pC, &buffer_[
0
], bytesAvail, &
bytesRead, NULL, NULL);
if
(!
isOK)
wcout
<<
"
PeekNamedPipe() - failed.
"
<<
endl;
return
1
;
wcout
<<
"
- Number of bytes in pipe:
"
<< bytesRead << endl <<
endl;
//
Close client.
CloseHandle(pC);
wcout
<<
"
Done with client.
"
<<
endl;
//
Close the pipe.
CloseHandle(pS);
wcout
<<
"
Done with server.
"
<<
endl;
return
0
;
ReadFile会先从管道内读取5*sizeof(wchar_t)大小的字节,然后PeekNamedPipe会读取剩下的字节。最后缓存区buffer_会打印“ Pipe World”