Ahmet Çığşar | WPF ve C# (Csharp) ile Ping Atma Uygulaması
679
post-template-default,single,single-post,postid-679,single-format-standard,qode-quick-links-1.0,ajax_fade,page_not_loaded,,qode-theme-ver-11.0,qode-theme-bridge

WPF ve C# (Csharp) ile Ping Atma Uygulaması

WPF ve C# (Csharp) ile Ping Atma Uygulaması

Bir web sayfasının veya bir sunucunun yayında olup olmadığını kontrol edecek minik bir uygulama yapacağız. Uygulamamızın arayüzünde WPF, kodlama kısmında ise C# (Csharp) kullanacağız. Bu uygulamada denetleme işini Ping ve PingReply adlı iki nesneyi kullanacağız.

Öncelikle şunları bilmenizi isterim:

* Ping ve PingReply nesneleri genelde direkt IP üzerinden sunucu kontrollerinde kullanılır. Web sayfalarının kontrolünde ise genellikle TcpClient nesnesi veya  içerisinde sayfa ve dizin barındıran URL’ler için HttpWebRequest ile yapılan uygulamalar kullanılır.  Ne yapacağınızı, neyi denetleyeceğinize göre farklı sınıflar ve nesneler kullanmak daha  verimli olacaktır.

* Kaynak kodları ve proje dosyalarını sayfanın en altında bulunan linkten indirebilirsiniz.

* Tamamen örnek göstermek amacıyla yapılan minik bir uygulama olduğundan tekrar eden kodlar için bir metod oluşturma gereği duymadım.


WPF ile Uygulamamızın Arayüzünü Tasarlayalım

1.  Öncelikle Visual Studio 2012’de yeni WPF projesi açıyoruz.  File > New > Project  açılan pencereden  WPF Application seçeneğini seçiyoruz. Eğer bu seçeneği göremediyseniz sol taraftan Visual C# > Windows  seçeneğinin seçili olduğundan emin olun.

2. Karşımıza çıkan ana pencerenin (MainWindow.xaml)  XAML alanına gidiyoruz ve aşağıdaki kodları yapıştırıyoruz. Üşenmezseniz yazın. Burada Button, TextBox ve Label etiketlerinin adlarına (x:Name) dikkat edin lütfen çünkü kodlama tarafında bu isimlerle çağıracağız yabancılık çekmeyin.

<Window x:Class="WpfPing_ahmetcigsar.com.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Ping Atar - ahmetcigsar.com" Height="145" Width="566">
    <Grid>
        <TextBox x:Name="txtUrlIp" Height="23" Margin="136,22,0,0" TextWrapping="Wrap" Text="" 
             VerticalAlignment="Top" HorizontalAlignment="Left" Width="254"/>
        <Label Content="Adres / IP" Margin="10,21,0,0" VerticalAlignment="Top" 
             HorizontalAlignment="Left" Width="77" FontWeight="Bold" />
        <Button x:Name="btnKontrolEt" Content="Kontrol Et" Margin="462,22,0,0" 
             VerticalAlignment="Top" Height="23" Click="btnKontrolEt_Click" HorizontalAlignment="Left" Width="83"/>
        <Button x:Name="btnTemizle" Content="Temizle" Margin="399,22,0,0" VerticalAlignment="Top" Height="23" 
             Click="btnTemizle_Click" HorizontalAlignment="Left" Width="58"/>
        <Label x:Name="lblDurum" Content=" " Margin="136,63,0,0" VerticalAlignment="Top" 
             HorizontalAlignment="Left" Width="409"/>
        <Label Content="http://" HorizontalAlignment="Left" Margin="92,20,0,0" VerticalAlignment="Top"/>
    </Grid>
</Window>

Aşağıdaki görüntüyü elde etmeniz gerekiyor. lblDurum adlı Label kontrolünde şu an bir şey yazmadığından görünmüyor.

wpf_ping_atar_pencere

Önemli : Metin kutusu önüne http:// yazan bir Label eklememizin sebebi: PingReply nesnesinin Send() metodu URL kabul etmediği içindir.
Siz www.google.com yazdığınızda bir sorun çıkmayacaktır fakat http://www.google.com yazdığınızda program çalışma anında hata verecektir. Bu durumu önlemenin fazlaca yolu var. Örneğin: http:// yazılmışsa trim ile o kısımları alabilir veya Regex ile kendi kurallarınızı yazabilirsiniz fakat asıl konu dağılmaması için değinmeyeceğim. Dilerseniz en kısa yoldan try catch içerisine alabilirsiniz.

Kodlama Kısmına Geçelim ve C# Kodlarımızı Yazalım

3. “Kontrol Et” butonunda yazının olmadığı alana çift tıklıyoruz ve Click event’ine (olay) gidiyoruz. Aşağıdaki C# kodlarını yazıyoruz.   Kod satırları arasındaki turuncu yazılı alanlara dikkat edelim. Elimden geldiğince açıklama yazdım. Bu kodların satır satır açıklamaları sayfaya ekli kaynak dosya içerisinde de var.

