Вопрос

У меня проблемы с 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;

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

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

С уважением,

Это было полезно?

Решение

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;

Другие советы

Перед подключением убедитесь, что пассивный логический IDFTP является ложным, когда вам нужно перевести файл

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top