.
Wednesday 23rd of May 2012    

Информация

Счетчики

Голосование

Лучшая марка телефона
 

Реклама

фильмы онлайн

фильмы онлайн


Управление соединением с клиентом
загрузка...

Создавший именованный канал сервер на правах старшинства управляет процессом подключения к каналу и отключения от него клиентских приложений. Такая привилегия подкреплена двумя функциями ConnectNamedPipe() и Dis-connectNamedPipe(). Вызов метода ConnectNamedPipe() переводит сервер в режим ожидания до тех пор, пока к экземпляру канала не подключится какое-либо клиентское приложение. Вызов функции целесообразен сразу после создания экземпляра канала (в особенности если сервер создает в отдельных потоках сразу несколько каналов) или сразу после отключения клиента от канала.

ШМтШ ЯШ function ConnectNamedPipe(hPipe : Thandle; OVERLAPPED : pOVERLAPPED):Boolean;

Здесь hPipe - дескриптор именованного канала, OVERLAPPED - указатель на структуру, используемую при операциях асинхронного ввода/вывода. Указатель на эту структуру передается лишь в тех случаях, когда канал был создан с применением флага FILE_FLAG_OVERLAPPED. Если канал перевелся в режим готовности к подключению, метод возвратит значение true. Для канала, созданного в синхронном блокирующем режиме (с использованием PIPEWAIT), рассматриваемая функция переходит в состояние ожидания соединения с клиентским процессом. Если канал создан в синхронном неблокирующем режиме (PIPENOWAIT), метод ConnectNamedPipe() немедленно возвращает управление с кодом true, при условии что клиент был отключен от данной реализации канала и возможно подключение этого клиента. В противном случае возвращается значение false.

Возврат методом ConnectNamedPipe() значения false не может считаться однозначным признаком того, что подключение завершилось неудачно. После выполне-

ния этой функции программист просто обязан проанализировать значение последней ошибки. Так метод GetLastError() возвратит код ошибки ERROR_PIPE_LISTEN-ING, если вообще нет желающих для подключения к именованному каналу. Кроме этого, высока вероятность встретить еще две ошибки: ERROR_PIPE_CONNECTED, если канал уже занят; ERROR_NO_DATA, если клиент отказался от канала, но не был отключен от него сервером при помощи метода DisconnectNamedPipe().

Особенность совместной работы клиента и сервера именованных каналов в том, что отказ клиента от канала (вызов им метода CloseHandle) физически не отключает его от сервера - канал по-прежнему остается в занятом состоянии, хотя данные по нему уже не транслируются. В клиент-серверной технологии окончательный разрыв связи считается привилегией сервера. В частности при работе с именованным каналом для этого вызывается метод:

W§E$$$Pi function DisconnectNamedPipe(hPipe : Thandle) : boolean;

Метод отбирает у клиентского приложения канал hPipe. Если сервер вновь пожелает поделиться этим каналом с миром, он вызывает метод ConnectNa-

medPipe().

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


загрузка...
 

Самое популярное:

bottom

карта сайта