Socket Programlama!

Bunjo

Uzman üye
14 Ara 2020
1,592
1,892
I Won
Tamam hocam seni daha fazla kızdırmayayım ama aynı şeyi ifade ediyoruz da farkında değilsin.
Almancayı tcp
japoncayı syn
ingilizceyi socket
Fransızcayı bağlantı tiplerindeki kriptografi vs farz et.


Yani demem şu hocam, bağlantı & iletişim & protokol ve protokoldeki kriptografilere hakim birisi masaüstü yazılımcılık, yada yazılımsal(masaüstü) hacking ile uğraşanları deler geçer. Bağlantı işlerini bilmek demek baya önde olmak demek diyorum hocam.
Kızma emi :)
Kızımıyorum dostum istediğin gibi fikrini belirtebilirsin, söylediklerimiz evet tutarlı ve benzer şeyler fakat benim ayrı olarak dikkat çekmek istediğim kısım önceki mesajda 4.satırda başlıyor. İyi geceler dilerim...
 

Çokgen

Katılımcı Üye
4 Eyl 2023
414
195

Merhaba, ben Bunjo, bu sefer "Ruby" dışında "Python" ile "socket"
kütüphanesini çalışacağız - daha sonra Ruby için de bu anlatımı yapacağım -
uzatmadan konuya girişimizi yapalım.



Nedir Bu Socket Kavramı?

Socket, bilgisayar ağlarında ve iletişim protokollerinde kullanılan bir kavramdır. Programlamada ise genellikle "socket" kelimesi, ağ üzerinden veri iletimi için kullanılan bir arayüzü ifade eder. Socket programlaması, bilgisayarlar arasında veri iletimi sağlamak için kullanılan bir API (Application Programming Interface) setini içerir.

Socket programlaması genellikle iki türde gerçekleşir: TCP (Transmission Control Protocol) ve UDP (User Datagram Protocol).


TCP (Transmission Control Protocol): Güvenilir, bağlantı odaklı bir iletişim protokolüdür.
Veri paketleri, gönderici ve alıcı arasında güvenli bir bağlantı kurularak iletilir.
TCP, veri paketlerinin sırasını korur ve paket kaybını önlemek için tekrar iletim sağlar.


UDP (User Datagram Protocol): Bağlantısız, güvenilirlik garantisi olmayan bir iletişim protokolüdür.
Veri paketleri, alıcıya doğrudan gönderilir, ancak paket kaybı veya sıralama garantisi yoktur.
UDP, özellikle hızlı veri iletimi gerektiren durumlarda tercih edilir.

Arasındaki farkı daha rahat anlamanız için:


Biraz da espriye kaçalım :)


Socket Programlaması İçerdiği Adımlar

Socket Oluşturma: İki taraftaki iletişim için birer socket oluşturulur.
Bağlantı Kurma (Opsiyonel): TCP tabanlı bir iletişimde, bağlantı kurma adımı gerçekleştirilebilir.
Veri Gönderme ve Alım: Oluşturulan socket aracılığıyla veri gönderme ve alma işlemleri gerçekleştirilir.
Bağlantı Sonlandırma (Opsiyonel): İletişim tamamlandığında, bağlantı kapatılabilir.
Genel olarak görsel yardımları ile de "
socket" kavramını anladığımıza göre şimdi işin uygulama kısmına geçelim;



Python Socket Programlama

Python'da socket kütüphanesi, ağ programlaması için kullanılan bir modüldür. Bu modül, bilgisayarlar arasında veri iletimi ve iletişimi sağlamak için kullanılır.
Socket programlaması genellikle TCP/IP protokolünü temel alır ve bir bilgisayarın belirli bir IP adresi ve port numarası üzerinden başka bir bilgisayarla iletişim kurmasına olanak tanır.


Socket Türleri:


socket.AF_INET: IPv4 adres türü.
socket.AF_INET6: IPv6 adres türü.
socket.SOCK_STREAM: TCP bağlantıları için.
socket.SOCK_DGRAM: UDP bağlantıları için.
Diğer türler: socket.SOCK_RAW, socket.SOCK_RDM, socket.SOCK_SEQPACKET, vb.


Metodlar:
socket.bind(address): Bir adresi sokete bağlar.
socket.listen(backlog): Bağlantıları bekler ve kuyruğa ekler.
socket.accept(): Bağlantıyı kabul eder.
socket.connect(address): Bir adrese bağlanır.
socket.send(data): Veriyi gönderir.
socket.recv(bufsize): Belirtilen miktarda veri alır.
socket.close(): Soketi kapatır.

Diğer Özellikler:

