// ==================================================
// Приложение MSLOTC (клиентское приложение)
// Демонстрация использования каналов Mailslot
// для передачи данных между процессами
//
// (С) Фролов А.В., 1996
// Email: frolov@glas.apc.org
// ==================================================

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

DWORD main(int argc, char *argv[])
{
  // Идентификатор канала Mailslot
  HANDLE hMailslot;

  // Буфер для имени канала Mailslot
  char   szMailslotName[256];

  // Буфер для передачи данных через канал
  char   szBuf[512];

  // Количество байт, переданных через канал
  DWORD  cbWritten;

  printf("Mailslot client demo\n"
    "(C) A. Frolov, 1996, Email: frolov@glas.apc.org\n");

  printf("Syntax: mslotc [servername]\n");

  // Если при запуске было указано имя срвера,
  // указываем его в имени канала Mailslot
  if(argc > 1)
    sprintf(szMailslotName, "\\\\%s\\mailslot\\$Channel$",
      argv[1]);
  
  // Если имя сервера задано не было, создаем канал
  // с локальным процессом
  else
    strcpy(szMailslotName, "\\\\.\\mailslot\\$Channel$");

  // Создаем канал с процессом MSLOTS
  hMailslot = CreateFile(
    szMailslotName, GENERIC_WRITE,
    FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    
  // Если возникла ошибка, выводим ее код и 
  // завершаем работу приложения
  if(hMailslot == INVALID_HANDLE_VALUE)
  {
    fprintf(stdout,"CreateFile: Error %ld\n", 
      GetLastError());
    getch();
    return 0;
  }

  // Выводим сообщение о создании канала
  fprintf(stdout,"\nConnected. Type 'exit' to terminate\n"); 

  // Цикл посылки команд через канал
  while(1)
  {
    // Выводим приглашение для ввода команды
    printf("cmd>");
    
    // Вводим текстовую строку
    gets(szBuf);

    // Передаем введенную строку серверному процессу
    // в качестве команды
    if(!WriteFile(hMailslot, szBuf, strlen(szBuf) + 1,
      &cbWritten, NULL))
      break;
    
    // В ответ на команду "exit" завершаем цикл
    // обмена данными с серверным процессом
    if(!strcmp(szBuf, "exit"))
      break;
  }

  // Закрываем идентификатор канала
  CloseHandle(hMailslot);
  return 0;
}

