Окна именованных каналов на практике
Что касается именованных каналов Windows, как правильно использовать CreateNamedPipe
, ConnectNamedPipe
, DisconnectNamedPipe
, а также CloseHandle
звонки?
Я делаю серверное приложение, которое подключается к клиентскому приложению, которое подключается и отключается к каналу несколько раз в течение сеанса.
Когда мои записи не удаются, потому что клиент отключен, я должен позвонить DisconnectNamedPipe
, CloseHandle
или ничего на моей ручке.
Затем, чтобы принять новое соединение, я должен позвонить CreateNamedPipe
а потом ConnectNamedPipe
, или просто ConnectNamedPipe
?
Мне бы очень хотелось, чтобы объяснить различные состояния, в которых мой канал может быть в результате этих вызовов, потому что я не нашел этого в другом месте.
Дополнительная информация:
Язык: Python с использованием win32pipe
,win32file
а также win32api
библиотеки.
Настройки трубы: ПОДОЖДИТЕ, без перекрытия, по потоку.
2 ответа
Мне удалось добиться того, чего я хотел. Я звоню CreateNamedPipe
а также CloseHandle
ровно один раз за сеанс, и я звоню DisconnectNamedPipe
когда моя запись не удалась, а затем другой ConnectNamedPipe
,
Хитрость заключается только в том, чтобы позвонить DisconnectNamedPipe
когда труба была на самом деле подключена. Я звонил каждый раз, когда пытался подключиться "просто чтобы быть уверенным", и это вызывало у меня странные ошибки.
Смотрите также ответ djgandy для получения дополнительной информации о каналах.
Это хорошая практика, чтобы позвонить DisconnectNamedPipe
затем CloseHandle
, хотя CloseHandle
должен все очистить.
Документация MSDN немного расплывчата, и пример их сервера довольно прост. Что касается повторного использования ручек трубы, то, похоже, это ваш собственный выбор. Документация для DisconnectNamedPipe
кажется, указывает на то, что вы можете повторно использовать дескриптор канала для нового клиента, вызвав ConnectNamedPipe
снова на этой ручке после отключения. Роль ConnectNamedPipe
кажется, чтобы назначить подключающегося клиента к дескриптору.
Убедитесь, что вы чистите трубы, хотя MSDN заявляет следующее
Каждый раз, когда создается именованный канал, система создает входящие и / или исходящие буферы с использованием невыгружаемого пула, который является физической памятью, используемой ядром. Количество экземпляров канала (а также таких объектов, как потоки и процессы), которые вы можете создать, ограничено доступным невыгружаемым пулом. Каждый запрос на чтение или запись требует места в буфере для чтения или записи данных, а также дополнительное пространство для внутренних структур данных.
Я также учел бы вышеизложенное, если вы создаете / уничтожаете много труб. Я предполагаю, что было бы лучше работать с пулом дескрипторов канала, если есть много клиентов и есть некоторый механизм увеличения / сжатия в пул.