Ping Sınıfı

Eyl 06, 2013

Açıklamalar :

  • Uygulamalar, .NET Framework'ün içerdiği Ping Sınıfını (Ping Class) kullanarak ağ üzerinde bulunan bilgisayarların ulaşılabilirliğini test eder.
  • Ping komutunu çalıştırmak için öncelikle Başlat (Start) -> Çalıştır (Run) seçilir ve çıkan pencerede Aç (Open) kısmına cmd yazılıp "Enter" tuşuna basılır. Çıkan siyah Komut İstemi (Command Prompt) ekranında ping yazılıp bir boşluk bırakıldıktan sonra makina IP (Internet Protocol - İnternet Protokolü) numarası yazılır ve böylelikle bilgisayarın ulaşılabilirliği kontrol edilir.
  • Bu komut Web sitelerinin aktif olup olmadığını anlamak için de kullanılır. Örneğin, komut istemi ekranında ping www.google.com yazıldığında www.google.com Web sitesinin aktif olup olmadığı kontrol edilir. Bu komut ayrıca www.google.com Web sitesinin sunulduğu makinanın IP numarasını da verir.
  • Ping sınıfı, fonksiyonel bakımdan ping.exe komut satırı aracıyla aynı işlevi sağlar. “Send” ve “SendAsync” metodları uzak bilgisayara bir ICMP (Internet Control Message Protocol - İnternet Kontrol Mesaj İletişim Kuralı) echo sorgu mesajı yollar ve bu bilgisayardan ICMP echo cevap mesajını bekler.
  • Proxy'lerin bulunması ve yapılandırılması, NAT (Network Address Translation - Ağ Adres Çevrimi) ekipmanları ya da güvenlik duvarları, ICMP paketlerinin ve dolayısıyla ping’in başarılı olmasını engeller. Örneğin, Microsoft’un İnternet sunucuları hiçbir ping'e cevap vermez.
  • Ping sınıfı, framework içerisinde System.Net.NetworkInformation namespace’i içerisinde yer alır.

Sınıfın Özellikleri (Properties) :

CanRaiseEvents : Bileşenin bir olay yaratıp yaratamayacağını gösteren bir değer alır.
Container : Component içeren IContainer değerini alır.
DesignMode : Component'in o anda dizayn modunda olup olmadığını belirten bir değer alır.
Events : Component'e eklenmiş olan olay denetimcilerinin listesini alır.
Site : Component'in Isite değerini doğrudan ya da değiştirerek alır.

Sınıf Olayları (Events) :

Disposed : "Dispose" metodu çağrılarak bileşen kaldırıldığında oluşur.
PingCompleted : Bir ICMP echo paketi göndermek ve karşılığında echo cevap mesajı almak için eşzamansız operasyon tamamlandığında veya iptal edildiğinde ortaya çıkar.

Sınıfın Tipleri (Types) :

IPStatus : Bir "ICMP echo" sorgu mesajının sonucunu gösteren durum kodları tanımlar.
PingOptions : Sorgu paketinin kaç kez gönderilebileceğini ve paketin bölümlenip bölümlenemeyeceğini kontrol eden ayarları yapılandırmaya veya tekrar erişmeye olanak sağlar.
PingReply : Bir ICMP echo isteğinin sonuçlarını içerir.
PingException : Kurtarılamaz bir hata oluşursa atılır.
PingCompletedEventArgs : SendAsync metodunun çağrısı tamamlandığında ya da iptal edildiğinde ortaya çıkan PingCompleted olayları ile ilgili datayı içerir.
PingCompletedEventHandler : SendAsync çağrısı tamamlandığında ya da iptal edildiğinde dönen metodun çalıştırılmasını sağlayan delege (delegate) 'dir.

Sınıfın Metodları (Methods) :

