TCP ve UDP Protokollerinde C# Socket Programlama

TCP ve UDP Protokollerinde C# Socket Programlama

C# Socket Programlama ile TCP ve UDP Protokollerini öğrenin Bu eğitimde, Socket sınıfının kullanımını öğrenerek, veri iletişimini zahmetsizce yönetebilirsiniz Hadi hemen başlayın!

TCP ve UDP Protokollerinde C# Socket Programlama

TCP ve UDP, internet üzerinde veri transferi için en sık kullanılan protokollerdir. Bu protokollerin C# kullanarak nasıl programlanabileceği hakkındaki bu makalede, TCP ve UDP'nin temel bilgilerinden başlayarak, soket programlama mekanizması ve örnek kodların açıklanması yer alacaktır.

Bu makale, C# programlama dilini kullanarak TCP ve UDP protokollerinin nasıl programlanabileceğine dair kapsamlı bir kaynak olacaktır. TCP ve UDP üzerinden veri transferi gerçekleştiren uygulamaların geliştirilmesi için, bu protokollerin çalışma prensiplerinin ve soket programlama mekanizmasının anlaşılması gerekmektedir. Bu makalede, bu konuların yanı sıra, TCP ve UDP soket programlama hakkında bilinmesi gerekenler detaylıca ele alınacaktır.


Temel Bilgiler

TCP ve UDP, internet üzerinde veri iletişiminde kullanılan iki farklı protokoldür. Bu protokoller, C# dili kullanılarak socket programlama ile birlikte uygulanabilir. TCP, güvenilir bir veri iletişimini sağlamak için kullanılırken, UDP bağlantısız veri iletişiminde etkilidir.

TCP, veri paketlerinin doğrulanması ve yeniden gönderilmesi gibi özellikleri sayesinde güvenilir iletişim sağlama amacı taşır. TCP protokolünün kullanımı ve uygulanmasıyla ilgili detaylar, socket programlama örnekleri aracılığı ile daha iyi anlaşılabilir. Öte yandan, UDP protokolü, güvenilir olmamasına rağmen hızlı ve etkili bir iletişim için idealdir.

C# ile TCP ve UDP protokollerinin kullanımı için öncelikle temel bilgilerin edinilmesi gereklidir. Bu genel bilgiler arasında, IP adresleri, port numaraları ve veri iletişimi mekanizması gibi konular yer alır. Bu bilgilerin öğrenilmesiyle birlikte, TCP ve UDP soket programlama örnekleri daha kolay bir şekilde anlaşılabilir. Ayrıca, socket programlama mekanizmaları aracılığıyla veri iletişimine ilişkin farklı senaryolar uygulanabilir ve farklı uygulamalar geliştirilebilir.


TCP Socket Programlama

TCP Socket Programlama, C# kullanarak bir TCP soketi oluşturmak ve veri göndermek için kullanılır. Bu mekanizma, veri alışverişi için güvenilir bir yol sağlar ve birçok uygulama tarafından kullanılmaktadır. TCP protokolü, veri gönderme işlemi sırasında hedef cihazın bağlantı hızına göre kendini ayarlar ve hatalı paketlerin yeniden gönderilmesini sağlar.

TCP soketi oluşturmak için öncelikle bir bağlantı noktası belirlememiz gerekir. Bağlantı noktası, veriyi göndermek için hedef cihazın dinlemekte olduğu bir port numarasıdır. Daha sonra, bir IP adresi belirlenir ve soket, bu IP adresine ve bağlantı noktasına bağlanır. Bu işlem sırasında, bir istemci soketi ve bir sunucu soketi oluşturmak gerekebilir.

TCP soketi oluşturulduktan sonra, bağlantı kurulabilir ve veri gönderme işlemine başlanabilir. Gönderilecek veri, bayt dizisi olarak gönderilir ve karşı cihaz tarafından alındığında tekrar string veya herhangi bir veri tipine dönüştürülebilir. TCP soketleri arasında veri gönderme ve alma işlemleri, veri akışı prensibiyle gerçekleşir ve önceden belirlenmemiş bir boyut yoktur.

