python3 socket

isimsiz456

Üye
21 Ağu 2016
125
0
Selamun aleyküm

----------------------------------------------------------------------------------------------------------------
Arkadaşlar bugün Python ile farklı bir alana değinmek istiyorum. Python çok yönlü bir dil ve biz Python ile soket programlama da yapabiliyoruz. Nedir soket programlama , en basit tabirle network programlamadır arkadaşlar , iki sistem arasında haberleşme, veri alışverişi kontrollerini programlama dersek çok yanlış olmaz.

En temel olarak bir server betiği , bir de client betiği yazarak başlayacağız arkadaşlar.
Pythonda soket programlama yapmak için gerekli kütüphanemiz , “socket”.

İlk olarak server betiğini yazmakla başlayalım. Bunu en basit olarak web serverlarını düşünebilirsiniz arkadaşlar. Tarayıcınızı açtınız , Cyber-Warrior Information Technology's World yazdınız. Sunucu otomatik olarak sizi sitemizin dosyalarının oldugu makineye yönlendiriyor. Tabi ki tam olarak böyle değil ama ben sadece kafanızda bir şablon oluşması için şekillendirmek için böyle söylüyorum. Şimdi bu yönlendiğimiz makine aslında bizi kapıda bekliyor. Siz linke tıkladığınız anda sizi içeri davet ediyor. İşte ilk olarak biz kapıda bekleyen o programı yazmaya çalışacağız.

Tabi ki ilk olarak “socket” kütüphanesini import edeceğiz.

Kod:
----------------------------
import socket
---------------------

Pythonda socket programlamaya başlamak için bir socket nesnesine ihtiyacınız vardır arkadaşlar. Hemen bunu nasıl oluşturacağımızı görelim.

Kod:
----------------------------------------------------------------------------
import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
-------------------------------------------------------------------------------

Şimdi karmaşık gibi geliyor olabilir. Hani dedik ya bizi kapıda bekleyen biri var. O sizi görür görmez içeriye almayacaktır tabi ki , arada belli protokoller olmak zorunda. Burada argüman olarak verdiğimiz AF_INET , SOCK_STREAM gibi ifadeler aslında bu protokollerdir arkadaşlar. Bağlantımız sırasında hangi protokolü kullanacağımızı burada belirliyoruz. Bunları internette araştırarak daha ayrıntılı bilgi alabilirsiniz. Şu an konuyu çok saptırmadan devam etmeye çalışıyorum. Şimdi bir nesneye sahibiz. Bu nesne ile server oluşturacağız.
Server oluşturmak için bir makineye ihtiyacımız var , biz bu makineyi “localhost” , yani betiği yazmış olduğumuz makine olarak seçelim. Şimdi misafiri için evimiz var ama kapımız yok , kapımız ise portumuz olacak arkadaşlar. Herhangi bir port numarası uydurabilirsiniz , ancak 4 haneli rakam seçmeniz , sık kullanılan port numaralarıyla karışmaması açısından daha elverişli olacaktır. Makineyi localhost , port numarasını ise 8000 olarak seçtim ben.

Kod:
-------------------------------------------------------------------------
import socket

soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000
------------------------------------------------------------------------------

Hala bunun bir servera benzer tarafı yok , client da yazıcak olsak aynı şekilde başlayacaktık. Gelin bunu bir server haline getirelim artık. Bir makine ve o makine de bir port oluşturmak için “bind” methodu kullanılır arkadaşlar.

Kod:
--------------------------------------------------------
import socket

soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)
--------------------------------------------------------------

Burada lütfen parantezlere dikkat edin arkadaşlar. Şimdi bind methodu ile bir makine oluşturduk ve bir port açtık. Sıra geldi misafir beklemeye. Bunun içinde listen methodunu kullanıyoruz arkadaşlar.

Kod:
------------------------------------------------------------------------
import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)
print “Kullanıcı bekleniyor.”
soket.listen(1)
--------------------------------------------------------------------------

Burada listen içerisine verilen argüman , kaç tane misafirin kuyrukta bekleyeceğini belirliyor diyebiliriz. Şimdilik tek misafir için çalıştığımızdan bunu 1 olarak yazdım ben. Ayrıca programı bu şekilde çalıştırdığınızda program listen methodunu gördüğü anda beklemeye başlıcaktır arkadaşlar. Tıpkı input() methodunu yazdığınızda klavyeden entera basmanızı beklediği gibi. Bunun anlamı serverın kullanıcıyı içeriye almaya hazır olduğudur. Diyelim ki bir misafir geldi kapımızı çaldı. Şimdi bağlantıyı kabul edip , misafiri tanımlamalıyız.

Kod:
-------------------------------------------------------------------------------
import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)
print “Kullanıcı bekleniyor.”
soket.listen(1)

baglanti,adres = soket.accept()
print “Bir bağlantı kabul edildi.”,adres
--------------------------------------------------------------------------------