socket.setsockopt(level, optname, value): Soket seçeneklerini ayarlar.
socket.getsockopt(level, optname[, buflen]): Soket seçeneklerini alır.
socket.settimeout(timeout): Soket zaman aşımını belirler.
socket.gettimeout(): Soket zaman aşımını alır.
socket.setblocking(flag): Bloklayıcı modu ayarlar.
socket.makefile(mode[, buffering]): Bir soket nesnesini dosya benzeri bir nesneye dönüştürür.

IPv6 Desteği:

IPv6 adres türü (socket.AF_INET6) ile IPv6 ağlarına bağlanma ve hizmet verme.

Broadcast ve Multicast Desteği:

Broadcast iletişim için kullanılabilir.
Multicast gruplarına katılma ve onlardan ayrılma.

Secured Socket Layer (SSL) Desteği:

ssl modülü ile birlikte kullanarak şifreli iletişim sağlar.

Asenkron İşlemler:

asyncio kütüphanesi ile birlikte kullanılarak asenkron (non-blocking) soket işlemleri yapabilirsiniz.

Raw Soketler:

socket.SOCK_RAW kullanarak ağ katmanında direkt kontrol sağlayabilirsiniz.


Temel İşlemler

Server (Sunucu) Oluşturma:


Sunucu oluşturmak için bir soket (socket) nesnesi yaratılır ve bir IP adresi ve port numarası atanır. Ardından bind ve listen metodları kullanılarak bağlantıları dinlemeye başlar.

Not: her kodda "import" ile "socket" kütüphanesini "import socket" ile içeriye aktarmanız gerekecektir.

Python:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 12345)

server_socket.bind(server_address)
server_socket.listen(5)  # En fazla 5 bekleyen bağlantıyı kabul et

print("Server listening on {}:{}".format(*server_address))

Client (İstemci) Bağlantısı:
İstemci, sunucuyla bağlantı kurmak için connect metodunu kullanır.
Python:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 12345)

client_socket.connect(server_address)

Veri Gönderme ve Alımı:

"send" ve "recv" metodları kullanılarak veri gönderilebilir ve alınabilir.
Python:
# Sunucu tarafında
connection, client_address = server_socket.accept()
data = connection.recv(1024)  # 1024 byte'lık veri al

# İstemci tarafında
client_socket.send(b"Hello, server! How are you?")
Bağlantı Kapatma:
close metodunu kullanarak bağlantıları kapatabilirsiniz.
Python:
# Sunucu ve istemci tarafında
connection.close()
server_socket.close()
client_socket.close()

Socket Serveri:
Python:
import socket
import threading

# Sunucu ayarları
SERVER_HOST = 'localhost'
SERVER_PORT = 12345

def handle_client(client_socket):
    try:
        # İstemciden gelen veriyi al
        data = client_socket.recv(1024)
        print("Received from {}: {}".format(client_socket.getpeername(), data.decode()))

        # İstemciye hoşgeldin mesajını gönder
        welcome_message = "Welcome to the server!"
        client_socket.send(welcome_message.encode())
    finally:
        # Bağlantıyı kapat
        client_socket.close()

def start_server():
    # IPv4 ve TCP kullanarak bir soket oluştur
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
    try:
        # Soketi belirtilen IP ve port numarasına bağla
        server_socket.bind((SERVER_HOST, SERVER_PORT))
        # Bağlantıları dinlemeye başla
        server_socket.listen(5)
        print("Server listening on {}:{}".format(SERVER_HOST, SERVER_PORT))

        while True:
            # Bağlantıyı kabul et
            client_socket, client_address = server_socket.accept()
            print("Accepted connection from {}:{}".format(*client_address))

            # İstemci için yeni bir iş parçacığı oluştur
            client_handler = threading.Thread(target=handle_client, args=(client_socket,))
            client_handler.start()

    except KeyboardInterrupt:
        print("Server shutting down.")
    finally:
        # Soketi kapat
        server_socket.close()

if __name__ == "__main__":
    start_server()
Socket İstemcisi:
Python:
import socket

# Sunucu ayarları
SERVER_HOST = 'localhost'
SERVER_PORT = 12345

# İstemci soketi oluştur
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    # Sunucuya bağlan
    client_socket.connect((SERVER_HOST, SERVER_PORT))
 
    # Sunucudan hoşgeldin mesajını al
    welcome_message = client_socket.recv(1024)
    print("Received from server: {}".format(welcome_message.decode()))

    # İstemci olarak sunucuya bir mesaj gönder
    message_to_send = "Hello, server! I'm the client."
    client_socket.send(message_to_send.encode())
finally:
    # İstemci soketini kapat
    client_socket.close()

Python gibi birçok programlama dilinde socket programlaması için hazır kütüphaneler bulunmaktadır.
Örneğin, Python'da socket modülü, bu tür iletişim işlemlerini gerçekleştirmek için kullanılır fakat alternatif kütüphaneler ve örnek kodlara da
bakmak isterseniz onlardan da bahsedeyim.