private void btnKontrolEt_Click(object sender, RoutedEventArgs e)
        { 
            //URL adresini veya IP adresini alıyor ve urlAdres adında bir string değişkene atıyoruz.
            string urlAdres = txtUrlIp.Text;

            //Girilen URL'in geçerliliğini kontrol ediyoruz.
            bool gecerliUrl = Uri.IsWellFormedUriString(urlAdres, UriKind.Relative);

            //Girilen adres URL değilde IP ise aşağıdaki iki nesneyi daha sonra kullanacağız.
            //Burada olmasının sebebi daha global olması ve aşağıda fazlaca if olduğundan 
            //derleyici tarafından else satırı olarak algılanmaması için.
            IPAddress ipAdresi;
            bool gecerliIp = false;

            // Girilen URL geçerliyse bu işlemler yapılacak
            if (gecerliUrl==true)
            {
                //pingAt adında yeni ping nesnesi oluşturuyoruz.
                Ping pingAt = new Ping();

                //cevap adında PingReply nesnesi oluşturuyoruz ki pingAt nesnemiz ile attığımız 
                //pinglerin cevabını yakalayıp değerlendirebilelim.
                PingReply cevap = pingAt.Send(urlAdres);

                //cevap nesnemizin durumuna bakıyoruz eğer cevap alınabilmişse aşağıdaki işlemler yapılıyor.
                if (cevap.Status == IPStatus.Success)
                {
                    lblDurum.Content = "Başarılı. Site / sunucu aktif";
                    lblDurum.Foreground = Brushes.Blue;
                    lblDurum.FontWeight = FontWeights.Bold;
                }
                //cevap zamanaşımına uğrarsa yani belirli süre içerisinde sunucuya ulaşamaz ise yapılacaklar.
                else if(cevap.Status == IPStatus.TimedOut)
                {
                    lblDurum.Content = "Başarısız. Siteye / sunucuya erişilemiyor.";
                    lblDurum.Foreground = Brushes.Red;
                    lblDurum.FontWeight = FontWeights.Bold;
                }
            }
            //Sayfanın başında tanımladığımız gecerliIp ve ipAdresi nesnelerini burada kullanıyoruz.
            //Eğer girilen adres bir URL değilse IP adresi olabilir. Girilen adresi IP adresine parse etmeye çalışıyoruz.
            //Eğer TryParse işlemi olumlu sonuç verirse (true) aşağıdaki işlemler yapılıyor.
            else if(gecerliIp = IPAddress.TryParse(urlAdres, out ipAdresi))
            {
                //Bu satıra gelebildiğine göre IP olabilecek bir adres. 
                //ipAdresi nesnemize urlAdres string değişkenini parse ediyoruz.
                ipAdresi = IPAddress.Parse(urlAdres);

                //pingAt adında yeni ping nesnesi oluşturuyoruz.
                Ping pingAt = new Ping();

                //cevap adında PingReply nesnesi oluşturuyoruz ki pingAt nesnemiz ile attığımız pinglerin 
                //cevabını yakalayıp değerlendirebilelim.
                PingReply cevap = pingAt.Send(ipAdresi);

                //cevap nesnemizin durumuna bakıyoruz eğer cevap alınabilmişse aşağıdaki işlemler yapılıyor.
                if (cevap.Status == IPStatus.Success)
                {
                    lblDurum.Content = "Başarılı. Site / sunucu aktif";
                    lblDurum.Foreground = Brushes.Blue;
                    lblDurum.FontWeight = FontWeights.Bold;
                }

                //cevap zamanaşımına uğrarsa yani belirli süre içerisinde sunucuya ulaşamaz ise yapılacaklar.
                else if(cevap.Status == IPStatus.TimedOut)
                {
                    lblDurum.Content = "Başarısız. Belirtilen IP'ye erişilemiyor.";
                    lblDurum.Foreground = Brushes.Red;
                    lblDurum.FontWeight = FontWeights.Bold;
                }
            }

    //Eğer girilen adres URL ve IP değilse aşağıdaki mesajı yazdırıyoruz.
    else
	{
        lblDurum.Content = "Adres geçersiz lütfen adresi kontrol edin.";
        lblDurum.Foreground = Brushes.Red;
        lblDurum.FontWeight = FontWeights.Bold;
	}
}

 Önemli : Yukarıdaki kodları çalıştırabilmeniz için  System.Net.NetworkInformation  ,  System.Net  ve System.Security.Policy namespace’lerini projenize eklemeniz gerekmekte.

Uygulamada yazdığımız kodların açıklamasını zaten satır satır verdim ve yeterli olduğunu düşünüyorum.

4. Sıra geldi “Temizle” butonunun kodlarını yazmaya. “Temizle” butonumuzun yazı olmayan bir yerine çift tıklıyoruz ve Click event’ine gidiyoruz. Aşağıdaki gibi olmalı kodlar.

// Temizle butonunun Click event'ini (olay) yazıyoruz.
private void btnTemizle_Click(object sender, RoutedEventArgs e)
{
   txtUrlIp.Text = "";
   lblDurum.Content = "";
}

Bu kadar. Artık uygulamamızı derleyip çalıştırabiliriz. Aşağıda bir deneme sonucunu gösteren ekran görüntüsü var.

wpf_ping_atar_basarili

Not : Metin kutusuna girilen IP veya web adreslerini Regex sınıfına ait bir nesne ile de denetleyebilir. Şöyle bir gerçek var. Bu tip metinsel verilerin girişi söz konusu olduğunda Regex nesnesini kullanmak kadar verimli olabilir size daha fazla kontrol imkanı sunar.

[wpdm_file id=2]
Yorum Yapılmamış

Yorum Yapın