Проблема TCPclient.connected в Delphi - Indy - PullRequest
2 голосов
/ 02 мая 2011

У меня проблема с IdTCPclient.connected функцией из Indy в Delphi.Я использую среду Indy10 и Delphi2010.Моя проблема - каждый раз, когда я проверяю TCP-соединение с IdTCPclient.connected , возникает исключение с этими ошибками EidSocketError , EidReadTimeOut .Есть ли способ отключить и снова подключить соединение?(как сбросить соединение).

Примечание. Я установил TCPClient.ReTimeout: = 30000;

. Применяется следующая кодировка для сброса соединения.

if IdTCPclient.connected then
  begin
  IdTCPclient.IOHandler.InputBuffer.Clear;
  IdTCPclient.Disconnect;
  end;
sleep(1000);
try
  IdTCPclient.connect;
  except
    on E: Exception do 
      MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
  end;

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

Должен ли я сделать это?

  • Сначала отключить
  • Очистить буфер ввода
  • Уничтожить TCPclient
  • Пересоздайте новый TCPclient
  • И затем подключите его снова

Если это так, может кто-нибудь предоставить мне способ, как это сделать правильно?

Также в моей кодировке есть еще одна функция для повторного подключения TCP.Это также дает мне исключение.Я проверяю соединение, прежде чем отправить сообщение в TCP.Если нет соединения, я воссоединяюсь пять раз.

result := IdTCPclient.connected
if not result then
  begin
  for k:=0 to 4 do
    beign
    sleep(1000);
    try
      TCPclient.connect;
      except
        on E: Exception do 
          MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
      end
    result := TCPclient.connected;
    if result then break;
    end;

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

  • Что мне делать, когда я получаю исключение?Должен ли я восстановить соединение из исключения?
  • Как мы строим кодирование для регулярной проверки соединения?
  • Как мы строим кодирование, чтобы вернуть соединение, когда оно потеряно?

С уважением,

Ответы [ 2 ]

5 голосов
/ 02 мая 2011

Connected() не должно вызывать никаких исключений. Если это так, то это скорее всего ошибка. Пожалуйста, предоставьте трассировку стека, показывающую это.

Лучший вариант - просто избегать использования Connected(), когда это возможно. Когда вам нужно выполнить операцию ввода-вывода, просто сделайте это и позвольте Indy вызвать исключение в случае сбоя. Вы можете обработать его в этот момент, например:

try
  IdTCPClient.DoSomething...
except
  on E: EIdException do begin
    Reconnect;
  end;
end;

procedure Reconnect;
var
  k: Integer;
begin
  IdTCPClient.Disconnect;
  if IdTCPClient.IOHandler <> nil then
    IdTCPClient.IOHandler.InputBuffer.Clear;

  for k := 0 to 4 do
  begin
    Sleep(1000);
    try
      IdTCPClient.Connect;
      Exit;
    except
      on E: Exception do
      begin
        MessageDlg('Connecting Error: '+E.Message, mtError, [mbOk], 0);
        if k = 4 then
          raise;
      end;
    end;
  end; 
end;
0 голосов
/ 18 сентября 2016

перед подключением убедитесь, что пассивное логическое значение idftp имеет значение false, когда вам нужно передать файл, измените его на true с параметром двоичного файла

...