Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР_СПОС-8.doc
Скачиваний:
9
Добавлен:
17.02.2016
Размер:
87.55 Кб
Скачать

Від’єднання сервера від каналу

Від’єднання сервера від каналу здійснюється за допомогою функції DisconnectNamedPipe(), яка відключає примірник іменованого каналу від клієнтського процесу.

BOOL DisconnectNamedPipe(

HANDLEhNamedPipe// дескриптор каналу

);

Після цього сервер може з’єднатися з іншим клієнтським процесом, використовуючи функцію ConnectNamedPipe()і наявний у нього дескриптор.

Завдання для виконання

  1. Написати консольну програму клієнт-сервер із використанням іменованого каналу. Сервер створює іменований канал і переходить в режим прийому запитів від клієнта. Одержаний у вигляді текстового рядка запит виводить на екран. Клієнт з’єднується з іменованим каналом на заданому хості, приймає з клавіатури текстовий запит і відправляє його серверу. Ім’я хоста задається в командному рядку при запуску клієнта.

  2. Змінити програму з п. 1 таким чином, щоб сервер після прийому запиту клієнта відправляв відповідь клієнту, а клієнт виводив його на екран.

  3. Змінити програму з п. 2 таким чином, щоб клієнт і сервер могли обмінюватися повідомленнями багаторазово. Після одержання кожного повідомлення клієнт (сервер) виводить його на екран і переходить в режим введення з клавіатури нового повідомлення. Робота клієнта (сервера) завершується при введенні з клавіатури команди $quit.

Додаток 20.1. Приклад використання іменованого каналу

/* Програма-сервер для читання повідомлення з іменованого каналу */

#include <windows.h>

int main (void)

{

HANDLE hPipe;

DWORD dwRead;

char c = -1;

hPipe = CreateNamedPipe("\\\\.\\pipe\\hello", PIPE_ACCESS_INBOUND, PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 256, 256, 1000, NULL);

ConnectNamedPipe (hPipe, NULL);

while (c != '\0')

{

ReadFile(hPipe, &c, 1, &dwRead, NULL);

if (dwRead > 0 && c != 0) putchar(c) ;

}

DisconnectNamedPipe (hPipe);

CloseHandle (hPipe);

return 0;

}

/* Програма-клієнт для відправки запиту через іменований канал */

#include <windows.h>

#include <stdio.h>

int main (int argc, char *argv[])

{

HANDLE hPipe;

DWORD dwWritten;

char lpPipe[80];

char lpText[] = "Client Massage";

if (argc != 2)

{

printf ("Usage: %s hostname\n", argv[0]);

return 1;

}

sprintf (lpPipe, "\\\\%s\\pipe\\hello", argv[1]);

WaitNamedPipe (lpPipe, NMPWAIT_WAIT_FOREVER);

hPipe = CreateFile (lpPipe, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

WriteFile (hPipe, lpText, strlen(lpText)+1, &dwWritten, NULL);

CloseHandle (hPipe);

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]