Socket Kavramı
Herkese merhabalar.
Daha önce Tcp/Ip'nin ne olduğundan bahsetmiştim, bugün de devamı niteliğinde bir konuya, network programlamaya giriş yapmaya çalışacağım. Bunun içinde socket kavramından bahsetmemiz gerekiyor. Konuyla ilgili araştırma yaparken örneklerin genelde birbiriyle aynı veya benzer olduğunu görünce, socket kavramının genel olarak stabil bir yanının olduğunu baştan söylemem gerekli bu arada. Neyse, ne demek istediğimi girince anlayağınız umuyorum :)
Haydi başlayalım.
Kabaca socket; iki farklı bilgisayara, bazı dosya tanımlayıcıları kullanarak birbiriyle bağlamaya yarar. Bu şekilde tanımladığımız zaman socket aslında, bir dosyaymış gibi düşünülebilir. Nasıl bir dosyadan veri okuyabiliyorsak, socket'ten de bunu yapabiliriz.
İşin alt tarafına bakalım biraz ki, ne demek istediğim anlaşılsın. Sıradan bir programda dosya açmak istediğimiz zaman çekirdegin (kernel) sistem çagrilari kullanırız(Sistem çağrılarını Operating System Dersini alan arkadaşlar hatırlayacaktır.) Bu çağrıları kullanarak, programımıza aslında 1 tam sayi deger verilir. Bu değer, dosyamıza ulaşmak için kullanacağımız, yukarıda da bahsettiğim, dosya tanımlıyıcılarıdır.
Linux/Unix gibi işletim sistemlerinde hemen herşey bir dosyadır. /dev dizini altında
cihazlar yer alır. Her cihaz için major ve minor numarasi ile tanimlanan özel dosyalar bulunur. Örnegin ses kartı /dev/audio, ethernet kartı /dev/eth0, disket sürücü /dev/fd0 dosyasıdır.
Yani aslında, soketler dosyadan baska birşey degil. Bu yüzden dosyalarda kullandığımız bazı temel işleri (okuma , yazma gibi) socket'lerle de gerçekleştirebiliriz :)
Aklımıza gelebilecek hemen her internet programı socket olarak çalışır. Buna verilebilecek en büyük örnek ftp serverlardır. Ftp serverlar belli bir port numarası üzerinde açık servislik yaparlar.
Şimdi olayı biraz somutlaştırmaya çalışalım ve 3 önemli terimden bahsedelim.
- İstemci(Client)
- Sunucu(Server)
Istemci(Client): Hizmet isteyen soket programlara denir. İstediği zaman sunucuya (server) baĞlanır, görev verir ve sonuçları alıp bağlantıyı koparır.
Sunucu(Server): Hizmet veren soket programdır. İstemci, herhangi bir anda kendisine baĞlanıp, ondan hizmet isteyebileceĞinden sürekli çalışmak zorundadir. Linux'teki "in.telnetd, wu.ftpd, nfsd, httpd" gibi daemon olarak adlandırılan tüm ağ programları socket sunuculardir.
Port: Çıkış ve giriş yapılan yerlerdir. Bir bilgisayarda birden çok socket bulunabilir. Linux makinelerde aynı anda hem telnet socketi hem de ftp soketi açık olabilmektedir. Socketleri birbirinden ayırmak ve istemci-sunucu ikilisini birbiri ile buluşturmak için her soketin PORT denilen bir numarası vardır. Mesela, ftp'nin port numarasi 21'dir. Bir ftp istemci, ftp sunucunun 21. portta çalıştığını bildiğinden direk onunla temasa geçer. Telnet 23.'ü portta çalıştığından telnet sunucu ile ftp sunucuyu karıştırmaz.
Socket Programlamadaki Temel 2 Prensip:
1) Socketler alıcı ve gönderici olmak üzere 2 uca sahiptirler. Bütün mesajlar ve protokol gereği olan başlıklar nihayetinde fiziksel katmandan, mantıksal 1 ve 0'a karşıkık gelen elektriksel sinyaller olarak gönderilir.
2) Soket program ya istemci, yada sunucudur. Sunucu program ile istemci program arasında çalışma olarak bazı farklar var, bunlardan sonra bahsedeceğim.
Sanırım aşağıdaki aşağıdaki görüntü sunucu istemci modelinin nasıl işlediğini göstermektedir.
Basamakları kısaca özetleyecek olursak;
İstemci: Socket(): Socket oluştur ---- Sunucu: Soket oluştur socket(), Soketi adres ve isim bilgileri ile ilişkilendir bind(), Soketi dinleme moduna geç listen().
İstemci: Connect(): Bağlantı yap ---- Sunucu: Bağlantıyı kabul et Accept().
İstemci: Send(): Veri gönder ---- Sunucu: Receive(): Veri al.
İstemci: Close(): Socketi kapat ---- Sunucu: Close(): Soketi kapat.
Sunucu: Unlink(): Bağlantıyı kes.
Evet, güzel bir giriş yaptığımız kanaatindeyim. Bir dahaki yazıda Socket Programlamaya giriş yapıp, kullanılan veri türlerini görücez inşallah :)
Herkese iyi çalışmalar, saygılar sevgiler...
Daha önce Tcp/Ip'nin ne olduğundan bahsetmiştim, bugün de devamı niteliğinde bir konuya, network programlamaya giriş yapmaya çalışacağım. Bunun içinde socket kavramından bahsetmemiz gerekiyor. Konuyla ilgili araştırma yaparken örneklerin genelde birbiriyle aynı veya benzer olduğunu görünce, socket kavramının genel olarak stabil bir yanının olduğunu baştan söylemem gerekli bu arada. Neyse, ne demek istediğimi girince anlayağınız umuyorum :)
Haydi başlayalım.
Kabaca socket; iki farklı bilgisayara, bazı dosya tanımlayıcıları kullanarak birbiriyle bağlamaya yarar. Bu şekilde tanımladığımız zaman socket aslında, bir dosyaymış gibi düşünülebilir. Nasıl bir dosyadan veri okuyabiliyorsak, socket'ten de bunu yapabiliriz.
İşin alt tarafına bakalım biraz ki, ne demek istediğim anlaşılsın. Sıradan bir programda dosya açmak istediğimiz zaman çekirdegin (kernel) sistem çagrilari kullanırız(Sistem çağrılarını Operating System Dersini alan arkadaşlar hatırlayacaktır.) Bu çağrıları kullanarak, programımıza aslında 1 tam sayi deger verilir. Bu değer, dosyamıza ulaşmak için kullanacağımız, yukarıda da bahsettiğim, dosya tanımlıyıcılarıdır.
Linux/Unix gibi işletim sistemlerinde hemen herşey bir dosyadır. /dev dizini altında
cihazlar yer alır. Her cihaz için major ve minor numarasi ile tanimlanan özel dosyalar bulunur. Örnegin ses kartı /dev/audio, ethernet kartı /dev/eth0, disket sürücü /dev/fd0 dosyasıdır.
Yani aslında, soketler dosyadan baska birşey degil. Bu yüzden dosyalarda kullandığımız bazı temel işleri (okuma , yazma gibi) socket'lerle de gerçekleştirebiliriz :)
Aklımıza gelebilecek hemen her internet programı socket olarak çalışır. Buna verilebilecek en büyük örnek ftp serverlardır. Ftp serverlar belli bir port numarası üzerinde açık servislik yaparlar.
Şimdi olayı biraz somutlaştırmaya çalışalım ve 3 önemli terimden bahsedelim.
- İstemci(Client)
- Sunucu(Server)
Istemci(Client): Hizmet isteyen soket programlara denir. İstediği zaman sunucuya (server) baĞlanır, görev verir ve sonuçları alıp bağlantıyı koparır.
Sunucu(Server): Hizmet veren soket programdır. İstemci, herhangi bir anda kendisine baĞlanıp, ondan hizmet isteyebileceĞinden sürekli çalışmak zorundadir. Linux'teki "in.telnetd, wu.ftpd, nfsd, httpd" gibi daemon olarak adlandırılan tüm ağ programları socket sunuculardir.
Port: Çıkış ve giriş yapılan yerlerdir. Bir bilgisayarda birden çok socket bulunabilir. Linux makinelerde aynı anda hem telnet socketi hem de ftp soketi açık olabilmektedir. Socketleri birbirinden ayırmak ve istemci-sunucu ikilisini birbiri ile buluşturmak için her soketin PORT denilen bir numarası vardır. Mesela, ftp'nin port numarasi 21'dir. Bir ftp istemci, ftp sunucunun 21. portta çalıştığını bildiğinden direk onunla temasa geçer. Telnet 23.'ü portta çalıştığından telnet sunucu ile ftp sunucuyu karıştırmaz.
Socket Programlamadaki Temel 2 Prensip:
1) Socketler alıcı ve gönderici olmak üzere 2 uca sahiptirler. Bütün mesajlar ve protokol gereği olan başlıklar nihayetinde fiziksel katmandan, mantıksal 1 ve 0'a karşıkık gelen elektriksel sinyaller olarak gönderilir.
2) Soket program ya istemci, yada sunucudur. Sunucu program ile istemci program arasında çalışma olarak bazı farklar var, bunlardan sonra bahsedeceğim.
Sanırım aşağıdaki aşağıdaki görüntü sunucu istemci modelinin nasıl işlediğini göstermektedir.
Basamakları kısaca özetleyecek olursak;
İstemci: Socket(): Socket oluştur ---- Sunucu: Soket oluştur socket(), Soketi adres ve isim bilgileri ile ilişkilendir bind(), Soketi dinleme moduna geç listen().
İstemci: Connect(): Bağlantı yap ---- Sunucu: Bağlantıyı kabul et Accept().
İstemci: Send(): Veri gönder ---- Sunucu: Receive(): Veri al.
İstemci: Close(): Socketi kapat ---- Sunucu: Close(): Soketi kapat.
Sunucu: Unlink(): Bağlantıyı kes.
Evet, güzel bir giriş yaptığımız kanaatindeyim. Bir dahaki yazıda Socket Programlamaya giriş yapıp, kullanılan veri türlerini görücez inşallah :)
Herkese iyi çalışmalar, saygılar sevgiler...
Akıcı bir dille anlatılmış. Devamını bekleriz.
YanıtlaSil