CreateObjRef : Uzak nesne ile bağlantı kurmada kullanılan bir vekil sunucuyu üretmek için ihtiyaç duyulan bağlantılı tüm bilgileri içeren bir nesne yaratır.
Dispose()
Dispose(Boolean)
Equals(Object)
Finalize
GetHashCode
GetLifetimeService
GetService
GetType
InitializeLifetimeService
MemberwiseClone()
MemberwiseClone(Boolean)
OnPingCompleted : PingCompleted olayını ortaya çıkarır.
Send(IPAddress) : Belirtilen IP adresine sahip olan bilgisayara bir ICMP echo mesajı göndermeyi ve karşılığında bilgisayardan ICMP echo cevap mesajı almayı dener.
Send(String)
Send(IPAddress, Int32)
Send(String, Int32)
Send(IPAddress, Int32, Byte[])
Send(String, Int32, Byte[])
Send(IPAddress, Int32, Byte[], PingOptions)
Send(String, Int32, Byte[], PingOptions)
SendAsync(IPAddress, Object) : Eşzamansız olarak, belirtilen IP adresine sahip olan bilgisayara bir ICMP echo mesajı göndermeyi ve karşılığında bilgisayardan ICMP echo cevap mesajı almayı dener.
SendAsync(String, Object)
SendAsync(IPAddress, Int32, Object)
SendAsync(String, Int32, Object)
SendAsync(IPAddress, Int32, Byte[], Object)
SendAsync(String, Int32, Byte[], Object)
SendAsync(IPAddress, Int32, Byte[], PingOptions, Object)
SendAsync(String, Int32, Byte[], PingOptions, Object)
SendAsyncCancel
ToString

 Uygulama yaparken dikkat edilmesi gereken noktalar :

  • Send ve SendAsync metodları PingReply nesnesi içinde cevabı döndürür. PingReply.Status özelliği sorgunun cevabını gösteren bir IpStatus değeri döndürür.
  • Sorgu gönderilirken, uzak bilgisayar açıkça belirtilmelidir. Bu, bir yönetici adı dizisi, dizi biçiminde bir IP adresi ya da bir IpAddress nesnesi vererek sağlanabilir.

Ayrıca aşağıdaki bilgi tipleri de belirtilebilir :

  • Sorguyla birlikte giden data. Arabellek belirtmek, belirli büyüklükteki bir paketin karşıdaki istemciye gidip gelmesi için gereken zamanı öğrenmeye yarar.
  • Bir ICMP echo paketinin ulaşım süresince parçalanıp parçalanamayacağı. (DontFragment özelliği ve Send ya da SendAsync metodlarının farklı parametre almış overloadlarına bakılabilir.)
  • Düğümlerde kaç defa routing gerçekleşir, yani "router"lar veya ağ geçitleri, paketi kaynak bilgisayara ulaşmadan ya da paket iptal edilmeden iletebilir.( Farklı bir parametre almış olan Ttl ve Send ya da SendAsync overloadları ile gerçekleşir.)
  • Zaman sınırı. Bu zaman sınırı içinde cevap alınmalı.(Zaman aşımı parametresi alan Send ya da SendAsync metodlarının overloadları ile gerçekleşir..)

Uygulama :

Uygulama için Windows Form Application'da aşağıdaki gibi bir tablo oluşturulur.Bu tablo 2 textbox ve 1 düğme içerir.



using System.Threading;
using System.Net.NetworkInformation;

namespace PimgUygulama
{
    public partial class Form1 : Form
    {
        private int pingSayisi;
        AutoResetEvent olaySıfırla = new AutoResetEvent(false);

        public Form1()
        {
            InitializeComponent();
        }

        private void btnPing_Click(object sender, EventArgs e)
        {
            pingSayisi = 0;
            tbCevap.Clear();
            tbCevap.Text += tbIP.Text + "\tadresine ping atılıyor:\r\n\r\n";
            PingAt();
        }

        private void PingAt()
        {
            Ping png = new Ping();

            png.PingCompleted += new PingCompletedEventHandler(pingTamamla);

            byte[] paketData = Encoding.ASCII.GetBytes("medimedimedimedimedimedimedimedi");

            PingOptions paketAyarı = new PingOptions(50, true);

            png.SendAsync(tbIP.Text, 5000, paketData, paketAyarı, olaySıfırla);
        }

        private void pingTamamla(object sender, PingCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                tbCevap.Text += "Ping reddedildi \r\n";
                ((AutoResetEvent)e.UserState).Set();
            }
            else if (e.Error != null)
            {
                tbCevap.Text += "Bir hata olustu :\t" + e.Error + "\r\n";
                ((AutoResetEvent)e.UserState).Set();
            }
            else
            {
                PingReply pingCevabı = e.Reply;
                sonucGoster(pingCevabı);
                ((AutoResetEvent)e.UserState).Set();
            }
        }

        public void sonucGoster(PingReply pingCevabı)
        {
            if (pingCevabı == null)
            {
                tbCevap.Text = "Cevap yok\r\n";
                return;
            }

            else if (pingCevabı.Status == IPStatus.Success)
            {
                tbCevap.Text += pingCevabı.Address.ToString() + " cevabı: " + "bayt= " + pingCevabı.Buffer.Length + " süre= " +
                    pingCevabı.RoundtripTime + " TTL= " + pingCevabı.Options.Ttl + "\r\n";
            }
            else
            {
                tbCevap.Text += "Ping basarısız oldu:\t" + pingCevabı.Status + "\r\n";
            } 
            pingSayisi++;

            if (pingSayisi < 4)
            {
                PingAt();
            }
        }
    }
}

 

Bu uygulama ile www.google.com adresinin bir IP adresi olan 209.85.135.147 adresine ping atılırsa aşağıdaki görüntü karşımıza çıkar :