Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 2. Конспекты (02_04_19).rtf
Скачиваний:
65
Добавлен:
10.09.2019
Размер:
363.46 Кб
Скачать

Подключение клиента к серверу

BOOL CallNamedPipe(

LPCSTR lpNamedPipeName,

LPVOID lpInBuffer,

DWORD nInBufferSize,

LPVOID lpOutBuffer,

DWORD nOutBufferSize,

LPDWORD lpBytesRead,

DWORD nTimeOut,

);

Параметры и описание:

(1) lpNamedPipeName — определяет название именованного канала.

(2) lpInBuffer — определяет данные для записи в канал.

(3) nInBufferSize — определяет размер буфера записи в байтах.

(4) lpOutBuffer — определяет указатель на буфер, который получает данные, прочитанные из канала.

(5) nOutBufferSize — определяет размер буфера чтения в байтах.

(6) lpBytesRead — определяет указатель на переменную, которая получает количество байтов, прочитанных из канала.

(7) nTimeOut — определяет количество миллисекунд ожидания для того, чтобы именованный канал был доступен. В дополнение к числовым значениям могут быть указаны следующие специальные значения.

NMPWAIT_NOWAIT (0x00000001) — не ждет именованного канала. Если именованный канал недоступен, функция возвращает ошибку.

NMPWAIT_WAIT_FOREVER (0xffffffff) — ждет бесконечно.

NMPWAIT_USE_DEFAULT_WAIT (0x00000000) — используется время ожидания по умолчанию, указанное при вызове функции CreateNamedPipe.

Возвращаемое значение.

Если функция завершается успешно, возвращаемое значение равно TRUE, иначе FALSE.

Если сообщение, записанное в канал серверным процессом, длиннее, чем nOutBufferSize, CallNamedPipe возвращает FALSE, а GetLastError возвращает ERROR_MORE_DATA. Оставшаяся часть сообщения отбрасывается, потому что CallNamedPipe закрывает дескриптор канала перед возвратом.

Дополнительная информация.

Вызов CallNamedPipe эквивалентен вызову функций CreateFile (или WaitNamedPipe, если CreateFile не может сразу открыть канал), TransactNamedPipe и CloseHandle. CreateFile вызывается с флагом доступа GENERIC_READ | GENERIC_WRITE и флаг дескриптора наследования FALSE.

Пример (C).

CLIENT

#include <windows.h>

int main() {

HANDLE hPipe;

DWORD dwWritten;

hPipe = CreateFile(TEXT("\\\\.\\pipe\\Pipe"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

if (hPipe != INVALID_HANDLE_VALUE) {

WriteFile(hPipe, "Hello Pipe\n", 12, &dwWritten, NULL);

CloseHandle(hPipe);

}

return 0;

}

SERVER

#include <stdio.h>

#include <windows.h>

int main() {

HANDLE hPipe;

char buffer[1024];

DWORD dwRead;

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) {

while (ReadFile(hPipe, buffer, sizeof(buffer) - 1, &dwRead, NULL) != FALSE) {

buffer[dwRead] = '\0';

printf("%s", buffer);

}

}

DisconnectNamedPipe(hPipe);

}

return 0;

}