Twisted

Twisted, asenkron ağ programlaması için kapsamlı bir kütüphanedir.
TCP, UDP, SSL gibi protokollerle çalışabilir.
Hem server hem de client uygulamaları oluşturmak için kullanılabilir.

Python:
from twisted.internet import reactor, protocol

class MyProtocol(protocol.Protocol):
    def connectionMade(self):
        self.transport.write(b"Merhaba, dünya!")

class MyFactory(protocol.Factory):
    def buildProtocol(self, addr):
        return MyProtocol()

reactor.listenTCP(12345, MyFactory())
reactor.run()

Tornado



Tornado, web uygulamaları için geliştirilmiş bir framework olmasına rağmen,
aynı zamanda asenkron ağ programlaması için kullanılabilir. WebSocket desteği bulunur.
Tornado genellikle web uygulamalarında kullanılsa da, genel ağ programlama ihtiyaçları için de kullanılabilir.


Python:
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Merhaba, dünya!")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(12345)
    tornado.ioloop.IOLoop.current().start()
ZeroMQ


ZeroMQ, hafif ve yüksek performanslı bir mesajlaşma kütüphanesidir.
Çoklu dil desteği sunar ve birçok farklı iletişim modelini destekler.
Sisteminizde ZeroMQ yüklü değilse, önce pip install pyzmq ile kütüphaneyi yükleyebilirsiniz.



Python:
import zmq

context = zmq.Context()

# PUB-SUB örneği
publisher = context.socket(zmq.PUB)
publisher.bind("tcp://127.0.0.1:12345")

# Veri gönderme
publisher.send(b"Merhaba, dünya!")

Uzun bir vaktimi aldı hazırlamak bunun karşılığında konuyu beğenmeyi ve
güzel bir mesaj atmayı unutmayalım :)

okuyan herekese teşekkürlerimi sunuyourum 🌹 💘

sorulara açığım ve gözümden kaçan bir şey olduysa söyleyebilirsiniz :)


bu günlük de benden bu kadar olsun :)
Ellerine ssğlık Bunjo Hocam yine harika yararlı bir konu, yeni başlayanların direkt okuması lazım.
 

BlackDynamite

Katılımcı Üye
7 Kas 2023
843
330
Herhangi bir yanlış anlama olmaz, dilediğiniz soruyu sorabilirsiniz.

1024 byte yerine 2048 alırsanız, daha büyük bir veri boyutu (clientten alım ve geri aktarım) elde etmiş olursunuz. Kısacası, ben ufak bir sunucu örneği yaptığım için 1024 byte kullandım. Daha fazla byte değeri kullanmak ağınızı zorlayabilir; diğer büyük sunucular, örneğin "Google," gibi daha fazla veri kullanır.
peki byte yükseldi farzet port tıkanması yasanılırmı yani bağlantı kısaca gelmeme durumu olurmu
 

Bunjo

Uzman üye
14 Ara 2020
1,592
1,892
I Won
peki byte yükseldi farzet port tıkanması yasanılırmı yani bağlantı kısaca gelmeme durumu olurmu
"Byte yükselmesi" ifadesi hiçbir anlam ifade etmiyor. 1024 byte dinlenirken gelen 1024 byte den fazla veriyi mi kastediyorsunuz? 1024 byte veriden fazla dinleme olayını mı? yoksa diğer kota aşımları mı?
 
Son düzenleme:

BlackDynamite

Katılımcı Üye
7 Kas 2023
843
330
"Byte yükselmesi" ifadesi hiçbir anlam ifade etmiyor. 1024 byte dinlenirken gelen 1024 byte den fazla veriyi mi kastediyorsunuz? 1024 byte veriden fazla dinleme olayını mı? yoksa diğer kota aşımları mı?
tcp portun bir veri kapsitesi varmı yoksa her boyutu geçirirmi tıkanma yasanırmı portta
 

Bunjo

Uzman üye
14 Ara 2020
1,592
1,892
I Won
tcp portun bir veri kapsitesi varmı yoksa her boyutu geçirirmi tıkanma yasanırmı portta
TCP portlarının kapasitesi, kullanılan ağ altyapısına ve donanımına, bağlantının hızına ve bant genişliğine bağlıdır. "port tıkanması" yerine "bağlantı tıkanması" termini kullanmamız daha doğru olur. Yüksek veri akışı, bant genişliği, bağlantı kalitesi, ağ yapılandırması gibi gibi faktörlere bağlıdır, direkt olarak TCP protokollerinde çalışan portlara tanımlanan bir "maximum byte" boyutu diye bir kavram yoktur, kısacası bağlantınıza ve saydığım etkenlere bağlı olarak gerçekleşebilir veya gerçekleşmeyebilir.
 
Ü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.