Составители:
выполнения запроса) присвоить себе атрибуты безопасности клиента, а затем восстано-
вить собственные атрибуты с помощью следующих функций:
BOOL ImpersonateNamedPipeClient( HANDLE hNamedPipe );
BOOL RevertToSelf( void ) ;
Функция ImpersonateNamedPipeClient() не работает с анонимными каналами и не
позволяет серверу принимать полномочия клиента с удаленного компьютера. К тому же
она временно изменяет контекст безопасности вызывающего потока
Функция RevertToSelf() завершает процесс передачи полномочий и восстанавлива-
ет исходный контекст безопасности.
Клиент разрывает связь с каналом посредством вызова функции CloseHandle().
Сервер может поступить таким же образом, однако иногда предпочтительнее отклю-
читься от клиента, не уничтожая канал (это позволит сохранить его для использования в
будущем). С помощью функции DisconnectNamedPipe() сервер в принудительном по-
рядке прекращает диалог с клиентом и делает его дескриптор недействительным.
BOOL DisconnectNamedPipe( HANDLE hNamedPipe ) ;
Если клиент попытается выполнить чтение или запись с помощью своего дескрип-
тора после отключения сервера, возникнет ошибка, и ему все равно придется вызвать
функцию CloseHandle().
В результате разрыва соединения все данные, оставшиеся в канале, будут утеряны.
Сервер может сохранить оставшуюся информацию, вызвав функцию FlushFileBuffers().
BOOL FlushFileBuffers ( HANDLE hFile );
Получив дескриптор именованного канала, функция FlushFileBuffers() блокируется
до тех пор, пока не освободятся буферы этого канала.
При отключении канала от клиента сам объект-канал не уничтожается. Разорвав
соединение, сервер должен вызвать функцию ConnectNamedPipe() в ожидании нового
подключения освободившегося канала или же вызвать функцию CloseHandle() для унич-
тожения данного экземпляра объекта. Клиенты, заблокированные функцией WaitNa-
medPipe(), при закрытии своего дескриптора канала разблокированы не будут. Ожидая
подключения к новому клиенту, сервер должен отключить свой конец канала и вызвать
функцию ConnectNamedPipe().
Таким образом, как и большинство из рассмотренных до сих пор объектов, каналы
остаются в памяти до тех пор, пока не будут закрыты все их дескрипторы. Любой про-
цесс должен на своем конце канала завершаться вызовом функции CloseHandle(). Если
вы забудете об этом, команда ExitProcess() автоматически закроет все оставшиеся деск-
рипторы.
§ 8.3. Обмен информацией с использованием сокетов
8.3.1. Общие положения. Виды сетевых протоколов
Для разработки программного обеспечения для сетевых технологий необходимо
знать основные концепции и терминологию, используемую при работе в этой среде. По-
этому вначале рассмотрим некоторые общие вопросы. Большинство начинающих поль-
зователей Internet быстро привыкают к тому факту, что у них есть свой адрес электрон-
ной почты и IP-адрес. Настройка компьютера для работы в сетях TCP/IP обычно
189
выполнения запроса) присвоить себе атрибуты безопасности клиента, а затем восстано- вить собственные атрибуты с помощью следующих функций: BOOL ImpersonateNamedPipeClient( HANDLE hNamedPipe ); BOOL RevertToSelf( void ) ; Функция ImpersonateNamedPipeClient() не работает с анонимными каналами и не позволяет серверу принимать полномочия клиента с удаленного компьютера. К тому же она временно изменяет контекст безопасности вызывающего потока Функция RevertToSelf() завершает процесс передачи полномочий и восстанавлива- ет исходный контекст безопасности. Клиент разрывает связь с каналом посредством вызова функции CloseHandle(). Сервер может поступить таким же образом, однако иногда предпочтительнее отклю- читься от клиента, не уничтожая канал (это позволит сохранить его для использования в будущем). С помощью функции DisconnectNamedPipe() сервер в принудительном по- рядке прекращает диалог с клиентом и делает его дескриптор недействительным. BOOL DisconnectNamedPipe( HANDLE hNamedPipe ) ; Если клиент попытается выполнить чтение или запись с помощью своего дескрип- тора после отключения сервера, возникнет ошибка, и ему все равно придется вызвать функцию CloseHandle(). В результате разрыва соединения все данные, оставшиеся в канале, будут утеряны. Сервер может сохранить оставшуюся информацию, вызвав функцию FlushFileBuffers(). BOOL FlushFileBuffers ( HANDLE hFile ); Получив дескриптор именованного канала, функция FlushFileBuffers() блокируется до тех пор, пока не освободятся буферы этого канала. При отключении канала от клиента сам объект-канал не уничтожается. Разорвав соединение, сервер должен вызвать функцию ConnectNamedPipe() в ожидании нового подключения освободившегося канала или же вызвать функцию CloseHandle() для унич- тожения данного экземпляра объекта. Клиенты, заблокированные функцией WaitNa- medPipe(), при закрытии своего дескриптора канала разблокированы не будут. Ожидая подключения к новому клиенту, сервер должен отключить свой конец канала и вызвать функцию ConnectNamedPipe(). Таким образом, как и большинство из рассмотренных до сих пор объектов, каналы остаются в памяти до тех пор, пока не будут закрыты все их дескрипторы. Любой про- цесс должен на своем конце канала завершаться вызовом функции CloseHandle(). Если вы забудете об этом, команда ExitProcess() автоматически закроет все оставшиеся деск- рипторы. § 8.3. Обмен информацией с использованием сокетов 8.3.1. Общие положения. Виды сетевых протоколов Для разработки программного обеспечения для сетевых технологий необходимо знать основные концепции и терминологию, используемую при работе в этой среде. По- этому вначале рассмотрим некоторые общие вопросы. Большинство начинающих поль- зователей Internet быстро привыкают к тому факту, что у них есть свой адрес электрон- ной почты и IP-адрес. Настройка компьютера для работы в сетях TCP/IP обычно 189
Страницы
- « первая
- ‹ предыдущая
- …
- 185
- 186
- 187
- 188
- 189
- …
- следующая ›
- последняя »