Forum
Merhabalar,
20-30 tane sunucunun, anlık belli portunu konrol eden bir program yapmaya çalışıyorum. Bir ekrandan sunucuların portunun anlık olarak takip edilebileceği şekilde oluşturmam lazım yapıyı.
Ping atarak sunucunun aktif durumda olduğunu kontrol edebiliyorum.
Eğer sunucu aktifse socket tanımlayıp, portumdan connect oluyorum ve connected durumunu kontrol ediyorum. Kontrol işimi yapıyor Fakat bunun kesinlikle daha mantıklı bir yolu vardır diye düşünüyorum. Zaten bu mantıkla gittiğimde bir yerde tıkanıyorum, connected true fakat bağlantı düştümü düşmedimi diye kontrol etmek için timer kullanarak belli aralıklarda yeni bir socket ile bağlantıyı denemem lazım gibi görünüyor. Buda mantıksız geldi. Bulamadığım bir yol var kesin. Önerilerinizi bekliyorum. Portu dinlemek vb gibi.
Tcplistener denedim ama daha connect aşamasında sıkıntılar çıktı. tcpclient'da denedim oda socket gibi sıkıntılı. Mantıklı yolu nedir bu işin acaba?
Merhaba Evren bey
Öncelikle sunucu durumlarınızı anlık olarak mı kontrol etmek istiyorsunuz? Yoksa belli bir aralıkta yukarda belirtmiş olduğunuz gibi iki farklı metod üzerinde biri ile çalışarak kontrol mü etmek istiyorsunuz sorunu sormak istiyorum. Ne yazik ki internet ortamında bulunan "Check Server Status" başlıklı sitelerde ping ve buna benzer yapılarla çalışmaktadır. Eğer ki sunucularınızı bir port üzerinden tcp client ile kontrol etmenizi düşünüyorsanız bununla ilgili thread yöntemi ile belli aralıkla veya 100ms tarzı aralıklarla kontrol etmeniz gerekecek. Söylemiş olduğunuz gibi tcp client socketten düştüğü an sizin için bir offline değeri döndürecektir. Bununla ilgili delegate tarzı işlemlerlede rahatlıkla kontrol edebilirsiniz. Şunuda düşünmek gerekir sunucu tarafında açılan port ne tür start işlemi ile başlamaktadır veya o porta ait sunucu haricinde ne tür hatalar verebilir ve sizin işinize aksi yönde engeller. Buna benzer programlar arası anlık tcp client & listener işlemlerinde ben genellikle thread içerisinde belli işlemlerini kontrol ederek delegate işlemi ile event oluşturuyorum ve rahatlıkla kontrol ederek gerekli işlemlerimi sağlıyorum.
İyi çalışmalar.
Mesela bir sayfa buldum ve server durumlarını bu protokollerden sorgulayarak durumlarının bilgisini veriyor.
HTTP: The website is accessible!
FTP: Connected to the FTP!
MAIL (Pop3): Pop3 connected successfully!
MAIL (SMTP): Failed connecting to SMTP
MySQL: The MySQL seems to be offline.
Merhaba Kenan Bey,
Öncelikle ilgilendiğiniz için teşekkür ederim,
Sunucuların durumlarını anlık olarak kontrol etmek istiyorum. Kontrol edeceğim port veri tabanı ile alakalı, sunucu açık olmasına rağmen hizmetlerden veri tabanı sunucusunun servisi kapalı olduğunda connected false dönüyor zaten. Bunun kontrolü için ekstra uğraşmam gerekmeyecek gibi. İşlemleri bende thread ile gerçekleştiriyorum. Ama yinede her defasında 20-30 sunucuya tekrar tekrar connect olmak mantıksız geliyor bana. Bu portları dinlemek gibi birşey olmalı diye düşünüyorum ama bulamadım. Kontrolü yapacağım method'u biraz daha açabilir misiniz? Anlayamadım sanırım.
Yani sizinde söylemiş olduğunuz gibi anlık olarak başka bir çözüm göremiyorum. Anlık olarak kontrol sağlıyacaksanız bu tarz bir yapı ile yani tcp client ile sunuculara bağlanıp connect değerlerine göre durum belirtebilirsiniz. Sonuç olarak düşünüyorum da elektronik tarafında çalışan arkadaşlar da gördüğüm C dilindeki yazılımlarda 1 saniyelik işlem içerisinde programı geliştirip gerekli metodlar üzerine koşul çıkartıyorlar. Tabi bundan farklı bir örnek verebilecek arkadaşlar var mıdır bilmiyorum 🙂
Tcpclient'la yaptım, kontrol çalışıyor. Fakat connect'i dispose yada destroy etmek gibi bişey lazım bana. Çalışması için döngünün başında myClient = new tcpclient() yaparak myClient'tı yeniledim halbuki. Döngünün sonunda disconnect yapıp connect falan yapabilsem. Tekrar tekrar nesne oluşturmama gerek kalmayacaktı. Bu şekilde bellek şişiyor, öneriniz varmı acaba?
Bence tcp client objesini bir defa oluşturun sunucu durumu false olduğu an objenizide tcpClient = null şeklinde boş değere döndürebilirsiniz.Ben while for gibi döngüler içerisinde pek çok object oluşturup denedim bellek gayet normal çalışıyor. İstiyorsanız aşağıdaki linkide bir inceleyiniz.
http://msdn.microsoft.com/en-us/library/aa691138%28VS.71%29.aspx
Kenan Bey tekrar Merhaba,
Vaktinizi aldım baya, ilgilendiğiniz için tekrar teşekkürler.
Döngünün sonunda client nesnesini null'lamama rağmen bellek şişiyor. Nesneyi bir kere oluşturdum zaten ama oluşturduğum nesnenin içini yeniliyorum aslında döngünün başında. myClient = new TcpClient() şeklinde.
Aradığım şey döngünün başında connect olacak, durumu kontrol edicem, sonunda disconnect olacak. Fakat yapamadım. myClient.close dediğimde hata veriyor. Aldığım hata "objectdisposedexception was unhandled" şeklinde. beginconnect ve endconnect metodları var onlarımı kullanmalıydım acaba. Bide onları deniyim en iyisi. 🙂
Bellek problemi kullandığım listbox'tan kaynaklanıyormuş. Listbox'a eklediğim sonuçlara limit koydum düzeldi. Zaten monitörün haricinde, loglama yapıcam listbox test amaçlıydı. Şimdilik bu "know how"ı atlattım gibi gibi görünüyor. Farklı bir yol tavsiye edecekler varsa önerilere açığım. 🙂