Evet şimdi accept methodu çıktı karşımıza. Şimdiye kadar kullandığımız bütün methodlar zaten ingilizce ,accept ise burada onaylamak anlamında ve gerçekten ne işe yaradığını ele verir nitelikte. Şimdi accept methodu bir tüp döndürür arkadaşlar. Bu tüpün birinci elemanı bağlantı nesnesini – daha sonra veri alışverişi yapmamızı sağlayan nesne- , ikinci eleman ise , kapımıza gelen misafirin kim olduğunu saklar.

Bağlantıyı aldık madem, eve gelen misafire ilk söylenen şey nedir ?

“Hoşgeldiniz efendim , hoşgeldiniz.”

Hemen söyleyelim.

Kod:
-------------------------------------------------------------------------------------------
import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)
print “Kullanıcı bekleniyor.”
soket.listen(1)

baglanti,adres = soket.accept()
print “Bir bağlantı kabul edildi.”,adres

baglanti.send(“Hoşgeldiniz efendim , hoşgeldiniz.”)
----------------------------------------------------------------------------

Artık burada send methodunun ne işe yaradığını söylemek ayıp olur diye düşünüyorum. Herşey basit değil mi ?

Şimdi biz hoşgeldiniz dediysek , onlarda bir cevap verecektir. Verdikleri cevabı almamızı sağlayan method ise , recv() methodu. Hemen görelim.

Kod:
-----------------------------------------------------------------------------
import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)
print “Kullanıcı bekleniyor.”
soket.listen(1)

baglanti,adres = soket.accept()
print “Bir bağlantı kabul edildi.”, adres

baglanti.send(“Hoşgeldiniz efendim , hoşgeldiniz.”)

data = baglanti.recv(1024)
print data
-----------------------------------------------------------------------

Burada recv methoduna verdiğimiz 1024 argümanı , veri büyüklükleriyle ilgili bir durumdur. Şimdilik kafanıza takmanıza gerek yok. Bu konuda daha ileri seviye programlar yazmak isterseniz araştırabilirsiniz.

Şimdi misafir geldi , ağırladık ettik derken uğurlamamız gerek. Bunun içinde close methodunu kullanabilirsiniz arkadaşlar. Basit olarak;

Kod:
--------------------------------------------------------------------------
server.py
###############################################################

import socket
soket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.bind((HOST,PORT))
print “%s:%d server başlatıldı.” % (HOST,PORT)
print “Kullanıcı bekleniyor.”
soket.listen(1)

baglanti,adres = soket.accept()
print “Bir bağlantı kabul edildi.”, adres

baglanti.send(“Hoşgeldiniz efendim , hoşgeldiniz.”)

data = baglanti.recv(1024)
print data

soket.close()
------------------------------------------------------------------------------------------------

şeklinde yazabilirsiniz.

İşin sunucu / server tarafını kafanızda birşeyler oluşsun diye böyle anlatmak istedim. Client kısmını daha rahat anlayabilirsiniz şimdi.

Kod:
--------------------------------------------------------------------------------------------
client.py
#######################################

import socket

soket = soket.socket(socket.AF_INET,socket.SOCK_STREAM)

HOST = “localhost”
PORT = 8000

soket.connect((HOST,PORT))

data = soket.recv(1024)

print data

soket.send(“Hoşbulduk!!”)

soket.close()
---------------------------------------------------------------------------------

Kodların gerçekten anlaşılır olduğunu düşünüyorum. Ancak yine de üstünden geçelim. İlk olarak yine bir soket nesnesi oluşturduk ve server bilgilerimizi girdik. Burada server bilgilerinin her iki betikte de aynı olması gerekmektedir. Daha sonra bu server bilgilerini ve soket nesnesini kullanarak , connect methodu yardımıyla servera bağlanmak istedim. Ve serverdan gelen veriyi recv methodu ile alıp data isimli değişkene atadım. Bu değişkeni ekrana yazdırıp , aynı şekilde send methodu ile bir cevap yolladım.

Elimizde iki ayrı program oldu. Bunlardan birisi server öteki client. Öncelikle serverımızı çalıştırıp hazır hale getiriyoruz. server.py listen komutunu çalıştırdığında kendini beklemeye alacaktır. O öyle çalışır durumdayken, biz client.py betiğini çalıştırıyoruz ve yaptığımız işleri gözlemliyoruz.

Host bilgilerini 192.168.2.x şeklinde ayarlayarak isterseniz aynı modem üzerindeki iki ayrı makinede bunu deneyebilirsiniz. İlerde zaman olursa socket methodu ile sürekli bir iletişimi nasıl başlatabiliriz. Çünkü burda sadece bir mesaj yolladık ve bağlantıyı kapadık. İlerde sürekli bir iletişim yapabiliriz, hatta makine üzerinde bir backdoor yazabiliriz, bu backdooru virüs programlarını görmediği bir exe dosyası haline nasıl getiririz bunları göstermeye çalışırım.
server-client ilişkisi bu şekilde arkadaşlar.

NOT : konu alıntıdır gerçek sahitleri ise https://yazilimsevdasi.com/python-ile-soket-programlama/ burasıdır
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.