Как обнаружить клиентское соединение с именованным канальным сервером, используя перекрывающийся ввод-вывод? - PullRequest
2 голосов
/ 23 июня 2010

Я изучал MSDN примеры использования именованных каналов:

Сервер легко определяет, когда клиент отключен, и создает экземпляр именованного канала. Но я не могу понять, как сервер знает, что клиент подключен к каналу перед отправкой каких-либо данных от клиента.

Может ли сервер обнаружить перехваченного клиента до того, как клиент отправит какие-либо данные?

Если сервер вызывает DisconnectNamedPipe до того, как клиент сначала отключится, будет ли это также отключать клиента? Может ли сервер отключить клиента от канала без согласования с клиентом?

Ответы [ 2 ]

3 голосов
/ 24 июня 2010

Не уверен, что понимаю трубку.Сервер вызывает ConnectNamedPipe для ожидания подключения клиента.Данные не нужно отправлять.Также он не может быть отправлен, вы не можете создать файл ReadFile, пока клиент не подключится.Обратите внимание, что образец SDK также использует это.

Если сервер отключается изящно (без уведомления клиента каким-либо сообщением, чтобы он мог закрыть свой конец канала), тогда клиент получит ошибку, ERROR_PIPE_NOTCONNECTED(Я думаю).Нет никаких оснований полагаться на то, что для нормального завершения работы вам нужно сделать что-то разумное, когда процесс сервера трубок неожиданно завершился сбоем и сгорел.

Остерегайтесь того, что каналы сложно исправить из-за их асинхронного характера.Получение ошибок, которые на самом деле не являются проблемами, является обычным явлением, и вам придется с этим справляться.Мой код канала обрабатывает следующие ошибки:

  • ConnectNamedPipe: ERROR_PIPE_CONNECTED в гонке соединения, игнорировать
  • FlushFileBuffers: гонка при закрытии трубы, игнорировать все ошибки
  • WaitNamedPipe: ERROR_FILE_NOT_если время ожидания истекло, выполните преобразование в WAIT_TIMEOUT
  • CreateFile: ERROR_PIPE_BUSY, если другому клиенту сначала удалось получить канал, повторите
1 голос
/ 05 июля 2012

Сервер работает неправильно, когда клиенты получают ошибку ERROR_FILE_NOT_FOUND во время вызовов WaitNamedPipe() или / и CreateFile(). Этот код ошибки означает, что на сервере нет доступных каналов с указанным именем. Вам следует создать новый канал на сервере сразу после ConnectNamedPipe() вызова, чтобы избежать этой проблемы.

...