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

Функция соединения сервера с клиентом

Позволяет серверу именованного канала ждать, пока клиентский процесс подключится к экземпляру именованного канала. Клиентский процесс подключается путем вызова функции CreateFile или CallNamedPipe.

BOOL ConnectNamedPipe(

HANDLE hNamedPipe,

LPOVERLAPPED lpOverlapped

);

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

(1) hNamedPipe — дескриптор серверной части экземпляра именованного канала. Этот дескриптор возвращается функцией CreateNamedPipe.

(2) lpOverlapped — определяет указатель на перекрытую структуру.

— Если hNamedPipe был открыт с FILE_FLAG_OVERLAPPED, параметр lpOverlapped не должен быть недействителен. Он должен указывать на действительную структуру OVERLAPPED. Если hNamedPipe был открыт с FILE_FLAG_OVERLAPPED и lpOverlapped имеет значение NULL, функция может неправильно сообщить о завершении операции подключения.

— Если hNamedPipe был создан с FILE_FLAG_OVERLAPPED и lpOverlapped не равен NULL, структура OVERLAPPED должна содержать дескриптор объекта события с ручным сбросом (который сервер может создать с помощью функции CreateEvent).

— Если hNamedPipe не был открыт с FILE_FLAG_OVERLAPPED, функция не вернется, пока клиент не подключится или не произойдет ошибка. Успешные синхронные операции приводят к тому, что функция возвращает ненулевое значение, если клиент подключается после вызова функции.

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

Если операция является синхронной, ConnectNamedPipe не возвращается, пока операция не завершится. Если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция не работает, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

Если операция асинхронная, ConnectNamedPipe немедленно возвращается. Если операция еще не завершена, возвращаемое значение равно нулю, а GetLastError возвращает ERROR_IO_PENDING. (Вы можете использовать макрос HasOverlappedIoCompleted, чтобы определить, когда операция завершилась.) Если функция завершается ошибкой, возвращаемое значение равно нулю, а GetLastError возвращает значение, отличное от ERROR_IO_PENDING или ERROR_PIPE_CONNECTED.

Если клиент подключается до вызова функции, функция возвращает ноль, а GetLastError возвращает ERROR_PIPE_CONNECTED. Это может произойти, если клиент подключается в интервале между вызовом CreateNamedPipe и вызовом ConnectNamedPipe. В этой ситуации между клиентом и сервером существует хорошая связь, хотя функция возвращает ноль.

Отключение сервера от клиента

Отключает серверную часть экземпляра именованного канала от клиентского процесса.

BOOL DisconnectNamedPipe(

HANDLE hNamedPipe

);

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

(1) hNamedPipe — дескриптор серверной части экземпляра именованного канала.

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

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

Функция ожидания операции именованного канала

Ожидание, пока не истечет интервал времени ожидания или не станет доступен экземпляр указанного именованного канала для подключения (то есть процесс сервера канала выполняет ожидающую операцию ConnectNamedPipe для канала).

BOOL WaitNamedPipe(

LPCSTR lpNamedPipeName,

DWORD nTimeOut,

);

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

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

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

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

NMPWAIT_WAIT_FOREVER (0xffffffff) — функция не возвращается, пока не будет доступен экземпляр именованного канала.

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

Если экземпляр канала доступен до истечения времени ожидания, возвращаемое значение равно TRUE.

Если экземпляр канала недоступен до истечения времени ожидания, возвращаемое значение равно нулю.

Если экземпляров указанного именованного канала не существует, функция WaitNamedPipe немедленно возвращается, независимо от значения времени ожидания.

Если время ожидания истекло, функция WaitNamedPipe завершится с ошибкой ERROR_SEM_TIMEOUT.