Soket Programlama, Sistem programı | Temiz Kod
TCP-IP, internette, bilgisayarlar arası iletişimi sağlayan protokol grubudur. Bilgisayarlar arasında bilgi alışverişi IP paketleri aracılığıyla yapılır. Bilgisayar A, bilgisayar B ye göndermek istediği veriyi paketler halinde gönderir. Bu paketler içerisinde A’ nın ve B’ nin adresleri vardır. A’nın gönderdiği paketlere IP-Paketleri, A’nın adresine IP-Adresi denir. Gönderilen paketler, B’nin adresini taşıdığı için bilgisayar ağları arasında kullanılan Router lar aracılıyla doğru bilgisayara iletilir.
Port ve Soket Kavramları
Host cihazındaki bir TCP üst-katman kullanıcısı bir port numarası ile tanımlanır. Port değeri IP internet adresi ile birleşerek bir soket oluşturur.
Gönderici Soket = Kaynak IP Adresi + Kaynak Port
Bu değer internet boyunca tek olmalıdır. Bir soket çifti her bir uç-nokta bağlantısını tek olarak tanımlar.Bir bilgisayarda birden çok soket bulunabilir. Örneğin aynı anda hem telnet socketi hem de ftp soketi açık olabilmektedir.
Soketler, bir tür süreçler arası haberleşme(interprocessing) yöntemidir. Soket, soyut bir tanımla haberleşme uç noktalarıdır.
Pratik olarak soketler dosyalara benzer. Soketten okumak ile dosyadan okumak arasında hiçbir fark yoktur.
Aklınıza gelebilecek hemen her internet programı socket program olarak çalışır. Örneğin web sunucuları 80, telnet sunucuları 23 numaralı port üzerinde çalışan soket programlardır.
Bunlar “Stream Soketler” , “Datagram Soketler” ve “Raw Soketler” dir. Bunlar programlarda sırasıyla SOCK_STREAM , SOCK_DGRAM ve SOCK_RAW isimleri ile kullanılır.
Programda socket() açarken türü belirtilir. Stream soketlere bağlantı yönelimli (connection oriented) soketler, Datagram soketlere ise bağlantısız (connectionless) soketler denir.
Stream soketler, TCP/IP protokolunun taşıma katmanında bulunan TCP’yi (Transmission Control Protocol) kullanır. Datagram soketler ise yine aynı katmandaki UDP’yi (User Datagram Protokol) kullanır.
Stream soketler verileri sıralı gönderir, datagram soketleri sıralı göndermeyebilir.
Örneğin ‘telnet’ programı Stream soket, ‘tftp’ programı ise Datagram sokettir.
Soketler her zaman iki uca sahiptir: Alıcı ve gönderici. Bütün mesajlar ve protokol gereği olan başlıklar nihayetinde fiziksel katmandan, mantıksal 1 ve 0’a karşılık gelen elektriksel sinyaller olarak gönderilir.
Soket program ya istemci, yada sunucudur. Programlanmaları daha karışık olmakla beraber bazı soket programlar her iki görevi de yapmaktadır.
socket() fonksiyonu bir soket tanımlayıcı döndürür ve bu daha sonraki işlevlerde parametre olarak kullanılır. Eğer bir hata oluşursa işlev -1 değerini döndürür. Bu durumda errno isimli global değişken hata kodunu tutar.
bind() sistem çağrısı
Bir soket edindikten sonra bu, makinadaki bir “port” ile ilişkilendirilir. Eğer tek yapacağınız bir yere connect() ile bağlanmaksa o zaman buna gerek yoktur. sockfd değeri, socket() tarafından döndürülen soket dosya tanımlayıcısıdır
connect() sistem çağrısı
Uzaktaki bir bilgisayara bağlanma talebinde bulunmak için kullanılır. sockfd dediğimiz değişken socket() sistem çağrısı tarafından döndürülmüş olan soket dosya tanımlayıcısının değerini tutar.
listen() sistem çağrısı
Bu tür bir süreç iki aşamalıdır, önce listen() ile dinler sonra da accept() ile gelen çağrıları kabul edilir.
accept() sistem çağrısı
connect() işlevi ile listen() ile dinlenen bir porta bağlanmaya çalışılır. Bu bağlantı talebi accept() ile kabul edilene dek kuyrukta bekler