TCP soketlerinin kullanımı oldukça yaygındır ve birçok uygulamada kullanılabilmektedir. Ancak, bu protokolün daha yüksek bir bağlantı maliyeti vardır ve veri transferi için bant genişliği gereksinimleri daha yüksektir.


Bağlantı Oluşturma

TCP bağlantısı oluşturma işlemi, genellikle istemci-sunucu modelinde gerçekleştirilir. İlk adım olarak, sunucu bir soket belirleyerek ve bağlantıyı dinlemeye başlayarak başlar. İstemci tarafından bağlantı kurulduğunda, sunucu tarafında yeni bir soket oluşturulur ve istemcinin soketiyle iletişim sağlanır. Bu işlem için Socket sınıfı kullanılır.

Bir TCP bağlantısı oluşturmak için Socket sınıfının Connect() metodu kullanılır. Bu metot, sunucu IP adresi ve port numarası ile istemci soketi arasında bir bağlantı kurar. Örneğin;

TcpClient client = new TcpClient();IPAddress ipAddress = IPAddress.Parse("192.168.1.100");int port = 8000;client.Connect(ipAddress, port);

Bu kodda, istemci tarafından sunucu IP adresi olarak 192.168.1.100 ve port olarka 8000 kullanılmıştır.

Bağlantıyı sonlandırmak için, bağlantılı soketin Close() metodu kullanılır. Bir örnek:

client.Close();

Bir başka örnek de sunucu tarafında bir bağlantı kurmaktır. Bunun için ilk olarak bir soket oluşturulur ve belirli bir IP adresi ve port numarası seçilir. Derlenen birden fazla uygun adres ve bağlantı noktası varsa, soket Listen() yöntemiyle bağlantıları dinlemeye başlayabilir. Yeni bir bağlantı için, soket bir Accept() metot çağrısı yapar. Bu metot, yeni bir soket ve istemci adresinin birleştirilmiş bir şekilde bilgilerini döndürür.

Örneğin;

IPAddress ipAddress = IPAddress.Parse("192.168.1.100");int port = 8000;TcpListener listener = new TcpListener(ipAddress, port);listener.Start();Socket handler = listener.AcceptSocket();handler.Close();listener.Stop();

Bu kodda, sunucu tarafında 192.168.1.100 IP adresi ve 8000 portu kullanılıyor ve TcpListener sınıfı ile dinleme işlemi yapılıyor. AcceptSocket() metodu sunucu tarafında bir bağlantı kurulduğunda çağrılır ve yeni bir soket ve istemci adresinin birleştirilmiş bir şekilde bilgileri döndürülür. Son olarak, soket kapatılır ve TcpListener durdurulur.

Bağlantı yöntemlerinin detaylı mekanizmalarına değinmeye çalıştık. Bir sonraki adım ise bu bağlantılar üzerinden veri gönderme ve alma işlemlerini gerçekleştirmek olacaktır.


IP ve Port Numarası

IP adresi ve port numarası, TCP soketi için anahtar bileşenlerdir. IP adresi, internet bağlantısının yapıldığı aygıta özgü benzersiz bir adresi ifade ederken, port numarası belirli bir uygulamaya yönlendirilen trafiğin hedefini belirtir. TCP soket programlama sırasında, IP adresi ve port numarası, değişkenler olarak atanır ve kullanıcı bunları programda belirleyerek gerekli bağlantılar sağlayabilir.

Bir TCP soketi üzerinden veri göndermek isteyen bir client, öncelikle bağlanacağı sunucunun IP adresi ve port numarasını belirlemelidir. Bu bilgiler göz önünde bulundurularak client tarafından bir soket oluşturulur ve sunucuyla bağlantı kurulur. Sunucu, aynı IP adresi ve port numarasını kullanarak bağlantı isteğini kabul eder ve veri iletimi sağlanır.

Özetle, IP adresi ve port numarası, TCP soketi için sağlanan iki anahtar bileşendir ve programcı tarafından doğru bir şekilde kullanıldığında, iki aygıt arasındaki bağlantı sağlanır ve veri alışverişi yapılabilir.


