/* filename: pipe_server.c */

#define UNICODE

#include <windows.h>
#include <stdio.h>

int main() {
  wchar_t buf[1024];
  int numBytes = 0;
  BOOL writeGood = FALSE;

  HANDLE hPipe = NULL;
  hPipe = CreateNamedPipe(L"\\\\.\\pipe\\purpose",
                          PIPE_ACCESS_DUPLEX,
                          PIPE_TYPE_BYTE,
                          1,
                          512, /* out-buf size */
                          512, /* in-buf size */
                          0,
                          NULL);

  if (hPipe == INVALID_HANDLE_VALUE) {
    _putws(L"hPipe error.\n");
    return 0;
  }

  puts("server is listening...");
  if (ConnectNamedPipe(hPipe, NULL) == TRUE) {
    writeGood = WriteFile(hPipe, L"^_^", 8, &numBytes, NULL);
    printf("numBytes for writefile = %d\n", numBytes);
    if (writeGood == FALSE)  return 0;

    _putws(L"sleeping...");
    Sleep(8000);

    writeGood = WriteFile(hPipe, L">_<", 8, &numBytes, NULL);
    printf("numBytes for writefile = %d\n", numBytes);
    if (writeGood == FALSE)  return 0;

    ReadFile(hPipe, 
             buf, 
             1024 * sizeof(wchar_t),
             &numBytes,
             NULL);
    printf("numBytes for readfile = %d\n", numBytes);
    _putws(buf);
  }

  FlushFileBuffers(hPipe);
  DisconnectNamedPipe(hPipe); 
  CloseHandle(hPipe);
  return 0;
}