Составители:
выполнения запроса) присвоить себе атрибуты безопасности клиента, а затем восстано-
вить собственные атрибуты с помощью следующих функций:
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
- …
- следующая ›
- последняя »
