
- •Лабораторна робота № 8 Засоби взаємодії між процесами у Windows
- •Короткі теоретичні відомості
- •Створення іменованого каналу
- •З’єднання сервера з каналом
- •З’єднання клієнта з каналом
- •Обмін даними через іменований канал
- •Від’єднання сервера від каналу
- •Завдання для виконання
- •Додаток 20.1. Приклад використання іменованого каналу
Від’єднання сервера від каналу
Від’єднання сервера від каналу здійснюється за допомогою функції DisconnectNamedPipe(), яка відключає примірник іменованого каналу від клієнтського процесу.
BOOL DisconnectNamedPipe(
HANDLEhNamedPipe// дескриптор каналу
);
Після цього сервер може з’єднатися з іншим клієнтським процесом, використовуючи функцію ConnectNamedPipe()і наявний у нього дескриптор.
Завдання для виконання
Написати консольну програму клієнт-сервер із використанням іменованого каналу. Сервер створює іменований канал і переходить в режим прийому запитів від клієнта. Одержаний у вигляді текстового рядка запит виводить на екран. Клієнт з’єднується з іменованим каналом на заданому хості, приймає з клавіатури текстовий запит і відправляє його серверу. Ім’я хоста задається в командному рядку при запуску клієнта.
Змінити програму з п. 1 таким чином, щоб сервер після прийому запиту клієнта відправляв відповідь клієнту, а клієнт виводив його на екран.
Змінити програму з п. 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;
}