İlginizi Çekebilir
  1. Ana Sayfa
  2. C Sharp

C# Ping Gönderme Uygulaması Yapalım

C# Ping Gönderme Uygulaması Yapalım
+ - 7

Merhaba arkadaşlar. Sitemin 345. C# eğitim setimin 200. ve 2019 yılının son dersini C# Ping Gönderme Uygulaması ile vermiş olacağım. Bununla birlikte 2 yıllık bir süreyi de geride bırakmış oluyoruz. Tam 2 yıldır sitem açık ve sizler için fayda sağlamaya çalışıyorum ve bu devam edecek.  Bu dersimizde bir istek üzerine gelen bir konu hakkında yaptığım basit bir uygulamayı ve kodlarını paylaşacağım. Elbette bu projeye Github profilimden ulaşabilirsiniz.

C# Ping Gönderme Uygulaması Yapalım

Adında anlaşılacağı gibi bir ping gönderme uygulaması yapacağız ancak bu uygulama console uygulaması değil Windows Forms uygulaması şeklinde olacak.

Projemizde ping gönderme yapacağız. Sonuçlar bir ListBox nesnesinde gösterilecek. Aynı zamanda bu sonucu log şeklinde dışa aktarımı olacak. Yani basit bir ping gönderme uygulaması olacak. Form tasarımım aşağıdaki gibidir.

C# Ping Gönderme Uygulaması Yapalım 2

Değişkenlerimiz

Görselde görünmesede ek olarak bir Timer nesnemiz var. Değişkenlerimizi ve Ping sınıfımızı tanımlıyoruz.

        private Ping p = new Ping();
        private int sayac;
        private string durum = "";
        private string adress = "";
        private string zaman = "";
        private string sonuc = "";
        private long pingAdet = 10;
     

Burada Ping işlemini Timer nesnemiz yapacak.

Sınırsız Ping Göndermek

Hepsinden önce Sınırsız Ping Gönder checkbox’un CheckedChanged eventinde ayarlamalarımızı yapalım.

        private void chk_sinirsiz_ping_CheckedChanged(object sender, EventArgs e)
        {
            if (chk_sinirsiz_ping.CheckState == CheckState.Checked)
            {
                pingAdet = 9999999999;
                txt_ping_adet.Text = "9999999999";
                txt_ping_adet.Enabled = false;
            }
            else
            {
                txt_ping_adet.Text = "10";
                pingAdet = Convert.ToInt32(txt_ping_adet.Text);
                txt_ping_adet.Enabled = true;
            }
        }

Eğer sınırsız ping gönderilmesini istersek basitçe 99999999 yazıp geçiyoruz. Bu sayıyı da textbox ‘a yazıyoruz. Eğer sınırsız değil ise sayısı varsayılan sayı olan 10’a çekiyoruz ve textbox ‘a yazıyoruz.

 

Ping Göndermeye Başla

Timer, Ping Gönder butonunun click eventine çalışmaya başlayacak.

        private void btn_ping_at_Click(object sender, EventArgs e)
        {
            lst_sonuc.Items.Clear();
            lst_sonuc.Items.Add(txt_adres.Text + " Adresine Ping işlemi Başlıyor... - " + DateTime.Now + Environment.NewLine);
            lst_sonuc.Items.Add("--------------" + Environment.NewLine);
            sayac = 0;
            timer1.Interval = Convert.ToInt32(txt_ping_ms.Text);
            pingAdet = Convert.ToInt64(txt_ping_adet.Text);
            timer1.Enabled = true;
            timer1.Start();
        }

İlk olarak ListBox’u temizliyoruz. sonrasında ping atmak istediğimiz adresi ve Ping atılma zamanını kullanarak bir giriş texti hazırlıyoruz. Bunu yapmamızın sebebi dışarı aktar dediğimizde oluşturulacak metin belgesinin daha okunabilir halde olmasını istediğimiz için. Sondaki Environment.NewLine ise ListBox’ta görünmeyecek ama metin belgesine yazdığımızda satırların uç uca eklenmesini engelleyip, alt alta gelmesini sağlayacak.

