Mühendisbilir'i Instagramdan takip ediyor musunuz?

Özgür Yazılım Kış Kampı- Soketler

Linux Sistem Programlamada kullanacağımız soketler nedir ne işe yarar ?

Önce uygulama katmanındaki ağ uygulamaları birbirleriyle nasıl haberleşirler ona bakalım.Birbiriyle haberleşen sistemlere aslında uygulamaların haberleşmesi değil proseslerin haberleşmesi diyoruz.

Proses ise işlem diyebiliriz kısaca fakat şöyle desek daha dogru olur :  Herhangi bir uç sistemde çalışan programların her biri bir prosestir,bir işlemdir.

Mesela benim bilgisayarımda iki işlem birbiriyle haberleşecekse buna işlemler arası haberleşme(inter process) deniyor, bu yöntemle haberleşiyorlar.

(Bu haberleşme yöntemi işletim sistemi tarafından tasarlanmıştır.)

Farklı son sistemlerdeki farklı hostlardaki prosesler birbirleriyle haberleşecekse bunlar birbirleriyle mesaj alışverişi yaparlar.Üretilen mesajları  ağ üzerinde taşırlar.

Prosesleri gruplandıracak olursak ,

  • Client prosess
  • Server prosess

Haberleşmeyi başlatan proseslere istemci prosesleri diyoruz.

Kendisiyle iletim kurulmasını bekleyen proseslere server proses sunucu proses diyoruz.

Prosesler birbirleriyle haberleşiyorlar ama mesajları iletme işiyle ilgilenmiyorlar.Mesaj iletme işiyle bir alt katmandaki transport katmanı ilgileniyor.Bu mesajları iletim transport katmanına vermeleri lazım peki nerden  verirler bu katmana mesajları , soket dediğimiz yazılımlar üzerinden verirler.Yani soketleri bir kapı olarak düşünebiliriz.Uygulalama katmanı ile transport katmanı arasındaki bir kapıdır bu soket.

(soketi arayüz olarakda düşünebiliriz. Bu arayüze de API deniyor. )

Ağ uygulamalarının oluşturuldugu programlama arayüzü=soket

(Bu soketler üzerinden dogru uygulamaya dogru mesajların gittiğini sağlarız .)

Soket kullanımı içinde uygulama adresi tek başına yeterli değildir, Ağda her uygulamanın bir numarası vardır ve bu numaraya port numarası denir.

Örneğin ben belirli bir yerdeki web sunucusuna http mesajı gönderecem, bunun için hem IP adresini hem port numarasını göndermem gerekir.

Portlara genel olarak iana.org dan bakabilirsiniz.

Nedir IANA ==> Internet Assigned Numbers Authority ==> İnternette atanan numaraların otoritesi gibi çevrilebilir.

Bütün port numaralarının hangi servislere ait olduguna dair bir liste tutar.

struct sockaddr : Bu veri yapıs pek çok türde soket için soket adres bilgisini barındırır.
sa_family pek çok de erden birini alabilir. Ama bu anlatımda sadece AF_INET (ARPA Internet protocols)
kullanılacaktır.
AF_UNIX (UNIX internal protocols)
AF_INET (ARPA Internet protocols)
AF_ISO (ISO protocols)
AF_NS (Xerox Network Systems protocols)
AF_IMPLINK (IMP “host at IMP” link layer)
sa_data ise soketle ilgili hedef adres ve port numaras bilgilerini barındırır.
struct sockaddr ile başa çıkabilmek için buna paralel bir yapı olarak struct sockaddr_in tasarlanmıştır.

 

 

 

Şimdi bir örnek üzerinden başlayalım :

(önce bir udp sunucu yazıyoruz.)

 

# ! /usr/bin/python                    // linux üzerinde yazdım kodu bu kısım  python programına erişim adresi

# -*- encoding: utf-8 -*-

#ax-udp-sunucu.py

from socket import *    //socket modülünün içindeki bütün fonksiyonları import et .

sunucuAd= ‘hostname’

// burada anlaşılsın diye böyle yazdım böyle bir sunucu adı olmaz .bunun yerine  ‘localhsost ’ , yada ‘127.0.0.0’ yada boş bırakın farketmez.

sunucuPort=12345

sunucuSocket=socket(AF_INET , SOCK_DGRAM)  // nesneyi açtık burada AF_INET internet bağlantısı

sunucuSocket.bind((sunucuAd, sunucuPort )) // şimdi bir bağlantı kuruyoruz bind ile

print (‘Sunucu veri almaya hazırdır. ’)

while 1 :

mesaj, istemciAdres=sunucuSocket.recvfrom(4096)  // 4096 buffer boyutu, yani karşıdan alınacak bilgi miktarını  belirten rakam

if mesaj == ‘axson’ : // iletişim kesmek için kullanacagız. Sunucuyu durdurmak için

break

yeniMesaj=mesaj.upper()   // büyük harfe dönüştür

sunucuSocket.sendto(yeniMesaj,istemciAdres)

sunucuSocket.close() // döngü dışına çıktıgımızda sunucuyu kapat mesajı

print(‘Sunucu kapandı. ’)

 

Şimdi udp istemci yazıyoruz :

#!/usr/bin/python

# -*- encoding: utf-8 -*-

#ax-udp-istemci.py

from socket import *

sunucuAd = ‘localhost’

sunucuPort = 12345

istemciSocket = socket(AF_INET, SOCK_DGRAM) #datagram   // istemci soketini tanıma

mesaj = raw_input(‘Küçük harfle bir cümle yaz:’)

istemciSocket.sendto(mesaj, (sunucuAd, sunucuPort))

yeniMesaj, sunucuAdres = istemciSocket.recvfrom(4096)

print (yeniMesaj)  // burada mesaj sunucuya ulaştıysa bize büyük harf dönmesi lazım

 

Termianalde çalıştırdıgınızda aşagıdaki gibi hatalar alabilirsiniz sorun yok arayüzde çalıştırmaya çalışın, yani direk dosyadan açık hata gidecektir :

Direk buradan çalıştırın :

İstemciyi çalıştır :

(Arayüzdende çalışabildiğini görmeniz için bunu pycharmdan çalıştırdım.)

Gördüğünüz üzere sunucu ve istemciyi haberleştirdik.İstediğimiz cevabıda aldık.

Şimdi son olarak axson yazalım, yazdıgımız koda göre sunucuyu durdurmalı bu ifade :

 

Yanda açık olan sunucu kapandı .

 

 

Bu yazımızda udp server ve istemci tanımladık , haberleştirdik.Bir sonraki yazımızda tcp server ve istemci haberleştireceğiz. Beklemede kalın ..

 

 

 

http://gurmezin.com/python-ile-socket-programlama-1/

Soket Programlama(Socket Programming)

iana.org