TCP Sunucusu Oluşturma

TCP Sunucusu Oluşturma

TCP protokolü üzerinden iletişim sağlayan bir aplikasyon geliştireceksek, bir TCP sunucusu oluşturmamız gerekmektedir. Bu işlem, sırasıyla; soket oluşturma, bağlantıların dinlenmesi ve bağlantının kabul edilmesi adımlarını içermektedir.

Soket oluşturma işlemi, "System.Net.Sockets" isim alanındaki "Socket" sınıfı kullanılarak gerçekleştirilecektir. Bu sınıf örneğinden bir soket oluşturularak, belirtilen IP adresi ve port numarasına bağlı olarak soket Bağlama işlemi tamamlanmalıdır.

Bağlantıların dinlenmesi sürecinde, belirtilen port numarasındaki gelen bağlantıları dinlenir. "Listen" metodunu kullanarak bu işlem yapılır.

Son olarak, kabul edilecek olan bağlantıyı "Accept" metodu ile kabul etmek gerekmektedir. Bu işlem, yeni bir soket örneği oluşturur ve bu soket üzerinden iletişim sağlanabilir.

Aşağıda, TCP sunucusu oluşturma işleminin adım adım nasıl gerçekleştirilebileceği örneklendirilmiştir:

1. Soket oluşturma:

```Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 80); listener.Bind(localEndPoint);```2. Bağlantıların dinlenmesi:```listener.Listen(10);```3. Bağlantının kabul edilmesi:```Socket clientSocket = listener.Accept();```Yukarıda verilen örnek kod bloğunda, bir soket nesnesi oluşturulmuştur ve IP adresi ve port numarası belirlenerek bağlama işlemi gerçekleştirilmiştir. Ardından, "Listen" metodu ile belirtilen port numarasında gelen bağlantılar dinlenmektedir. Son adımda, "Accept" metodu ile bir bağlantı kabul edilmiştir ve yeni bir soket nesnesi oluşturulmuştur.

TCP sunucusu oluşturmak, TCP protokolü üzerinden iletişim sağlama işleminin temel adımlarından biridir. Yukarıda belirtilen adımlar, uygulamanın ihtiyacına göre değişebilir. Ancak, genel olarak bu adımlar kullanılarak TCP sunucusu oluşturulabilir.


Veri Gönderme ve Alma

TCP protokolü, güvenli ve hatasız veri transferi için tercih edilen bir protokoldür. Veri gönderme işlemi gerçekleştirilirken, öncelikle bir soket oluşturulmalıdır. Soket oluşturulduktan sonra, veri gönderme işlemi için kullanılacak olan bağlantı tipi belirlenmelidir. Stream olarak belirlenen bağlantı tipi, yüksek miktarda veri transferi için idealdir.

Veri gönderme işlemi için kullanılacak olan sokete veri yazmak için öncelikle bir yazma işlemi başlatılmalıdır. Bu işlem için, NetworkStream sınıfının Write() metodundan yararlanılmalıdır. Write() metoduna parametre olarak, verileri içeren bir byte dizisi (byte[]) veya string ifadesi gönderilebilir.

Veri alma işlemi gerçekleştirilirken, öncelikle bir soket oluşturulmalıdır. Ardından, bu sokete ait olan NetworkStream sınıfı, verilerin alınması için kullanılmalıdır. Read() metoduna parametre olarak, hangi soketten verilerin alınacağı ve kaç byte veri alınacağı belirtilir.

Aşağıdaki örnek kodlar, TCP protokolü üzerinden veri gönderme ve alma işlemlerinin nasıl gerçekleştirileceğine dair örnekler sunmaktadır:

