Как узнать состояние TCP-сервера со стороны клиента (в случае избыточного сервера)? - PullRequest
1 голос
/ 23 августа 2011

У меня здесь ситуация.У меня есть резервный TCP-сервер, который принимает входные данные, а затем выбрасывает много пакетов навсегда.Читая их, я также пытаюсь не отставать от состояния сервера из TCP-клиента, выполняя send на сокете.Но мои серверы избыточны, разделяя виртуальный IP.Поэтому, если server1 выходит из строя, server2 запускается и использует один и тот же VIP (В любой момент времени VIP работает и работает).Так что моя техника send способна обнаружить эту ситуацию.Мой сервер2 ожидает ввода данных от клиента, но, поскольку send не выполняет работу, которую я ожидаю, я не смогу повторно отправить ввод.

  int status = ::send ( m_sock, s.c_str(), s.size(), MSG_NOSIGNAL );
  if ( status == -1 )
    {
      return false;
    }
  else
    {
      return true;
    }

Может кто-нибудь помочькак я могу выяснить этот вид аварийного переключения?

Ответы [ 3 ]

1 голос
/ 23 августа 2011

Хорошо, собираем вещи, я начинаю получать изображение здесь.

  • OP использует какой-то отработки отказа, при котором удаленный сервер фактически не отслеживает состояние

Причина, по которой вы не получаете EPIPE от отправки, в том, что все происходит так:

  • Вы send данные. send разблокировка и сегменты начинают движение
  • Удаленный сервер получает данные. "Кто этот парень? RST!"
  • Вы получили RST, но send уже вернулся. Соединение разорвано, но нет способа сообщить вам об этом (у него нет внешнего механизма)
  • Do Другой send

В заключение, если вы хотите проверить, живо ли еще соединение:

  • send данные
  • Подождите немного (RTT и тому подобное)
  • send снова

Если вы не получите EPIPE после второго send, соединение все еще установлено. Другая схема:

  • send данные, которые следует интерпретировать как " Скажи что-нибудь , если ты жив!"
  • Подождите немного
  • Если по истечении времени ожидания вы не получили подтверждение, соединение разорвано
0 голосов
/ 23 августа 2011

В конечном итоге отправка на сервер, который вступил во владение, должна завершиться сбоем, поскольку этот сервер не будет знать о соединении от клиентского IP: порта, поэтому он выдаст RST, который возвращается как send (), возвращая -1 иerrno = ECONNRESET.Это почти наверняка не произойдет при первой передаче после аварийного переключения из-за асинхронности и буферизации.

0 голосов
/ 23 августа 2011

Сеанс TCP не может быть перенесен с одного сервера на другой, просто второй сервер получает IP-адрес первого - информация о состоянии сеанса TCP также должна реплицироваться с первичного сервера на вторичный, для чего требуется специальное программное обеспечение.

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