Операционные системы. Учебное пособие. Марапулец Ю.В. - 187 стр.

UptoLike

Составители: 

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