171 lines
4.8 KiB
C
171 lines
4.8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1990 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
tnpcli.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This program makes simple client calls to tnpsrv.c
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Colin Watson (ColinW) 19-March-1991
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
#include <assert.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <windows.h>
|
||
|
|
||
|
CHAR* WriteData1 = "Hello Mars\n";
|
||
|
CHAR* WriteData2 = "Hello Jupiter\n";
|
||
|
|
||
|
int
|
||
|
main(
|
||
|
int argc,
|
||
|
char *argv[],
|
||
|
char *envp[]
|
||
|
)
|
||
|
{
|
||
|
|
||
|
HANDLE C1;
|
||
|
DWORD Size;
|
||
|
DWORD Dummy;
|
||
|
DWORD Count;
|
||
|
CHAR Data[1024];
|
||
|
OVERLAPPED Overlapped;
|
||
|
|
||
|
printf("Create client...\n");
|
||
|
|
||
|
C1 = CreateFile("\\\\.\\Pipe\\cw\\testpipe",
|
||
|
GENERIC_READ | GENERIC_WRITE,
|
||
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||
|
NULL, // Security Attributes
|
||
|
OPEN_EXISTING,
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL
|
||
|
);
|
||
|
for ( Count = 1; Count < 10; Count++ ) {
|
||
|
|
||
|
printf("Client Writing...\n");
|
||
|
if ( FALSE == WriteFile(C1, WriteData1, strlen(WriteData1)+1, &Dummy, NULL) ) {
|
||
|
printf("Client WriteFile returned Error %lx\n", GetLastError() );
|
||
|
}
|
||
|
|
||
|
while (1) {
|
||
|
printf("Client now Peeking...\n");
|
||
|
if ( FALSE == PeekNamedPipe(C1,Data, sizeof(Data), &Size, NULL, NULL) ) {
|
||
|
printf("Client PeekNamedPipe returned Error %lx\n", GetLastError() );
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( Size ) {
|
||
|
printf("Client PeekNamedPipe Done %lx: %s\n", Size, Data);
|
||
|
break;
|
||
|
}
|
||
|
else {
|
||
|
printf("Client PeekNamedPipe Done, no data yet, sleep 1 sec\n");
|
||
|
Sleep(1000);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
printf("Client now Reading...\n");
|
||
|
if ( FALSE == ReadFile(C1,Data, sizeof(Data), &Size, NULL) ) {
|
||
|
printf("Client ReadFile returned Error %lx\n", GetLastError() );
|
||
|
}
|
||
|
|
||
|
printf("Client Reading Done %lx: %s\n", Size, Data);
|
||
|
}
|
||
|
|
||
|
{
|
||
|
DWORD Flags;
|
||
|
DWORD OutBufferSize;
|
||
|
DWORD InBufferSize;
|
||
|
DWORD MaxInstances;
|
||
|
|
||
|
printf("Client call GetNamedPipeInfo....\n");
|
||
|
|
||
|
if ( FALSE == GetNamedPipeInfo(C1, &Flags, &OutBufferSize, &InBufferSize, &MaxInstances) ){
|
||
|
printf("Client GetNamedPipeInfo returned Error %lx\n", GetLastError() );
|
||
|
}
|
||
|
else {
|
||
|
printf("Flags %lx, OutBufferSize %lx, InBufferSize %lx, MaxInstances %lx\n",
|
||
|
Flags, OutBufferSize, InBufferSize, MaxInstances);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
{
|
||
|
DWORD State;
|
||
|
DWORD CurInstances;
|
||
|
|
||
|
printf("Client call GetNamedPipeHandleState....\n");
|
||
|
|
||
|
if ( FALSE == GetNamedPipeHandleState(C1, &State, &CurInstances, NULL, NULL, NULL, 0) ){
|
||
|
printf("Client GetNamedPipeHandleState returned Error %lx\n", GetLastError() );
|
||
|
}
|
||
|
else {
|
||
|
printf("State %lx, CurInstances %lx\n", State, CurInstances );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
printf("Client attempting 10 second WaitNamedPipe- should timeout...\n");
|
||
|
|
||
|
if ( FALSE == WaitNamedPipe("\\\\.\\Pipe\\cw\\testpipe", 10000, NULL) ) {
|
||
|
printf("Client WaitNamedPipe returned Error %lx\n", GetLastError() );
|
||
|
}
|
||
|
|
||
|
printf("WaitNamedPipe complete\n");
|
||
|
|
||
|
printf("Client attempting 10 second WaitNamedPipe- should timeout...\n");
|
||
|
|
||
|
Overlapped.hEvent = CreateEvent(NULL,TRUE,TRUE);
|
||
|
|
||
|
if ( FALSE == WaitNamedPipe("\\\\.\\Pipe\\cw\\testpipe", 10000, &Overlapped) ) {
|
||
|
printf("Client WaitNamedPipe returned Error %lx\n", GetLastError() );
|
||
|
if ( GetLastError() == ERROR_IO_PENDING ) {
|
||
|
printf("Server got ERROR_IO_PENDING ok,Waiting for pipe\n");
|
||
|
assert( FALSE == GetOverlappedResult(NULL , &Overlapped, &Dummy, TRUE ));
|
||
|
printf("Client WaitNamedPipe returned Error Ok %lx\n", GetLastError() );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
printf("WaitNamedPipe complete\nClient closing...\n");
|
||
|
CloseHandle(C1);
|
||
|
printf("Client closed\n");
|
||
|
|
||
|
printf("Client attempting 10 second WaitNamedPipe- should work...\n");
|
||
|
|
||
|
if ( FALSE == WaitNamedPipe("\\\\.\\Pipe\\cw\\testpipe", 10000, NULL) ) {
|
||
|
printf("Client WaitNamedPipe returned Error %lx\n", GetLastError() );
|
||
|
}
|
||
|
|
||
|
printf("WaitNamedPipeComplete\n");
|
||
|
|
||
|
for ( Count = 1; Count < 5; Count++ ) {
|
||
|
|
||
|
printf("Client CallNamedPipe...\n");
|
||
|
|
||
|
if ( FALSE == CallNamedPipe(
|
||
|
"\\\\.\\Pipe\\cw\\testpipe",
|
||
|
WriteData2,
|
||
|
strlen(WriteData2)+1,
|
||
|
Data,
|
||
|
sizeof(Data),
|
||
|
&Size,
|
||
|
10000 // Ten second timeout
|
||
|
) ) {
|
||
|
printf("CallNamedPipe returned Error %lx\n", GetLastError() );
|
||
|
}
|
||
|
printf("Client CallNamedPipe Done %lx: %s\n", Size, Data);
|
||
|
}
|
||
|
|
||
|
printf("CallNamedPipe complete\n");
|
||
|
|
||
|
}
|