- •СПбГУТ им. проф. Бонч- Бруевича )))
- •План
- •Используемый софт
- •Таймер ожидания (Waitable Timer)
- •Таймер ожидания
- •Создание абсолютного таймера
- •Создание абсолютного таймера ожидания
- •Создание абсолютного таймера
- •Отображение информации в Process Explorer
- •Создание относительного таймера
- •Создание относительного таймера ожидания
- •Канал (Pipe)
- •Канал
- •Функциональность двух типов каналов
- •Создание анонимного канала
- •Создание анонимного канала
- •Создание анонимного канала
- •Создание анонимного канала
- •Создание анонимного канала
- •Отображение информации в Process Explorer
- •Создание именованного канала
- •Создание именованного канала
- •Создание именованного канала
- •Отображение информации в Process Explorer
- •Литература
- •Используемая литература
- •FINAL
Создание именованного канала
#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