![]() |
|
|
![]()
|
|
| Usper |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 13.4.2007 Репутация: 15 Всего: 15 |
Для разрабатываемого приложения требуется межпроцессное взаимодействие. Выбор пал на именованые каналы. Всё вроде бы работает, но только до тех пор, пока клиент не закроет канал со своей стороны. После этого клиент повторно присоединиться к серверу не может, функция CreateFile() возвращает INVALID_HANDLE_VALUE. Что должен делать сервер, после того как канал будет закрыт со стороны клиента? Создать канал заново? Как серверу определить, что клиент уже закрыл канал?
-------------------- На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Сервер должен создать (позвать CreateNamedPipe) столько именнованных каналов, сколько он хочет обслужить клиентов зараз (т.е. в вашем случае 1000 раз)
Каждый вызов ConnectNamedPipe подключает ОДНОГО клиента, для подключения следующего клиента сервер опять должен позвать ConnectNamedPipe
IMHO есть и явные индикаторы закрытия канала, см MSDN |
|||
|
||||
| Usper |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 13.4.2007 Репутация: 15 Всего: 15 |
Да нет, мне не нужно одновременно работать с тысячью клиентов (с чего вы взяли?). Достаточно и одного. Но в любом случае, что тогда означет параметр nMaxInstances в функции CreateNamedPipe?
-------------------- На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Вот это собственно и значит - количество инстансов именновоного пайпа, которые вы собираетесь создать. (Отсюда я и взял число 1000 Пардон, не туда посмотрел - у вас вообще PIPE_UNLIMITED_INSTANCES) Но этот параметр никоим образом не заставляет Винду создать все эти инстантсы После отключения клиента, сервер должен позвать DisconnectNamedPipe на хэндлере, где был клиент, а потом может снова звать ConnectNamedPipe Это сообщение отредактировал(а) xvr - 19.10.2009, 16:04 |
|||
|
||||
| Usper |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 13.4.2007 Репутация: 15 Всего: 15 |
Спасибо за советы, всё заработало. Однако аппетит приходит во время еды
-------------------- На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Использовать Overlapped IO или неблокирующий режим открытия Named Pipe'а |
|||
|
||||
| Usper |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 13.4.2007 Репутация: 15 Всего: 15 |
А можно поподробнее про эти режимы? Сервер ведь может и не ответить вообще, клиент при этом не должен зависать. В этих условиях эти режимы подходят?
-------------------- На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник. |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Совершенно обычные режимы Overlapped IO. Любая функция в Overlapped режиме только стартует операцию и немедленно возвращается с ошибкой ERROR_IO_PENDING. Дальше программа может заниматься чем хочет, а когда операция наконец выполнится, то система взведет Event (который подавался как параметр в оригинальную функцию) Неблокирующий режим просто сразу возвращается с ошибкой, т.е. программа должна периодически пробовать снова и снова
|
||||
|
|||||
| Usper |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 13.4.2007 Репутация: 15 Всего: 15 |
А в клиенте надо указать какие-то параметры, указывающие на то, что необходимо работать в неблокирующем режиме? У меня почему-то функция ReadFile всё ещё бесконечно ждёт ответа сервера.
Сервер:
Клиент:
-------------------- На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник. |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Надо. См. функцию SetNamedPipeHandleState |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |