Socket ile mevcut clientleri çekme

Merhabalar. Python ile bir socket server oluşturdum ve client olan pc ler server açık olmadığı zaman bağlanmayı deniyorlar. İlk denemede bağlanıyorlar sonra programı kapatıp açıyorum clientlerideki hata yakalamalar sayesine bağlantının sağlandığını görüyorum fakat serverde bunu göremiyorum. Serverde aktif clientleri anlayabilmek için sürekli gelen istekleri bir listeye ekleyip o listeyede sırayla sürekli veri gönderiyorum. Ama dediğim gibi server kapanıp açılınca bazı clientleri server görmüyor bunun sebebi ne olabilirden ziyade aktif clientleri çekebileceğim bir komut vb yokmu ?

Baglanti mevhumu kullanilan protokol ile alakali. socket modulu (ve muadilleri) bir suru protokol kullanmaya izin veriyor; yazinin geri kalaninda TCP kullanildigini varsayiyorum.

Server mi kapanip aciliyor?

Baglantinin saglandigini iki taraf da gorebilir. Hatta standart kullanimda baglanan taraftaki connect ve baglanilan taraftaki accept fonksiyonlari baglanti kurulmadan geri donmuyorlar.

Baglanti kurulduktan sonra baglantiya sahip olan process ölür ise baglanti kesilmis oluyor. Bunu diger tarafin algilamasi kullanilan isletim sistemlerine (network stack’lerine), aradaki agin durumuna vs. bagli olarak cok uzun surebiliyor. Belirli bir surede algilamanin tek yolu TCP’nin uzerine yazilan protokolde periyodik cift yonlu “orada misin/buradayim” mesajlari kullanmak.

Herhangi bir data yollamak pratikte ARQ (Automatic Repeat reQuest) mekanizmasini devreye sokup yollayan network stack’in link kopmalarini anlamasina neden olabilir fakat bu mekanizmanin nasil, hangi surelerle, vs. calistigindan emin olmak zor. Bir onceki paragrafta yazdiklarim buna ragmen gecerli yani.

Client’lari bir listede tutmak mantikli. Zaten accept’ten donen soketleri bir yerde tutmadan client’lara mesaj atmanin pek bir imkani yok.

"Aktif client"in ne oldugunu tanimlamak lazim. Dedigim gibi, server kapaninca baglantilarin tumu cift tarafli olarak kopuyor. Server yeni acildiginda baglanti olmadigini biliyor fakat network stack’lerinin, network’un, vs. durumuna gore client’larin bunu anlamasi uzun surebiliyor. (Bahsettigim ping-pong mekanizmasi yoksa client’in bir sonraki mesajina kadar, gunleri bulabiliyor.)

Oyleyse “TCP baglantisi aktif olan client” yok. “Programi calisan ama baglantisi kopmus” client var. Bunlari “server’in öldüğünü anlamis, tekrar baglanmaya calisan” client’lara cevirmek lazim.

Ve hayir, aktif bir baglanti kurulmamis client’lari gormenin mantikli bir yolu yok. Server’in restart edilmesi akis surecinde olagan bir seyse (ki neden olabilecegini tahmin edemiyorum) kendisini soket server’i / restart edilebilen protokol server’i olarak ayirmak bir cozum olabilir.