

| стрелялки |
| спорт |
| драки |
| стратегии |
| гонки |
| логические |
| азартные |
| аркады |
| эротические |
| фильмы онлайн |
| Управление соединением с клиентом |
|
Создавший именованный канал сервер на правах старшинства управляет процессом подключения к каналу и отключения от него клиентских приложений. Такая привилегия подкреплена двумя функциями 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(). |
