C# ile UDP Dinleme ve Gönderme

c# logo

UDP standartı, data iletiminin tek yönlü olarak gönderilmesine dayanır ve karşı tarafın bu mesajı alıp almadığı, ya da yanlış mı aldığı konularına takılmaz. Veriyi sürekli gönderir. Bu durum, C# ile UDP Dinleme ve Gönderme durumunu hız ve süreklilik gerektiren yerlerde avantaja çevirirken, doğruluk gerektiren yerlerde bir dezavantaja çevirir. Bir UDP kaynağından gelen verileri okumak için kısa bir örnekten bahsedelim.

C# ile UDP Dinleme ve Gönderme

Kısaca diğer bir iletişim protokolü olan TCP protokolünden bahsedelim. TCP protokolünde iki ip arasında bir bağlantı olmalı ve alıcının; vericiye gönderim izni vermesi gerekir. Yani çift yönlüdür. Bu durum ister istemez gecikmelere neden olur. C# TCP üzerinden haberleşme örneğini detaylı olarak sonraki yazılarda yazabilirim.

UDP Protokolü için örneğimize geçelim:

private string ipadress = "169.254.28.56";//dinlenecek ve gönderilecek ip adresi
private int portno = 8888;//dinlenecek port
private readonly UdpClient udp = new UdpClient(portno);
IAsyncResult ar_ = null;

private void StartListening()
{
     ar_ = udp.BeginReceive(Receive, new object());
}
private void Receive(IAsyncResult ar)
{
     // izlenecek ip adresi tanımlanıyor
    IPEndPoint ip = new IPEndPoint(IPAddress.Parse(ipadress), portno);

    //udp okuma başlatılıyor
    byte[] bytes = udp.EndReceive(ar, ref ip);
    string icerik = Encoding.ASCII.GetString(bytes);
    /* alınan icerik burada işleniyor */

    // okuma tamamlandı ise tekrar okuyalım.
    StartListening();
}
public void Send(string message)
{
    UdpClient client = new UdpClient();
    IPEndPoint ip = new IPEndPoint(IPAddress.Parse(ipadress), portno);
    byte[] bytes = Encoding.ASCII.GetBytes(message);
    client.Send(bytes, bytes.Length, ip);
    client.Close();
    Console.WriteLine("Gönderilen mesaj : {0} ", message);
}

Aslında oldukça sade ve anlaşılır bir kod. IPEndPoint’lere dinleme ya da gönderme komutu açıyoruz. Gelen veriyi string olarak okuyabiliyoruz.

Eğer, UDP kaynağından gelen verilerin sırasını takip etmek istiyorsanız, gelen veri kaynağında bulunan tarih, sayaç gibi bir veriyi geçici olarak tutarak, gelen yeni değerin bir öncekinden yeni olması kontrolünü yaparak  işleyebilirsiniz. Böylece hem hız, hemde veri sırası doğruluğunu sağlamış olacaksınız.

Kolay gelsin.

10 Comments

  1. Hocam ben bir hedefe örneğin 192.168.5.198 in 9999 portuna udp paket olara 1ae mesajını göndermek istiyorum. Programı start her yaptığımda 3 kere göndermesini istiyorum.Programı nasıl yapabilirm.

    1. önce udp portunu acıp tek seferlik bağlantı testi yapın. daha sonra bu işlemi bir timer içerisine koyun, timer interval 3000 oldugunda istediğiniz gibi çalışacaktır.

  2. İyi günler Sezer bey
    Benim sorunum biraz farklı asp.net ortamında bir web sayfası oluşturdum.Elimde udp port var,bu porta kart okutup bilgilerini web sayfası ekranına bastırmak istiyorum ancak kartı okuttuğum anda bir türlü bilgileri bastıramadım yardımcı olur musunuz.

    1. Okuttugunuz kart udp portundan yayın mı yapıyor?
      En basit yöntem olarak asp.net içerisine udp okuma ve ekrana yazma işi yapan bir method yazıp, javascript-ajax ile sayfadan surekli bu methodu cagırmak. başka bir yöntem ise webRTC ya da signalR olabilir fakat o konularda da cok tecrübem yok malesef. Siz araştırabilirsiniz.
      Kolay gelsin.

  3. Merhaba Sezer Bey,
    private readonly UdpClient udp = new UdpClient(PORT_NUMBER);
    Yukarıdakı kodlamada PORT_NUMBER ‘ı başka bir yerde göremedim. Yukarıda
    private int portno = 8888;//dinlenecek port zaten tanımlamıştık.
    Bu port numarasını niçin tanımladık. Teşekkürler

    1. Merhaba Ali Bey,
      İlginize ve dikkatinize teşekkür ederim. PORT_NUMBER portno olması gerekiyor. Bir yanlışlık yapmışım, düzelttim 🙂

  4. Merhaba,

    2 tane farklı portu aynı anda okumak istiyorum.
    bunun için 2 tane socket tanımladım. Socketleri farklı
    threadlerde tanımlayınca sıkıntısız çalışıyo. Ama tek thread içine
    yazınca bu sefer birbirlerini bloklamaya başlıyolar. Bu özelliklerini
    nasıl kapatabilirim bir fikriniz var mı? Teşekkürler…

    1. Birbirlerini bloklamadan kastiniz nedir? Ayni thread icerisinde ard arda iki okuma yaparsaniz biri bitmeden digerine gecmeyecektir. Dediginiz gibi farkli threadlarda calistirmak olmasi gereken.
      Kolay gelsin.

  5. Merhaba, özel bir haberleşme protokülüne sahip cihazlarım mevcut ve bu cihazlar ile udp üzerinden haberleşmeyi sağlayan bir form uygulaması yaptım ancak şirket bilgisayarlarında bulunan eset antivirüs cihazdan gelen udp yanıtını okumamı engelliyor izin vermiyor antivirüs’e özel olarak programı tanıtmak zorunda kalıyorum bunun farklı bir çözümü mevcutmu acaba?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir