Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Листинги / Листинги / 16-03-Server

.cpp
Скачиваний:
4
Добавлен:
24.03.2016
Размер:
3.31 Кб
Скачать
#include <windows.h>
#include <iostream.h>
#include <string.h>

int main()
{
  HANDLE   hNamedPipe;
  DWORD   dwBytesRead;     // для количества прочитанных байтов
  DWORD   dwBytesWrite;    // для количества записанных байтов
  char     pchMessage[80]; // для сообщения
  int    nMessageLength;   // длина сообщения

  // создаем именованный канал для чтения и записи
  hNamedPipe = CreateNamedPipe(
    "\\\\.\\pipe\\demo_pipe",  // имя канала
    PIPE_ACCESS_DUPLEX,        // читаем из канала и пишем в канал
    PIPE_TYPE_MESSAGE | PIPE_WAIT,   // синхронная передача сообщений
    1,         // максимальное количество экземпляров канала 
    0,         // размер выходного буфера по умолчанию
    0,         // размер входного буфера по умолчанию
    INFINITE,  // клиент ждет связь бесконечно долго
    NULL       // безопасность по умолчанию
    );
  // проверяем на успешное создание
  if (hNamedPipe == INVALID_HANDLE_VALUE)
  {
    cerr << "Create named pipe failed." << endl
      << "The last error code: " << GetLastError() << endl;
    cout << "Press any key to exit.";
    cin.get();

    return 0;
  }
  
  // ждем, пока клиент свяжется с каналом
  cout << "The server is waiting for connection with a client." << endl;
  if(!ConnectNamedPipe(
    hNamedPipe,    // дескриптор канала
    NULL      // связь синхронная
    ))
  {
    cerr << "Connect named pipe failed." << endl
      << "The last error code: "<<GetLastError() << endl;
    CloseHandle(hNamedPipe);
    cout << "Press any key to exit.";
    cin.get();

    return 0;
  }
  // читаем сообщение от клиента
  if (!ReadFile(
    hNamedPipe,      // дескриптор канала
    pchMessage,      // адрес буфера для ввода данных
    sizeof(pchMessage),  // количество читаемых байтов
    &dwBytesRead,    // количество прочитанных байтов
    NULL))           // передача данных синхронная
  {
    cerr << "Data reading from the named pipe failed." << endl
      << "The last error code: "<< GetLastError() << endl;
    CloseHandle(hNamedPipe);
    cout << "Press any key to exit.";
    cin.get();

    return 0;
  }

  // выводим полученное от клиента сообщение на консоль
  cout << "The server received the message from a client: "
    << endl << '\t' << pchMessage << endl;

  // вводим строку
  cout << "Input a string: ";
  cin.getline(pchMessage, 80);
  // определяем длину строки
  nMessageLength = strlen(pchMessage) + 1;

  // отвечаем клиенту
  if (!WriteFile(
    hNamedPipe,      // дескриптор канала
    pchMessage,      // адрес буфера для вывода данных
    nMessageLength,  // количество записываемых байтов
    &dwBytesWrite,   // количество записанных байтов
    NULL             // передача данных синхронная
    ))
  {
    cerr << "Write file failed." << endl
      << "The last error code: " << GetLastError() << endl;
    CloseHandle(hNamedPipe);
    cout << "Press any key to exit.";
    cin.get();

    return 0;
  }

  // выводим посланное клиенту сообщение на консоль
  cout << "The server sent the message to a client: "
    << endl << '\t' << pchMessage << endl;

  // закрываем дескриптор канала 
  CloseHandle(hNamedPipe);
  // завершаем процесс
  cout << "Press any key to exit.";
  cin.get();

  return 0;
}
Соседние файлы в папке Листинги