Что происходит с именованным каналом в случае сбоя сервера? - PullRequest
3 голосов
/ 10 октября 2010

Я мало знаю о каналах, но использовал один для соединения двух процессов в моем коде в Visual C ++.Канал работает хорошо, но мне нужно добавить обработку ошибок к нему, поэтому я хотел знать, что произойдет с каналом, если сервер, создавший его, потерпит крах, и как я узнаю его из процесса клиента?

что произойдет, если клиентский процесс попытается получить доступ к тому же каналу после сбоя сервера, если не будет обработана ошибка?

Редактировать: Как это повлияет на память, еслия продолжаю создавать новые каналы (скажем, используя системное время в качестве имени канала), в то время как предыдущий был сломан из-за сбоя сервера?Будут ли эти сломанные трубы удалены из памяти?

Ответы [ 2 ]

1 голос
/ 11 октября 2010

Я просто хочу добавить это.

Если вы хотите живучий метод для передачи данных между двумя приложениями, вы можете рассмотреть возможность использования MSMQ или даже использования BizTalk или другой платформы сообщений.

Есть несколько вещей, которые следует учитывать:

  1. что произойдет, если сервер перезагрузится или отключится?
  2. Что произойдет, если серверное приложение перестает отвечать на запросы?
  3. Что произойдет, если серверное приложение будет убито или полностью исчезнет?
  4. Каков соответствующий ответ клиентского приложения вкаждый из вышеперечисленных?

Каждый из этих контекстов представляет потенциальную потерю данных.Если потеря данных неприемлема, то именованные каналы - это не тот механизм, который вам следует использовать.Вместо этого вам нужно как-то сохранять сообщения.

MSMQ, хранение в базе данных или даже использование Biztalk может позаботиться о живучести самого сообщения.

Если произойдет 1 или 3, тогдаименованный канал исчезает и должен быть воссоздан новым экземпляром вашего серверного приложения.Если произойдет # 2, то канал не исчезнет, ​​пока кто-либо не перезагрузит сервер или не убьет серверное приложение и не запустит его снова.

Независимо от того, клиентское приложение должно решить вышеуказанные проблемы.Они сводятся к проблемам с подключением.В зависимости от того, что делает клиент, он может перевести его в состояние ожидания и позволить ему время от времени пинговать сервер, чтобы узнать, вернется ли он снова.

Не зная природу процессов передачи данных и данных, трудно рекомендовать правильный подход.

1 голос
/ 10 октября 2010

IIRC функция ReadFile или WriteFile вернет FALSE, а GetLastError () вернет STATUS_PIPE_DISCONNECTED

Я полагаю, что такая обработка реализована в вашем коде, если нет, вам лучше добавить ее; -)

...