Network Programlama-TCP-Part 1(Sunucu Tarafı)

Özge Odabaş
4 min readJun 11, 2022

Bu yazıda, tüm iletişim için TCP’yi kullanan connection-oriented soket modeli ile hazırlanmış C# sınıflarını yazacağız.

Önce basit Tcp istemci ve sunucu oluşturacağız.

Öncelikle bir sunucunun istemci bağlantısıyla veri aktarabilmesi için gerçekleştirmesi gereken dört görevi vardır:

  • Soket oluşturmak
  • Soketi lokal IPEndPoint ile bağlamak
  • Soketi listen moduna almak
  • Sokete gelen bağlantıyı kabul etmek
Connection-oriented soket programlama fonksiyonları

Sunucumuzu (Server) Oluşturalım:

Öncelikle bir soket objesi oluşturmamız gerekiyor. Daha sonra bu objeyi kullanarak yukarıdaki kalan 3 fonksiyonu da gerçekleştirebiliriz.

Simple Tcp Server Class

Şimdi bu kodları adım adım açıklayalım.

Öncelikle alınan ve iletilen mesajlar için data buffer olarak byte tipinde boş bir array tanımladık. Bu arada Receive() ve Send() fonksiyonları sadece byte tipinde diziler ile çalışır. Yani soket ile iletilen tüm veriler byte tipinde bir diziye dönüştürülmelidir. Burada bu işlemi Encoding.ASCII methoduyla yapıyoruz.

Daha sonrasında lokal sunucu için bir IPEndPoint nesnesi oluşturuldu:

  • IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);

Siz eğer sadece belli bir arayüzden gelen paketleri kabul etmek istiyorsanız, IPAddress.Any yerine IP adresi belirtebilirsiniz:

  • IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(“192.168.1.6”), 9050);

Daha sonra soketimizi oluşturuyoruz:

  • Socket serversocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

AddressFamily.InterNetwork bizim IPv4 ile çalıştığımızı gösteriyor. (IPv6 için InterNetworkV6)

Soket nesnesini de oluşturduktan sonra bu soketi lokal endpoint ile bağlayıp (Bind()) listen moduna alabiliriz (Listen()):

  • serversocket.Bind(ipep);
  • serversocket.Listen(10);

Daha sonra Accept() metodu ile istemciden gelen bağlantıyı kabul edebiliriz. Accept() metodu yeni bir Soket döndürüyor bu yüzden aşağıdaki gibi kullanıyoruz. Client soketi tüm iletişim boyunca kullanılacak olan sokettir.

  • Socket client = serversocket.Accept();

Bağlantıyı kabul ettikten sonra, istemcinin IP adresi bilgileri RemoteEndPoint ile return edilen soketten (bu sokete client dedik) alınabilir:

  • IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;

Önemli Not: Burada zaten oluşturduğumuz ipep IPEndPointi yerine yeniden bir clientep adında bir IPEndPoint nesnesi oluşturmamızın ve onu kullanmamızın nedeni sadece tek bir istemci ile çalışmayacak olmamız. Eğer orijinal soket ile çalışırsak tek bir istemci ile iletişim kurmamız mümkün olurdu. Orijinal soket kaynak IP (source IP) ve kaynak port (source port) ile yeni bağlantı bekliyor.

clientin bilgileri ile IPEndPoint oluşturulduktan sonra, Address ve Port bilgileri ile bu nesneye ulaşabiliriz.

Soket oluşturulduktan sonra, eğer sunucu ve istemci blocking soket kullanıyorsa (ki default olarak böyledir) ve aynı anda veri almaya veya göndermeye çalışırlarsa sonsuza kadar bekleme durumuna girerler (deadlock). Yani, birisi veriyi alırken diğeri beklemelidir.

Bizim örneğimizde sunucu istemciye ‘’welcome’’ mesajını gönderdikten sonra cevap gelmesi için bekliyor:

Sunucu ve istemci arasında bağlantı kurulduğu anda istemci ‘’welcome’’ mesajını almaya hazır olmalıdır. Mesajı aldıktan sonra ise bu sefer data göndermeye hazır olmalıdır.

İstemciden her mesaj alındığında bu mesaj tekrar istemciye gönderilir. Buna ‘’echo server’’ denilir ve genellikle iletim hatlarının kontrolü üçün kullanılan bir yöntemdir.

Echo Server

Önemli Not: while döngsünün ilk satırında data değişkenine yeni bir byte dizisi atıyoruz. Çünkü Receive() metodu datayı data dizisine yerleştirdiğinde, data dizisinin boyutu belirlenmiş oluyor. Eğer bu boyutu tekrar atamazsak bir sonraki Recieve() çağrısı buffera yalnızda önceki çağrı kadar data yerleştirebilir.

Eğer hiçbir data gönderilmemişse, Recieve() metodu bir data gelene kadar bekler.

Eğer remote istemci bağlantıyı kapatma isteğinde bulunursa Receive() metodu sıfır değeri döndürür. Yukarıdaki kodda da görüldüğü üzere recv değerinin 0 olup olmadığını kontrol ediyoruz. Eğer 0 olarak dönmüşse program sonlanıyor ve yeni oluşturduğumuz soketi (client olarak adlandırdığımızı) kapatıyoruz (Close() ile). Bu soketi kapattığımızda artık onun üzerinden yeni bir bağlantı kurulması mümkün olmuyor. Ama dikkat edecek olursak hala orijinal soketi kapatmamış oluyoruz ve hala gelen bir bağlantıyı kabul edebilir durumda. Eğer bu süreçten sonra hiçbir bağlantı olmamasını istiyorsak bu orijinal soketi de kapatmamız gerekir.

Böylece en basit haliyle ilk Tcp sunucumuzu oluşturmuş olduk. Henüz elimizde bağlantı kurabilecek bir istemcimiz yok.

Bu haliyle sunucuyu kontrol etmek için Microsoft Telnet programı yardımıyla bunu gerçekleştirebiliriz.

Sunucumuzu çalıştırdıktan sonra başka bir komut satırı penceresinde Telnet programını başlatabiliriz. Sunucumuzun adresi ve port numarası ile bağlantı gerçekleştirdikten (sunucu kodunu yazarken belirttikleriniz ) sonra sunucumuz istemciden gelecek bir mesajı bekliyor olacak.

  • yukarıda yazılan kod için -> C:\>telnet 127.0.0.1 9050

Bu komuttan sonra sunucumuz ve telnet bağlantı kurmuş olmalı ve aşağıdaki şekillerde görünüyor olmalılar:

Server
Telnet

Bir mesaj göndermeye çalıştığımızda her bir karakter tek tek gönderiliyor olduğunu göreceksiniz, bu Telnet kullanıyor olmamızdan kaynaklanıyor (her pakette tek bir karakter olmalı).

İlk mesajı göndermek

Bu soruna ve diğer başka sorunlara Network Programlama-TCP/IP-Part 2(İstemci Tarafı) yazısında birlikte çözüm bulalım :)

Keyifli okumalar..

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Özge Odabaş
Özge Odabaş

Written by Özge Odabaş

Merhaba! Ben Özge. Junior Java Developerım. Kendimi geliştirirken edindiğim bilgileri yazıyorum. Keyifli okumalar.

No responses yet

Write a response