|
|
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
DWORD Size; LPSTR WriteData = "Hello World\n";
VOID ClientThread( LPVOID ThreadParameter ) { DWORD n; HANDLE C1; LPSTR l;
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 | FILE_FLAG_OVERLAPPED, NULL );
if ( C1 == INVALID_HANDLE_VALUE ) { DWORD Status; printf("CreateFile returned Error %lx\n", Status = GetLastError() ); }
printf("Client writing...\n");
assert( TRUE == WriteFile(C1,WriteData,Size, &n, NULL) ); assert( n==Size ); printf("Client done Writing...\n");
// Get WriteData back from the server
l = LocalAlloc(LMEM_ZEROINIT,Size); assert(l); printf("Client reading\n");
assert( TRUE == ReadFile(C1,l,Size, &n, NULL));
printf("Client reading Done %s\n",l); Sleep(10000); printf("Client done Sleeping...\n"); }
int main( int argc, char *argv[], char *envp[] ) { DWORD n; LPSTR l; HANDLE Thread; HANDLE S1,S2,S3; // Server handles
DWORD ThreadId; DWORD Dummy; OVERLAPPED S1Overlapped;
S1 = CreateNamedPipe("\\\\.\\Pipe\\cw\\testpipe", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_WAIT | PIPE_READMODE_MESSAGE| PIPE_TYPE_MESSAGE, 2, 1024, 1024, 0, NULL);
assert(S1 != INVALID_HANDLE_VALUE);
S2 = CreateNamedPipe("\\\\.\\Pipe\\cw\\testpipe", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_WAIT | PIPE_READMODE_MESSAGE| PIPE_TYPE_MESSAGE, 992, //IGNORED
0, //IGNORED
0, //IGNORED
0, //IGNORED
NULL);
assert(S2 != INVALID_HANDLE_VALUE);
S3 = CreateNamedPipe("\\\\.\\Pipe\\cw\\testpipe", PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_WAIT | PIPE_READMODE_MESSAGE| PIPE_TYPE_MESSAGE, 992, 0, 0, 0, NULL);
assert( S3 == INVALID_HANDLE_VALUE ); //Should fail - Used all instances
S1Overlapped.hEvent = NULL; assert( FALSE == ConnectNamedPipe( S1, &S1Overlapped )); assert( ERROR_IO_PENDING == GetLastError());
assert( FALSE == GetOverlappedResult( S1, &S1Overlapped, &Dummy, FALSE )); assert( ERROR_IO_INCOMPLETE == GetLastError());
Size = strlen(WriteData)+1; l = LocalAlloc(LMEM_ZEROINIT,Size); assert(l);
Thread = CreateThread(NULL,0L,ClientThread,(LPVOID)99,0,&ThreadId); assert(Thread);
printf("Waiting for connection\n"); assert( TRUE == GetOverlappedResult( S1, &S1Overlapped, &Dummy, TRUE ));
printf("Connected, Server now Reading\n"); if ( FALSE == ReadFile(S1,l,Size, &n, &S1Overlapped) ) { DWORD Status; printf("Server ReadFile returned Error %lx\n", Status = GetLastError() );
if ( Status == ERROR_IO_PENDING ) { printf("Server got ERROR_IO_PENDING ok,Waiting for data\n"); assert( TRUE == GetOverlappedResult( S1, &S1Overlapped, &Dummy, TRUE )); }
} printf("Server Reading Done %s\n",l);
printf("Server Writing\n"); if ( FALSE == WriteFile(S1,l,Size, &n, &S1Overlapped) ) { DWORD Status; printf("Server WriteFile returned Error %lx\n", Status = GetLastError() );
if ( Status == ERROR_IO_PENDING ) { printf("Server got ERROR_IO_PENDING ok,Waiting for transfer complete\n"); assert( TRUE == GetOverlappedResult( S1, &S1Overlapped, &Dummy, TRUE )); }
} printf("Server Writing Done %s\n",l); }
|