Network Programming

Python’da Soket Zaman Aşım Sürelerini Etkin Bir Şekilde Kullanma

Spread the love

Ağ programlama genellikle bağlantıları beklemeyi içerir; bu süreç, zaman aşımı uygulanarak önemli ölçüde iyileştirilebilir. Bu, süresiz engellemeyi önler ve uygulamalarınızın sağlamlığını artırır. Bu makale, Python soket kabul işlemlerinizde zaman aşımını etkili bir şekilde yönetmenize rehberlik edecektir.

İçindekiler

Soket Kabul, Reddetme ve Zaman Aşımı

Bir sunucu socket.listen() kullanarak bağlantıları dinlediğinde, socket.accept() bir istemci bağlanana kadar bloke olur. Bu bloke edici davranış sorunlu olabilir. Zaman aşımı, belirli bir zaman dilimi içinde bağlantı gelmezse sunucunun devam etmesini sağlar. Tersine, bağlantının reddedilmesi, bir bağlantı kurulduktan sonra ancak istenmeyen (örneğin, kimlik doğrulama başarısızlığı) olarak değerlendirildikten sonra gerçekleşir. Bu, bir bağlantının *yokluğunu* ele alan zaman aşımından farklıdır.

Python’da Önemli Soket Metotları

Bağlantıları ve zaman aşımını işlemek için birkaç soket metodu hayati önem taşır:

  • socket.socket(): Bir soket nesnesi oluşturur. Adres ailesini (örneğin, IPv4 için socket.AF_INET) ve soket türünü (örneğin, TCP için socket.SOCK_STREAM) belirtin.
  • socket.bind(): Soketi bir adrese ve porta bağlar.
  • socket.listen(): Gelen bağlantıları dinlemeye başlar. Bağlantı noktası (en fazla kuyrukta bekleyen bağlantı) belirtir.
  • socket.accept(): Bir bağlantıyı kabul eder. İletişim için yeni bir soket ve istemcinin adresini döndürür. Zaman aşımı burada uygulanır.
  • socket.settimeout(): Soket işlemleri için bir zaman aşımı (saniye cinsinden) ayarlar. 0 zaman aşımını devre dışı bırakır; None varsayılan bloke edici davranışı geri yükler.
  • socket.close(): Soketi kapatır.

Soket Kabul Zaman Aşımı Uygulama

Bu örnek, socket.accept() üzerinde bir zaman aşımını göstermektedir:


import socket

def accept_with_timeout(sock, timeout_sec):
    sock.settimeout(timeout_sec)
    try:
        conn, addr = sock.accept()
        print(f"{addr} adresinden bağlantı kabul edildi.")
        return conn, addr
    except socket.timeout:
        print("Kabul zaman aşımı oluştu.")
        return None, None
    except Exception as e:
        print(f"Bir hata oluştu: {e}")
        return None, None

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 8080)) 
server_socket.listen(1)

connection, address = accept_with_timeout(server_socket, 5)

if connection:
    connection.close()

server_socket.close()

Bu kod, 5 saniye içinde bir bağlantı kabul etmeye çalışır. Bağlantı gelmezse bir socket.timeout hatası yakalanır ve None döndürülür. Aksi takdirde, yeni soketi ve istemci adresini döndürür.

Verimli Zaman Aşımı Yönetimi

socket.settimeout() belirli bir soket işlemine bir zaman aşımı uygularken, genel bir varsayılan yoktur. Her soket için bireysel zaman aşımı ayarı gerekir. Bununla birlikte, bir sarmalayıcı sınıf bunu daha verimli bir şekilde yönetebilir:


import socket

class TimeoutSocket:
    def __init__(self, address, port, timeout):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.settimeout(timeout)
        self.sock.bind((address, port))
        self.sock.listen(1)

    def accept(self):
        try:
            return self.sock.accept()
        except socket.timeout:
            return None, None
        except Exception as e:
            print(f"Bir hata oluştu: {e}")
            return None, None

    def close(self):
        self.sock.close()

# Örnek kullanım:
server = TimeoutSocket('127.0.0.1', 8081, 2) 
conn, addr = server.accept()
server.close()

TimeoutSocket sınıfı, soket oluşturmayı ve zaman aşımı ayarını kapsular, birden fazla soket arasında tutarlı zaman aşımı yönetimini teşvik eder.

Sonuç

Python soket kabul işlemlerinizde zaman aşımı uygulamak, sağlam ağ uygulamaları oluşturmak için çok önemlidir. socket.settimeout() süresiz engellemeyi önler ve bağlantı hatalarının nazikçe ele alınmasını sağlar. Çökmeleri önlemek için her zaman socket.timeout gibi istisnaları ele alın. Bir sarmalayıcı sınıf kullanmak, büyük projelerde zaman aşımı yönetimini iyileştirir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir