C# İle Ağ Üzerinden Veri Alıp Yollamak(Broadcast Olarak)

Bu yazımızda sizlere C# ile UDP protokolü üzerinden broadcast veri iletişimini nasıl gerçekleştirebileceğinizi anlatacağım.

İlk olarak bize kolaylık sağlaması için 2 tane “console application” başlatıyoruz.

1. uygulama server

2. ise client olsun.

Socket ve IP sınıflarını kullanabilmemiz için

using System.Net;
using System.Net.Sockets;

Satırlarını eklememiz gerekiyor. Bunların dışında

using System;
using System.Text;

Satırları ise zaten eklemiş olarak gelecektir.

Ağ üzerinde bir port dinleyeceğimiz için bunu tanımlamamız gerekiyor bunun için main metodunun altına bu satırıda ekliyoruz.

private const int listenPort = 8000;

Böylelikle 8000 nolu portu dinleyeceğimizi bildireceğiz.

Ön ayarlamaları tamamladıktan sonra gelelim sunucumuzu başlatıp 8000 nolu portu dinlemeye.

    private static void StartListener()
    {
        bool done = false;

        UdpClient listener = new UdpClient(listenPort);
        IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);

        try
        {
            while (!done)
            {
                Console.WriteLine("Broadcast veri bekleniyor");
                byte[] bytes = listener.Receive(ref groupEP);

                Console.WriteLine("broadcast veri {0} :\n {1}\n", groupEP.ToString(), Encoding.UTF8.GetString(bytes, 0, bytes.Length));
            }

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
        finally
        {
            listener.Close();
        }
    }

ve başlatmak için ise main metoduna

StartListener();

satırını eklememiz gerekiyor.
Burada dikkat etmemiz gereken nokta ise veriyi ağdaki tüm bilgisayarların görebilecek olması. Yani 3 farklı Sunucumuzun olduğunu varsayalım ve bize bir broadcast verinin geldiğini düşünelim. bu veriyi 3 Sunucuda görüp işleyebilecektir.

Server programımızı tamamladığımıza göre artık gelelim broadcast veriyi nasıl yollayabileceğimize.

Client programda da aynı isim uzaylarını tanımladıktan sonra main metoduna şu satırları eklememiz gerekiyor.

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

 

        int Port = 8000;

        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        byte[] sendbuf = Encoding.UTF8.GetBytes("<BroadCast Verimizi Tüm Sunucular Görebilir.>");
        IPEndPoint ep = new IPEndPoint(IPAddress.Broadcast, Port);

        s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
        s.SendTo(sendbuf, ep);

        Console.WriteLine("Mesaj yollandı");
        Console.ReadLine();

İstemci tarafında ise önemli nokta Sunucu ile iletişim kurabilmemiz için aynı portları kullanmamız gerekmekte.

Yazımızın sonuna gelmeden

IPEndPoint ep = new IPEndPoint(IPAddress.Broadcast, Port);

Satırını

IPEndPoint ep = new IPEndPoint("192.168.1.255", Port);

Gibi değiştirerek tüm ağ kartlarına değilde sadece tek bir ağa veri yollayabileceğimizide eklememiz gerekmekte.
Server tarafında ise bağlı tüm ağları değilde sadece tek bir ağı dinlemek için

IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);

Satırını

IPEndPoint groupEP = new IPEndPoint(IPAddress.Parse("192.168.1.50"), listenPort);

Olarak değiştirebiliriz.

  • Can Türk

    public static IPEndPoint groupEP = new IPEndPoint(IPAddress.Parse(“85.102.233.106”));ben bu sekilde uyguluyorum hocam fakat istenmedik bir hata veriyor. . ‘System.Net.IPEndPoint’ does not contain a constructor that takes 1 arguments ‘ sorun nedir ? local ip de versem değişmiyor . hatayı diğeri içinde veriyor.The best overloaded method match for ‘System.Net.IPEndPoint.IPEndPoint(long, int)’ has some invalid arguments 

    • IPAdrdress.Parse yerine IPAdrdress.Any dersen tum fiziksel ip adreslerini dinleyecektir uygulama. Hatanın nedeni ise dış ip yazman

  • Can Türk

     tamam hocam sorunu çözdüm ben 🙂 ellerine sağlık uygulamamı çalıştırabildim sonunda iki makina arasında karşılıklı sohbet penceresini yaptım 🙂

    IPEndPoint ep = new IPEndPoint(IPAddress.Parse(“192.168.1.3”), Port);

    IPEndPoint groupEP = new IPEndPoint(IPAddress.Parse(“192.168.1.3”), listenPort);

    bu şekilde kullanılması gerekiyor  sadece ip adresi yazınca kabul etmiyor ve az önce yazdıgım yorumdaki gibi hata veriyor. IPAddress.Parse kullanıldııgında sorun kalkıyor

  • elif

    Ben mesajı gönderemiyorum sunucu en son Broadcast veri bekleniyor ekranında kalıyor

  • merve yıldız

    C# üzerinde soket programlama ile yazılım geliştiriyorum. Client ve Server olmak üzere iki ayrı programım var. Bu programlar aynı ağ üzerinde haberleşebiliyor. İki program ayrı ayrı ağlarda olduğunda haberleşmeyi sağlayamadım. Nasıl bir yol izleyebilirim?

    • İki network arasında haberleşmeyi sağlamaız gerekmekte bunun için Server uygulaması için router(modem vs) üzerinde port yönlendirmesi yapmanız gerekmekte. Server uygulamanızın evimizde olduğunu, IP adresinizin 88.228.53.73 olduğunu ve portun 8000 olduğunu var sayarsayalım.
      Ofisinizden evdeki server a ulaşmak için client uygulamanıza 88.228.53.73 ip adresini ve 8000 portunu yazmanız gerekir. Son olarak ise modem üzerinde 8000 portunu kendi bilgisayarınıza yönlendirmeniz gerekir.

  • nur

    benim sorum client ve server arasında işlemler yapıyorum clienttan server

    değer gönderiyorum ama serverdan clienta veriyi nasıl gönderirim?