Sonrasında bir ayraç olması için bir kaç – ekliyoruz. Sayaç değişkenimizi sıfırlıyoruz.

Timer nesnemisin Interval özelliğini yani ping atılma hızını da de dışarıdan aldığımız değer ile belirledik. Atılacak ping sayısını da yine dışarıdan girilen sayıdan aldık. Timer ‘ı aktif edip başlattık.

Timer Tick

 private void timer1_Tick(object sender, EventArgs e)
        {
            sayac++;
            if (sayac >= pingAdet)
            {
                lst_sonuc.Items.Add("--------------" + Environment.NewLine);
                lst_sonuc.Items.Add(sonuc + Environment.NewLine);
                lst_sonuc.Items.Add("--------------" + Environment.NewLine);
                timer1.Stop();
                timer1.Enabled = false;
            }
            else
            {
                try
                {
                    PingReply reply = p.Send(txt_adres.Text);
                    durum = reply.Status.ToString();
                    adress = reply.Address.ToString();
                    zaman = reply.RoundtripTime.ToString();
                    lst_sonuc.Items.Add(string.Format("Sonuç : {0} {1} -> {2} ms.", durum, adress, zaman + Environment.NewLine));
                    sonuc = "Ping başarı ile tamamlandı";
                }
                catch (PingException)
                {
                    lst_sonuc.Items.Add("Bilinen böyle bir ana bilgisayar yok" + Environment.NewLine);
                    sonuc = "Bir veya daha fazla Ping denemesi başarısız oldu";
                }
                catch (NullReferenceException)
                {
                    lst_sonuc.Items.Add("Ping Atılamadı. Adres yanlış olabilir." + Environment.NewLine);
                    sonuc = "Bir veya daha fazla Ping denemesi başarısız oldu";
                }
            }
        }

Sayaç değişkenine +1 yapıyoruz.

C# ++ bir arttır — bir azalt demektir.

Bu kısım biraz kafanızı karıştırabilir. Bu yüzde yukarıdan aşağı şekilde değil çalışma şekline göre açıklamam gerekiyor.

Sayacımız başlangıçta 0 dır. ilk olarak sayacı bir arttırdık. Sayacımız dışarıdan aldığımız ping adetten büyük ya da eşit olmadığı için else bloğuna geçecek.

Else bloğunda Ping işlemini yapıyoruz. PingReply sınıfı ile de gönderilen Ping’in bilgilerini alıyoruz. Bilgileri anlaşılır bir formata soktuktan sonra sonucu ListBox nesnemize ekliyoruz. Sonuç değişkenimize de işlemin başarılı olduğunu yazıyoruz. Burada ping esnasında hiçbir hata çıkmaz ise işlem sonunda Ping başarı ile tamamlandı* mesajını alacağız.

Eğer Ping işleminde bir hata ile karşılaşırsak ve bu hata bir PingException ise Bilinen böyle bir ana bilgisayar yok* mesajı vermesini istiyoruz. PingException aldıysak ping atılamamış demektir. Ve bu Ping işlemi 9 kere tekrarlanacağından her seferinde bu mesaj verilecek. Bağlantıya tıklayarak Try Catch dersime gidebilirsiniz. C# Try Catch Finally Nasıl Kullanılır? Ayrıntılı Anlatım

Eğer Ping işleminde bir hata ile karşılaşırsak ve bu hata bir NullReferaceException ise Ping Atılamadı. Adres yanlış olabilir.* mesajını vermesini istiyoruz. İşin açığı bu hatanın sebebini çözemedim ama çıkıyor. Bir Ping’i atıyor bu hatayı veriyor sonra Ping atmaya devam ediyor. Biraz inceledim ama sebebini bulamadım bu sebeple böyle bir hata mesajı vermesini istedim.

Yukarıdaki iki şekilden birisinden hata alırsak listbox’a hata mesajımız eklenecek.

Timer çalıştıkta sayaç artacak. Eğer sayaç, dışarıdan aldığımız Ping’ adedine eşit veya büyük olursa sonuç bilgilerini yazacağız ve Timer’i durdurcağız.

Fark ettiyseniz burada İf Else bloğunu aşıla gelmişin dışında kullandık. Yapılmasını istediğimiz işler else bloğunda yapılırken sonuç if bloğunda yer alıyor. Elbette bu kısmı değiştirebilirsiniz. Büyük Eşit ( >= ) küçük ( < ) yapıp İf ve Else  bloklarındaki kodları yer değiştirebilirsiniz.

Sonuçları Dışarı Aktar

        private void btn_disari_aktar_Click(object sender, EventArgs e)
        {
            string path = @"D:\\PingLog.txt";
            new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write).Close();

            int sayac = 0;
            while (true)
            {
                if (sayac >= lst_sonuc.Items.Count)
                {
                    Process.Start(path);
                    return;
                }
                File.AppendAllText(path, lst_sonuc.Items[sayac].ToString());
                sayac++;
            }
        }

Dışarı aktar butonun click eventinde de bir yol belirliyoruz. Ben burada yolu elle yazdım ancak siz bir button ekleyip FolderBrowserDialog ile log dosyasının oluşturulmasını istediğiniz yolu seçtirebilirsiniz.

Aslında formda timer süresi ve sınırsız gönderme işlemleri bile yoktu. Yazıyı yazarken aklıma geldi yazıyı yazarken projeyi güncelledim. Log dosyasını yol seçerek kaydetmek o anda aklıma gelmemişti. Şimdi aklıma geldi ve onu eklemeye üşendim. O yüzden burada yer almayacak. Belki githuba yüklediğim projede olabilir. :D Olursa o da bu dersin bonusu olur. :D

Dosya Kontrolü Yol II & III

FileStream sınıfını kullanarak dosya kontrolünü yapıyoruz. İlgili satırdaki OpenOrCreate özelliği sayesinde dosya varsa açılır yok ise create edilir. Yukarıdaki kodlarda gördüğünüz FileStream sınıfı yazım şekillerinden birisidir. Bu satırı aşağıdaki şekilde de yazabiliriz.

      FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
            fs.Close();

Genelde bu şekilde görürsünüz. Ancak burada fs ile bir işimiz yok. Burada sadece dosya kontrolü yapmak istedik. Ayrıca dosya kontrolünü aşağıdaki şekilde de yapabilirsiniz.

       if (!File.Exists(path))
            {
                File.Create(path);
            }

Ancak bu yöntemi tavsiye etmiyorum. Bu şekilde açılan, çağrılan ve üzerinde işlem yapılan dosyalar şile başka bir yerde işlem yapmak istediğinizde hata alıyorsunuz. Hatta bu hata için özel bir ders bile hazırlamıştım. Bkz. [KESİN ÇÖZÜM] File İşlemlerinde “İşlem, Başka Bir İşlem Tarafından Kullanıldığından ‘…’ Dosyasına Erişemiyor”  Bu hataya düşmemek için mutlaka FileStream kullanmalısınız.

Konuyu daha fazla dağıtmadan kodlarımızı açıklamaya devam edeyim. Burada da farklı bir kullanım şekli görebiliyorsunuz.

Dışar Aktarma Yol II

Dosya kontrolünü yaptıktan sonra bir sayaç değişkeni tanımlıyoruz. Değişkeni tanımladıktan sonra bir döngü oluşturuyoruz. Teknik olarak bu döngü sonsuz bir döngüdür. Tabi içinde kodlar olmasaydı…

Döngü başladıktan sonra Sonuçları gösterdiğimiz listbox’taki itemlerin sayısını ile sayacı eşitliğini kontrol ediyoruz. Eşit değil ise File.AppendAllText metodu ile verdiğimiz yoldaki metin belgesine sayacı index numarası olarak kullanarak listbox’a eklediğimiz satırları tek tek metin belgesine yazıyoruz ve sayacı bir arttıyoruz.

Sayaç ile listboxtaki itemlerin sayısı eşit olduğunda yani metin belgesine eklenecek satır kalmadığında Process sınıfını kullanarak yolunu verdiğimiz log metin belgesini açıp kullanıcıya gösteriyoruz. Döngüyü sona erdirmek için de Return veriyoruz.

