Окна именованных каналов на практике

Что касается именованных каналов 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 заявляет следующее

Каждый раз, когда создается именованный канал, система создает входящие и / или исходящие буферы с использованием невыгружаемого пула, который является физической памятью, используемой ядром. Количество экземпляров канала (а также таких объектов, как потоки и процессы), которые вы можете создать, ограничено доступным невыгружаемым пулом. Каждый запрос на чтение или запись требует места в буфере для чтения или записи данных, а также дополнительное пространство для внутренних структур данных.

Я также учел бы вышеизложенное, если вы создаете / уничтожаете много труб. Я предполагаю, что было бы лучше работать с пулом дескрипторов канала, если есть много клиентов и есть некоторый механизм увеличения / сжатия в пул.

Другие вопросы по тегам