2012-05-09 17 views
7

Bu durumda nasıl kurtarmalıyım?"Bağlantı Sırasıyla Sıfırlama" kurtarma TCP İstemcisi

Sunucu çöküyor, dolayısıyla bağlantı anormal şekilde kapatıldı. Hemen hemen her şeye çağrı "Eş tarafından Bağlantı Sıfırlama" istisnaları ile sonuçlanır. TIdTCPClient nesnesindeki Disconnect'i blok dışında çağırmakla sabitledim, ancak aynı iletiyle (ikinci try-except bloğunda yakaladığım) bir son istisna ile sonuçlanır.

Bu, Indy10 ve Delphi XE2 ile geçerlidir.

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; 
+0

Eğer IdTCPConnection.pas içinde TIdTCPConnection.Disconnect içine hata ayıklama denediniz mi? Belki bir OnDisconnect işleyicisi yürütülür ve bağlantıyı kullanır. Veya NotifyPeer bir rol oynar, ayrıca farklı senaryolar hakkındaki kaynaklara bakın: – mjn

+0

Nesneyi serbest bırakmak ve yeni bir tane oluşturmaya yardımcı olacak yeni bir tane yaratacaktır (istisna nedenini bulmakta yardımcı olamayacaksınız) – mjn

+0

Neden bu kadar çok endişelenmiyorum Bağlantıyı keserken bir istisna alıyorum. Sadece böyle bir durumdan nasıl düzgün bir şekilde kurtulacağını bilmek istiyorum. –

cevap

7

bu deneyin:

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; 
+1

Bağlantı kesme yöntemine "false" iletilmesi, onu düzeltdi. Varsayılan davranışı, ikinci özel durumu tetikleyen DisconnectNotifyPeer öğesini çağırmaktır. –

İlgili konular