Составители:
будет ли команда ожидать готовности клиента, чтобы установить с ним соединение, или
же она немедленно завершится.
Параметр dwMaxInstances. Программа-сервер может открывать каналы для не-
скольких клиентов, однако она должна заранее знать, со сколькими клиентами ей при-
дется поддерживать связь. Вводить новое имя канала для каждого клиента неудобно.
Каким же образом клиенты будут заранее узнавать, какое имя канала они должны ис-
пользовать, открывая соединение на своем конце? Чтобы обойти эту проблему, Win32
разрешает серверу многократно создавать один и тот же канал.
Каждый раз при вызове функции CreateNamedPipe() с одним и тем же именем вы
получаете новый экземпляр данного канала. Каждый такой экземпляр обеспечивает не-
зависимую линию связи с другим клиентом. Кроме того, сервер может заранее несколь-
ко раз создать один и тот же канал. Он получит несколько различных дескрипторов и
будет ожидать подключения программ-клиентов на других концах каналов. Все про-
граммы-клиенты для получения своих дескрипторов используют одно и то же имя кана-
ла, однако каждая из них получает дескриптор, указывающий на другой экземпляр кана-
ла. Если после того, как все каналы будут заняты, следующая программа-клиент
попытается установить соединение, она будет заблокирована до тех пор, пока сервер не
разорвет связь с одним из предыдущих экземпляров канала.
Параметр dwMaxInstances функции CreateNamedPipe() устанавливает верхний пре-
дел количества экземпляров одного канала, которые будут поддерживаться системой до
тех пор, пока функция CreateNamedPipe() не возвратит код ошибки. Флаг
PIPE_UNLIMITED_INSTANCES свидетельствует об отсутствии верхнего предела. В
этом случае максимальное число экземпляров ограничивается только системными ре-
сурсами. Значение параметра dwMaxInstances не может превышать значения
PIPE_UNLIMITED_INSTANCES. В файле Winbase.H значение параметра dwMaxIns-
tances задано равным 255.
Параметры dwOutBuf и dwInBuf задают начальные размеры буферов, в которые
производится запись информации. Для выходного канала (PIPE_ACCESS_OUTBOUND)
значение имеет только размер выходного буфера, для входного канала - только размер
входного буфера.
Пределы, заданные параметрами буфера, достаточно гибки. Каждая операция чте-
ния или записи заставляет операционную систему выделить место для буфера из дина-
мической области системной памяти ядра. Значение, определяющее размер буфера, ин-
терпретируется как квота, ограничивающая выделенный объем памяти. Когда система
предоставляет место для буфера операций записи, она анализирует заданные пределы
буфера. Если размер нового буфера не превышает заданный, операция выполняется кор-
ректно. Но даже если размер созданного буфера не укладывается в заданные рамки, сис-
тема все равно выделяет для него место - за счет ресурсов процесса. Во избежание пере-
грузки ресурсов процесса каждая операция WriteFile(), вызывающая превышение
выделенного размера буфера, блокируется. Записывающий поток приостанавливается до
тех пор, пока поток-получатель не уменьшит объем буфера, прочитав из него достаточ-
ный объем информации.
При оценке размеров буфера необходимо принимать во внимание тот факт, что ре-
альный размер всегда должен быть немного больше расчетного, поскольку каждое со-
общение сопровождается дополнительной внутренней структурой данных размером
приблизительно в 28 байтов. Точный размер этой структуры не документируется и мо-
жет изменяться от версии к версии.
Итак, операционная система при необходимости динамически выделяет системную
память для буфера, однако потоки, для работы которых требуется объем памяти, пре-
вышающий выделенный размер буфера, могут быть заблокированы. От увеличения раз-
180
будет ли команда ожидать готовности клиента, чтобы установить с ним соединение, или же она немедленно завершится. Параметр dwMaxInstances. Программа-сервер может открывать каналы для не- скольких клиентов, однако она должна заранее знать, со сколькими клиентами ей при- дется поддерживать связь. Вводить новое имя канала для каждого клиента неудобно. Каким же образом клиенты будут заранее узнавать, какое имя канала они должны ис- пользовать, открывая соединение на своем конце? Чтобы обойти эту проблему, Win32 разрешает серверу многократно создавать один и тот же канал. Каждый раз при вызове функции CreateNamedPipe() с одним и тем же именем вы получаете новый экземпляр данного канала. Каждый такой экземпляр обеспечивает не- зависимую линию связи с другим клиентом. Кроме того, сервер может заранее несколь- ко раз создать один и тот же канал. Он получит несколько различных дескрипторов и будет ожидать подключения программ-клиентов на других концах каналов. Все про- граммы-клиенты для получения своих дескрипторов используют одно и то же имя кана- ла, однако каждая из них получает дескриптор, указывающий на другой экземпляр кана- ла. Если после того, как все каналы будут заняты, следующая программа-клиент попытается установить соединение, она будет заблокирована до тех пор, пока сервер не разорвет связь с одним из предыдущих экземпляров канала. Параметр dwMaxInstances функции CreateNamedPipe() устанавливает верхний пре- дел количества экземпляров одного канала, которые будут поддерживаться системой до тех пор, пока функция CreateNamedPipe() не возвратит код ошибки. Флаг PIPE_UNLIMITED_INSTANCES свидетельствует об отсутствии верхнего предела. В этом случае максимальное число экземпляров ограничивается только системными ре- сурсами. Значение параметра dwMaxInstances не может превышать значения PIPE_UNLIMITED_INSTANCES. В файле Winbase.H значение параметра dwMaxIns- tances задано равным 255. Параметры dwOutBuf и dwInBuf задают начальные размеры буферов, в которые производится запись информации. Для выходного канала (PIPE_ACCESS_OUTBOUND) значение имеет только размер выходного буфера, для входного канала - только размер входного буфера. Пределы, заданные параметрами буфера, достаточно гибки. Каждая операция чте- ния или записи заставляет операционную систему выделить место для буфера из дина- мической области системной памяти ядра. Значение, определяющее размер буфера, ин- терпретируется как квота, ограничивающая выделенный объем памяти. Когда система предоставляет место для буфера операций записи, она анализирует заданные пределы буфера. Если размер нового буфера не превышает заданный, операция выполняется кор- ректно. Но даже если размер созданного буфера не укладывается в заданные рамки, сис- тема все равно выделяет для него место - за счет ресурсов процесса. Во избежание пере- грузки ресурсов процесса каждая операция WriteFile(), вызывающая превышение выделенного размера буфера, блокируется. Записывающий поток приостанавливается до тех пор, пока поток-получатель не уменьшит объем буфера, прочитав из него достаточ- ный объем информации. При оценке размеров буфера необходимо принимать во внимание тот факт, что ре- альный размер всегда должен быть немного больше расчетного, поскольку каждое со- общение сопровождается дополнительной внутренней структурой данных размером приблизительно в 28 байтов. Точный размер этой структуры не документируется и мо- жет изменяться от версии к версии. Итак, операционная система при необходимости динамически выделяет системную память для буфера, однако потоки, для работы которых требуется объем памяти, пре- вышающий выделенный размер буфера, могут быть заблокированы. От увеличения раз- 180
Страницы
- « первая
- ‹ предыдущая
- …
- 176
- 177
- 178
- 179
- 180
- …
- следующая ›
- последняя »