TCP Veri Gönderme Örneği TCP Veri Alma Örneği
  • TcpClient client = new TcpClient(ipAdresi, portNumarasi);
  • NetworkStream stream = client.GetStream();
  • string veri = "Merhaba Dünya!";
  • byte[] data = Encoding.UTF8.GetBytes(veri);
  • stream.Write(data, 0, data.Length);
  • client.Close();
  • TcpListener listener = new TcpListener(IPAddress.Any, portNumarasi);
  • listener.Start();
  • TcpClient client = listener.AcceptTcpClient();
  • NetworkStream stream = client.GetStream();
  • byte[] data = new byte[1024];
  • int length = stream.Read(data, 0, data.Length);
  • string veri = Encoding.UTF8.GetString(data, 0, length);
  • client.Close();

Yukarıdaki örneklerde;

  • ipAdresi ve portNumarasi, veri gönderme işleminin gerçekleştirileceği hedef adres ve port numaralarını temsil etmektedir.
  • client değişkeni, TcpClient sınıfından bir örnek oluştururken, listener değişkeni ise TcpListener sınıfından bir örnektir.
  • stream, NetworkStream sınıfından bir örnektir ve veri göndermek ve almak için kullanılır.
  • data değişkeni, verilerin byte[] dizisi olarak tutulduğu değişkendir.
  • Encoding.UTF8.GetString() metodu, byte[] dizisindeki verileri string ifadeye dönüştürmek için kullanılır.

UDP Socket Programlama

UDP (User Datagram Protocol), veri paketlerini göndermede kullanılan bir protokoldür. Bu yazımızda, UDP protokolü hakkında ve C# kullanarak nasıl socket programlama yapabileceğimiz hakkında bilgi vereceğiz.

UDP protokolü, kararlılık sağlama veya verinin doğru iletildiğini teyit etme konusunda TCP ile karşılaştırıldığında daha az güvenlidir. Ancak, TCP'ye kıyasla daha hızlıdır. UDP protokolünün C# kullanarak socket programlama yapmak için öncelikle bir soket oluşturmalıyız. Bu soket üzerinden veri gönderme ve alma işlemlerini gerçekleştirebiliriz.

Bağlantısız olarak veri gönderme işlemi, UDP protokolü ile sık kullanılan bir tekniktir. Bunun için, öncelikle bir end-point belirlemeliyiz. End-point, verinin gönderileceği hedef IP adresi ve port numarasını içerir. UDP protokolünü kullanarak end-point oluşturup, bu endpoint üzerinden gönderim yapabiliriz. İşte size UDP ile bağlantısız veri gönderme örnek kodları:

Kod Açıklama
UdpClient udpClient = new UdpClient(ipAdresi, portNumarasi);
byte[] byteVeri = Encoding.ASCII.GetBytes(veri);
udpClient.Send(byteVeri, byteVeri.Length);
UDP kullanarak veri gönderme örneği

Bağlantısız olarak veri alma işlemi de UDP protokolü ile gerçekleştirilen bir tekniktir. Bu işlem de end-point kullanılması gerektirir. End-pointi oluşturup, gelen verileri bu end-point üzerinden alabiliriz. İşte size UDP ile bağlantısız veri alma örnek uygulamaları:

  • Örnek 1:
  • UdpClient udpClient = new UdpClient(portNumarasi);
    IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
    byte[] byteVeri = udpClient.Receive(ref endPoint);

  • Örnek 2:
  • UdpClient udpClient = new UdpClient(portNumarasi);
    while (true) {
        byte[] byteVeri = udpClient.Receive(ref endPoint);
        string veri = Encoding.ASCII.GetString(byteVeri);
        Console.WriteLine(veri);
    }

Bu şekilde, UDP protokolü hakkında temel bilgileri ve C# kullanarak nasıl soket programlama yapabileceğimizi öğrendik. Artık UDP protokolü üzerinden veri gönderme ve alma işlemlerini gerçekleştirebilecek düzeyde bilgi sahibi olduk.


Bağlantısız Veri Gönderme

UDP protokolü, bağlantısız olarak veri göndermeye olanak sağlar. TCP protokolünden farklı olarak, bağlantı kurma işlemine gerek yoktur. Bu nedenle, UDP protokolü daha az güvenli olsa da daha hızlı bir veri iletimi sağlar. Bağlantısız veri gönderimi yapmak için öncelikle bir soket oluşturulmalıdır. Bu işlem, TCP soketi oluşturmaya benzer.