Bu kodları daha da kısa yazabiliriz ama ben size bir işin farklı yollarla da yapılabileceğini göstermek istedim.

Buradaki kodlarımızı aşağıdaki gibi de yazabilirdik.

            for (int i = 0; i < lst_sonuc.Items.Count; i++)
            {
                File.AppendAllText(path, lst_sonuc.Items[i].ToString());
            }
            Process.Start(path);

 

Sonuç

Gördüğünüz gibi daha kısa yolumuz da var. Ama bu proje biraz tuhaf kodlar projesi olsun istedim ve farklı yollar deneme yoluna gitmek istedim.

Şimdi kodlarımızı çalışmış ve dışarıya aktarılmış haline bakalım.

C# Ping Gönderme

Listbox’taki satırların soldaki gibi düzgün dışarı aktarılması için Environment.Newline komutlarını kullandık. Öyle yapmasaydık… Deneyip görebilirsiniz. :D :D

NOT: Github’a yüklenen halinde yol seçme işlemleri yer alıyor. Ayrıca kodların varyasyonlarını ekledim.:D


Herkese huzulu, mutlu, bereketli, sevdiklerinizle birlikte çok uzun yıllar dilerim. Kodunuz bol olsun. :D

Berbat ve klişe olan ama o kadar da sevdiğim espri ile veda ediyorum. Seneye Görüşürüz. :D

C# Ping Gönderme Uygulaması Yapalım yazımızında sonuna geldik dostlar.

C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.Bağlantıya tıklayarak proje kodlarına ulaşabilir veya bilgisayarınıza indirebilirsiniz.

Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz…

Sağlıcakla ve takipte kalın. ?

Bu yazıya tepkiniz ne oldu?

Yazar Hakkında

Lise Ağ Sistemleri ve Yönetimi bölümü, üniversite Bilgisayar Programcılığı bölümü Ön Lisans, Yönetim Bilişim Sistemleri Lisans öğrenimi aldım. Askerlik görevimi tamamladım. Uzmanlık alanım; C# ve SQL Programlama dilleri ile müşteri odaklı, kullanıcı dostu ERP ve CRM gibi sistemleri geliştirmektir. Ayrıca şuanda PHP ve MYSQL alanında projeler geliştirmekteyim. C++, Phyton, Xamarin, MVC gibi konuları öğrenmek ve kendimi geliştirme çabası içerisindeyim. Discord için: https://discord.gg/FBxZeHu9

Değerli yorumlarınızı bekliyorum. :)

Yorumlar (7)

Popüler Yorumlar
  1. Teşekkür ederim. Faydalı olabildi ise ne mutlu..

  2. Eline emeğine sağlık

  3. Merhaba,
    Yorumun için teşekkürler.
    Projeyi github’a yüklemiştim onu indirip denedin mi? Çalıştığından emin olmadığım hiç bir kodu yayınlamıyorum.

  4. KB ama şöyle bi sıkıntı çıktı : Hata CS1061 ‘object’ bir ‘Text’ tanımı içermiyor ve ‘object’ türünde bir ilk bağımsız değişken kabul eden erişilebilir ‘Text’ genişletme metodu bulunamadı (bir kullanma yönergeniz veya derleme başvurunuz eksik olabilir mi?) bu hata şu kod parçacığında çıktı : PingReply reply = p.Send(txt_adres.Text);

Yapılan Yorumlar
  1. Eline emeğine sağlık

    • Teşekkür ederim. Faydalı olabildi ise ne mutlu..

      • KB ama şöyle bi sıkıntı çıktı : Hata CS1061 ‘object’ bir ‘Text’ tanımı içermiyor ve ‘object’ türünde bir ilk bağımsız değişken kabul eden erişilebilir ‘Text’ genişletme metodu bulunamadı (bir kullanma yönergeniz veya derleme başvurunuz eksik olabilir mi?) bu hata şu kod parçacığında çıktı : PingReply reply = p.Send(txt_adres.Text);

  2. Hocam Hata aldım yardım edermisiniz?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.