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/
iana.org
Yorum Yazın!