Как обнаружить клиентское разъединение с помощью клиента/сервера именованного канала?

Я узнаю об именованных каналах и играл с примерами клиента и сервера именованного канала из документа MSDN:

Сервер именованного канала

Клиент именованного канала

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

Мой вопрос, если я уничтожаю клиент (путем закрытия его, или заканчивая его через Диспетчер задач) там какой-либо путь к стороне сервера для обнаружения разъединения?

Я попытался использовать GetNamedPipeHandleState () надежда, что он возвращает отказ, и вызов к GetLastError () возвратил бы ERROR_PIPE_NOT_CONNECTED, но это не имело место. Из-за пути настраивается этот сервер, я должен был сделать, это в CompletedReadRoutine функционирует и создает "управляемый" отказ. То, что я сделал, было с точкой останова на CompletedReadRoutine в сервере:

  1. запущенный сервер
  2. запущенный клиент
  3. отправленный сообщение через клиент (поражает точку останова в сервере здесь),
  4. уничтоженный клиент
  5. Ступивший до GetNamedPipeHandleState

Вызов к GetNamedPipeHandleState () возвращается успешно, таким образом, я никогда не добирался, чтобы сделать GetLastError () вызов. Когда это добирается до вызова WriteFileEx, это перестало работать, и вызов к GetLastError в той точке возвращает ERROR_NO_DATA.

Рассмотрение канала функционирует, я не вижу ничто больше, что возможно помогло бы здесь. Я пропускаю что-то или являюсь клиентским разъединением, просто не обнаруживаемым.

Единственная другая вещь, о которой я могу думать, собирает pid соединяющихся клиентов (через GetNamedPipeClientProcessId) и отделяет сторожевые потоки, чтобы проверить, живы ли они все еще. Хотя, просто думая о выполнении, которое выделяет мой смысл spidey.

Существует ли способ обнаружить разъединенные клиенты при использовании именованных каналов?

9
задан Robert Groves 3 March 2010 в 21:58
поделиться