Вопрос по – восстановление из TCP-клиента Indy «Reset By Peer»

10

Как мне восстановиться в этой ситуации?

Сервер аварийно завершает работу, поэтому соединение было аномально закрыто. Призывы почти ко всему приводят к «сбросу соединения по пиру» исключения. Похоже, я исправил это, вызвав Disconnect для объекта TIdTCPClient внутри блока исключений, но это приводит к одному окончательному исключению с тем же сообщением (которое я обнаружил во втором блоке попытки исключения).

Это с Indy10 и Delphi XE2.

<code>   try
      if not EcomSocket.Connected then EcomSocket.Connect();
    except
      on e: Exception do begin
        try
          EcomSocket.Disconnect();
        except
          MessageDlg('Connectivity to the server has been lost.', mtError, [mbOK], 0);
        end;
      end;
    end;
</code>
Меня не очень беспокоит, почему я получаю исключение при вызове разъединения. Я просто хочу знать, как правильно восстанавливаться после такой ситуации. Andy Clark
Вы пытались отладить TIdTCPConnection.Disconnect в IdTCPConnection.pas? Возможно, обработчик OnDisconnect выполняется и использует соединение. Или NotifyPeer играет роль, см. Также комментарии в источнике о различных сценариях mjn
Сложно сказать, не зная, что делает программа mjn
Освобождение объекта и создание нового нового поможет (но не поможет найти причину исключения) mjn
Это то, что я считаю актуальным (поэтому не стесняйтесь просить больше). Клиент - это наш графический интерфейс, который выдает команды серверу в нашей системе. Клиент должен распознать, когда соединение не удалось, и попытаться восстановить соединение, пока соединение не будет восстановлено. У меня это работает именно так, как я хочу сейчас. Когда сервер завершает работу корректно, он вызывает DisconnectNotifyPeers, и соединения закрываются чисто. Когда сервер аварийно завершает работу, клиенты распознают это и действуют соответствующим образом. Это код, который является проблемой. Я опубликую это ниже. Andy Clark

Ваш Ответ

1   ответ
9

try 
  if not EcomSocket.Connected then EcomSocket.Connect(); 
except 
  try 
    EcomSocket.Disconnect(False); 
  except 
  end; 
  if EcomSocket.IOHandler <> nil then EcomSocket.IOHandler.InputBuffer.Clear; 
  MessageDlg('Connectivity to the server has been lost.', mtError, [mbOK], 0); 
end; 
Error: User Rate Limit Exceeded Andy Clark

Похожие вопросы