UDP soketi oluşturmak için, Socket sınıfının UDP parametresi kullanılmalıdır. Bir soket oluşturduktan sonra, mesaj göndermek için SendTo() metodu kullanılır. Bu yöntem iki parametre alır; veriyi göndermek için kullanılan bayt dizisi ve hedef IP adresi ve Port numarasıdır. Örneğin;

byte[] veri = Encoding.ASCII.GetBytes("Merhaba UDP!");string hedefIP = "192.168.1.5";int hedefPort = 1234;udpSoketi.SendTo(veri, new IPEndPoint(IPAddress.Parse(hedefIP), hedefPort));

Bu örnek, "Merhaba UDP!" yazısını 192.168.1.5 IP adresine ve 1234 Port numarasına sahip hedefe gönderir. SendTo() metodu asenkron şekilde çalışır ve hedefe verinin başarılı bir şekilde gönderilip gönderilmediğini kontrol etmez. Bu nedenle, gönderilen verinin başarılı bir şekilde alınıp alınmadığını kontrol etmek için ReceiveFrom() metodu kullanılır.

ReceiveFrom() metodu, UDP protokolü ile alınan verileri verilen IP adresi ve port numarasına sahip olan hedefe gönderir. Bu yöntem, veri alınana kadar bloklanır ve gelen verinin başarıyla alınıp alınmadığını kontrol eder. Aşağıdaki örnek, UDP soketi kullanarak hedef IP'ye bağlantısız olarak veri alma işlemini göstermektedir:

byte[] veri = new byte[1024];string hedefIP = "192.168.1.5";int hedefPort = 1234;EndPoin gelenEp = new IPEndPoint(IPAddress.Any, 0);int gelenVeriBoyutu = udpSoketi.ReceiveFrom(veri, ref gelenEp);string gelenVeri = Encoding.ASCII.GetString(veri, 0, gelenVeriBoyutu);Console.WriteLine("Alınan veri: " + gelenVeri);

Bu örnek, verinin başarılı bir şekilde alınması için bloklanacak ve alınan veriyi ekrana yazdıracaktır. UDP kullanarak bağlantısız veri gönderme işleminin örnek kodlarını kullanarak bu işlemi yapmak oldukça kolaydır.


Bağlantısız Veri Alma

UDP (User Datagram Protocol) protokolü, internet üzerinden veri transferi için kullanılır ve bağlantısızdır, yani veri paketleri kaybolabilir veya çift gönderilebilir. UDP ile bağlantısız veri alma işlemi ise oldukça basit ve hızlıdır. UDP üzerinden gelen verileri alma işlemi ile ilgili örnek bir uygulama yapalım:

```csharpusing System;using System.Net;using System.Net.Sockets;

namespace UDPServer{ class Program { static void Main(string[] args) { UdpClient udpClient = new UdpClient(1234); Console.WriteLine("Waiting for a client...");

IPEndPoint remoteIp = null;

while (true) { byte[] receivedBytes = udpClient.Receive(ref remoteIp); string receivedString = Encoding.ASCII.GetString(receivedBytes);

if (receivedString.ToLower() == "exit") break;

Console.WriteLine("Received: " + receivedString + " from " + remoteIp.Address.ToString() + ":" + remoteIp.Port.ToString()); }

udpClient.Close(); } }}```

Yukarıdaki kod, öncelikle bir UDP istemcisi oluşturur ve 1234 numaralı bir bağlantı noktasını ilişkilendirir. Ardından, bir bağlantı bekler ve bağlantıyı kabul ettiğinde gelen verileri alır ve ekrana yazar.

Uygulamayı başlatıp, bir UDP istemcisi ile bağlantı kurduğunuzda, aldığınız verileri görebilirsiniz. Verileri aldıktan sonra, kod bloğu bağlantıyı sonlandırır.

UDP ile veri alma işleminin bu kadar basit ve hızlı olması, UDP protokolünün daha çok oyun ve video aktarımı gibi gecikmeye yüksek dayanıklı uygulamalarda tercih edilmesine neden olmaktadır.