Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / Презентация. Механизмы ядра. Часть 2.pptx
Скачиваний:
55
Добавлен:
20.09.2019
Размер:
4.94 Mб
Скачать

Создание именованного канала

#include <stdio.h>

Сервер (создает канал и ожидает

int main() {

#include <windows.h>

 

HANDLE hPipe;

подключение)

char buffer[1024]; /* Буфер для чтения и записи */

DWORD dwRead, dwWritten; /* Количество прочитанных / записанных байт */

hPipe = CreateNamedPipe(TEXT("\\\\.\\pipe\\Pipe"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 1024 * 16, 1024 * 16, NMPWAIT_USE_DEFAULT_WAIT, NULL);

while (hPipe != INVALID_HANDLE_VALUE) { /* Пока канал существует */

if (ConnectNamedPipe(hPipe, NULL) != FALSE) { /* Если клиент пришел */ printf("[Client connected]\n"); /* Выводим лог в консоль */

WriteFile(hPipe, "Hello, user\n", 13, &dwWritten, NULL); /* Пишем ему “привет” */ while (ReadFile(hPipe, buffer, sizeof(buffer) - 1, &dwRead, NULL) != FALSE) {

/* Получили от него сообщение. Выводим в консоль */ buffer[dwRead] = '\0'; /* Символ конца строки */ printf("Client say: %s\n", buffer);

}

}

DisconnectNamedPipe(hPipe); /* Прощаемся с ним */

printf("[Connection disconnected. Waiting for the next client...]\n");

}

return 0;

}

Создание именованного канала

#include <stdio.h>

Лучше всего ввод чисел с клавиатуры

#include <windows.h>

располагать перед “подключением” к каналу,

int main() {

чтобы не задерживать соединение.

 

HANDLE hPipe;

Клиент (подключается к

char buffer[1024];каналу)/* Буфер чтения и записи */

DWORD dwRead, dwWritten; /* Количество прочитанных / записанных байт */

hPipe = CreateFile(TEXT("\\\\.\\pipe\\Pipe"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); /* Открытие канала на чтение и запись */

if (hPipe != INVALID_HANDLE_VALUE) { /* Если канал открыт удачно */

ReadFile(hPipe, buffer, sizeof(buffer) - 1, &dwRead, NULL); /* Читаем сообщение сервера */ buffer[dwRead] = '\0';

printf("Server say: %s\n", buffer); /* Выводим сообщение в консоль */ printf("What to send? "); /* Спрашиваем: что отправить? */

scanf("%1024[^\n]s", buffer); /* Клиент пишет на клавиатуре (обычно так не делают) */ WriteFile(hPipe, buffer, strlen(buffer), &dwWritten, NULL); /* Отправляем серверу */ CloseHandle(hPipe); /* Закрываем дескриптор */

}

else {

printf("Server is busy or not found"); /* Сервер (канал) занят или не найден */

}

return 0;

}

Создание именованного канала

Сервер ожидает

Клиент подключается.

Клиент получает

подключения

Сервер отображает

приветственное

 

информацию на экране.

 

сообщение от сервера и

 

 

тому

Клиент набирает

Сервер получает сообщение от

сообщение на

клиента и отсоединяется от него

клавиатуре и отправляет

по своей воле

Отображение информации в Process Explorer

Наш именованный канал “Pipe”

Литература

Используемая литература

1.Рихтер Дж. Windows для профессионалов: создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows / Пер. с англ. — 4-е изд. — Спб.: Питер; М.: Издательство «Русская редакция»; 2008. — 720 стр.: ил.

2.Щупак Ю. А. Win32 API. Эффективная разработка приложений. — СПб.: Питер, 2007. — 572 с.: ил.

3.MSDN. Waitable Timer.

https://docs.microsoft.com/en-us/windows/desktop/sync/waitable-

timer-objects

4. MSDN. Pipes.

https://docs.microsoft.com/en-us/windows/desktop/ipc/pipes

FINAL