Bağlantı kurulduktan sonra, hiçbir taraf veri göndermezse ağ üzerinden hiçbir paket gönderilmez. TCP atıl bir protokoldür, bu nedenle bağlantının etkin olduğunu varsayar.
Bağlantı kesilme nedenleri- Uygulama kapanır: bir süreç tamamlandığında, genellikle bağlantının kapatıldığını karşı tarafa bildiren bir FIN paketi gönderir. Ancak bir süreç çökerse bu paketin karşı tarafa gönderileceğinin garantisi yoktur.
- Cihaz kapanır: cihaz kapanırsa, büyük olasılıkla bununla ilgili herhangi bir bildirim olmayacaktır.
- Ağ kablosu çıkarılır: ağ kablosu çıkarılırsa bu, bir yönlendiricinin kapanmasıyla aynıdır; aktarılan veri olmadığından bağlantı kapatılmaz.
- Yönlendiriciden sinyal kaybı: uygulama yönlendiriciden sinyali kaybederse bağlantı yine de etkin kalır.
Yarı Açık Bağlantı Kesilmelerini Algılama
Bağlantı kesilmelerini aşağıdaki yöntemleri kullanarak algılamayı deneyebilirsiniz
İkinci Bağlantı
İkinci bir bağlantı açıp bağlanmayı deneyebilirsiniz, ancak bunun bazı dezavantajları vardır; daha fazla kaynak tüketirsiniz, yeni thread'ler oluşturursunuz... ve karşı taraf yeniden başlatıldıysa ikinci bağlantı çalışır ama ilki çalışmaz.
Karşı tarafa ping göndermeYarı açık bir bağlantıyla ping veya herhangi bir mesaj göndermeyi denerseniz, hiçbir hata almadığınızı göreceksiniz.
TCP Soket düzeyinde KeepAlive'ı etkinleştirmeBir TCP keep-alive paketi, sıra numarası bağlantının geçerli sıra numarasından bir eksiğe ayarlanmış basit bir ACK'tir. Bu ACK'lerden birini alan bir ana bilgisayar, geçerli sıra numarası için bir ACK ile yanıt verir. Keep-alive paketleri, bir bağlantının uzak ucundaki bilgisayarın hâlâ kullanılabilir olduğunu doğrulamak için kullanılabilir. TCP keep-alive paketleri, TCP bağlantısı üzerinden başka veri veya üst düzey keep-alive taşınmadıysa her TCPKeepAlive.Time süresinde bir (varsayılan 7.200.000 milisaniye veya iki saat) gönderilebilir. Bir keep-alive'a yanıt yoksa, her TCPKeepAlive.Interval saniyede bir tekrarlanır. KeepAliveInterval varsayılan olarak 1000 milisaniyedir.
Bağlantı başına KeepAlive'ı etkinleştirebilir ve TCP protokolünün bağlantının etkin olup olmadığını denetlemesine izin verebilirsiniz. Kopan bağlantıları algılamak istiyorsanız (örneğin: bir ağ kablosunu çıkardığınızda) tercih edilen yöntem budur. sgcWebSockets 4.3.7 sürümünden itibaren bu yarı açık bağlantıları algılamayı denemek için TCPKeepAlive özelliğini etkinleştirebilirsiniz.
oClient := TsgcWebSocketClient.Create(nil); oClient.TCPKeepAlive.Enabled := True; oClient.TCPKeepAlive.Time := 3000; oClient.TCPKeepAlive.Interval := 1000;
