Windows назвала каналы на практике

С Windows named pipe, каким образом можно использовать CreateNamedPipe , ConnectNamedPipe , DisconnectNamedPipe и CloseHandle ?

Я делаю серверное приложение, которое подключается к клиентскому приложению, которое подключается и отключается к каналу несколько раз через сеанс.

Когда мои записи терпят неудачу, потому что клиент отключен, я должен вызвать DisconnectNamedPipe , CloseHandle или ничего на моем дескрипторе.

Затем, чтобы принять новое соединение, я должен вызвать CreateNamedPipe а затем ConnectNamedPipe или просто ConnectNamedPipe ?

Мне очень хотелось бы объяснить разные состояния, которые моя труба может быть в результате этих вызовов, потому что я не нашел этого в другом месте.

Дополнительная информация:

Язык: Python, используя win32pipe , win32file и win32api .

Настройки трубы: WAIT, без перекрытия, по потоку.

2 Solutions collect form web for “Windows назвала каналы на практике”

Хорошей практикой является вызов DisconnectNamedPipe затем CloseHandle , хотя CloseHandle должен очистить все.

Документация MSDN немного расплывчата, и их пример сервера довольно простой. Что касается повторного использования ручек для труб, кажется, что это ваш собственный выбор. Документация для DisconnectNamedPipe видимому, указывает на то, что вы можете повторно использовать дескриптор канала для нового клиента, снова вызвав ConnectNamedPipe на этом дескрипторе после отключения. Роль ConnectNamedPipe похоже, заключается в назначении соединительного клиента для дескриптора.

Убедитесь, что вы очищаете трубы, хотя MSDN заявляет следующее

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

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

Мне удалось добиться того, чего я хотел. Я вызываю CreateNamedPipe и CloseHandle ровно один раз за сеанс, и я вызываю DisconnectNamedPipe когда моя запись терпит неудачу, а затем другой ConnectNamedPipe .

Хитрость заключается только в том, чтобы вызвать DisconnectNamedPipe когда труба была фактически подключена. Я называл это каждый раз, когда я пытался подключиться «просто, чтобы быть уверенным», и это дало мне странные ошибки.

См. Также ответ djgandy для получения дополнительной информации о трубах.

  • Как настроить Python Kivy для PyCharm в Windows?
  • Почему языки сценариев не выводят Unicode на консоль Windows?
  • Пакетный файл для автоматизации выполнения Sysinternals
  • xlwings с python 3.5 в Windows
  • Показать диалоговое окно свойств проводника для файла в Windows
  • Более быстрый способ чтения пикселя экрана в Python, чем PIL?
  • Есть ли способ запустить cpython на неустойчивой нити, не рискуя столкнуться?
  • Избавление от консоли Python в wxPython под Windows
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.