Giriş: ConnectionAbortedError Nedir?
ConnectionAbortedError
, Python'da bir ağ bağlantısının karşı taraf tarafından aniden kesilmesi durumunda ortaya çıkan bir istisna (exception) türüdür. Bu hata, genellikle:
✔ Socket programlamada
✔ HTTP istemci/sunucu uygulamalarında
✔ Veritabanı bağlantılarında
✔ Uzun süreli ağ işlemlerinde
görülür. Bu makalede, ConnectionAbortedError
'ın nedenlerini, çözüm yöntemlerini ve en iyi uygulamaları detaylıca inceleyeceğiz.
1. ConnectionAbortedError Ne Zaman Oluşur?
ConnectionAbortedError
, bir ağ bağlantısı aktifken karşı tarafın bağlantıyı beklenmedik şekilde kapatması durumunda oluşur. Hata kodu ECONNABORTED (errno 103) ile ilişkilidir.
Örnek: Temel ConnectionAbortedError Senaryosu
import socket # Sunucu tarafı def server(): s = socket.socket() s.bind(('localhost', 1234)) s.listen(1) conn, _ = s.accept() conn.close() # Bağlantıyı hemen kapat # İstemci tarafı def client(): s = socket.socket() s.connect(('localhost', 1234)) try: s.send(b'Merhaba') # ConnectionAbortedError! except ConnectionAbortedError as e: print(f"Hata: {e}") # Test import threading threading.Thread(target=server).start() threading.Thread(target=client).start()
Çıktı:
Hata: [Errno 103] Software caused connection abort
2. ConnectionAbortedError'ın Yaygın Nedenleri
a) Karşı Tarafın Bağlantıyı Kapatması
Sunucu veya istemci bağlantıyı erken sonlandırırsa
Firewall/antivirüs yazılımları bağlantıyı keserse
b) Zaman Aşımı (Timeout) Sonrası Kesilme
s = socket.socket() s.settimeout(5.0) # 5 saniye timeout try: s.connect(('example.com', 80)) s.send(b'GET / HTTP/1.1\r\n\r\n') data = s.recv(1024) # Timeout sonrası ConnectionAbortedError except socket.timeout: print("Zaman aşımı") except ConnectionAbortedError: print("Bağlantı kesildi")
c) İşletim Sistemi Kaynak Kısıtlamaları
Sistem çağrılarının (system calls) kesilmesi
Ağ bağdaştırıcısı sorunları
3. ConnectionAbortedError Nasıl Çözülür?
a) Yeniden Bağlanma Mekanizması
import time def reliable_send(sock, data, max_retries=3): for attempt in range(max_retries): try: return sock.send(data) except ConnectionAbortedError: if attempt == max_retries - 1: raise print(f"Yeniden bağlanılıyor ({attempt+1}/{max_retries})") time.sleep(1) sock.connect(sock.getpeername()) # Yeniden bağlan
b) Bağlantı Durumunu Kontrol Etme
def safe_send(sock, data): try: # Bağlantı kontrolü sock.getpeername() # Bağlı değilse hata verir return sock.send(data) except (ConnectionAbortedError, OSError): print("Bağlantı kesildi, yeni bağlantı kuruluyor") sock.connect(('example.com', 80)) return sock.send(data)
c) Context Manager ile Güvenli Bağlantı
class ManagedConnection: def __init__(self, host, port): self.host = host self.port = port self.sock = socket.socket() def __enter__(self): self.sock.connect((self.host, self.port)) return self.sock def __exit__(self, exc_type, exc_val, exc_tb): self.sock.close() if isinstance(exc_val, ConnectionAbortedError): print("Bağlantı hatası loglandı") return True # Hatayı bastır # Kullanım with ManagedConnection('example.com', 80) as conn: conn.send(b'GET / HTTP/1.1\r\n\r\n')
4. Gerçek Dünya Senaryoları ve Çözümleri
a) HTTP İstemcisinde Bağlantı Yönetimi
import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry # Yeniden deneme stratejisi retry_strategy = Retry( total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504], allowed_methods=["GET", "POST"] ) # Oturum oluşturma session = requests.Session() adapter = HTTPAdapter(max_retries=retry_strategy) session.mount("http://", adapter) session.mount("https://", adapter) try: response = session.get("http://example.com", timeout=5) except requests.exceptions.ConnectionError as e: print(f"Bağlantı hatası: {e}")
b) WebSocket Bağlantılarında Yeniden Bağlanma
import websockets import asyncio async def websocket_client(): retry_count = 0 max_retries = 3 while retry_count < max_retries: try: async with websockets.connect('ws://example.com') as ws: await ws.send("Merhaba") response = await ws.recv() print(response) break except ConnectionAbortedError: retry_count += 1 print(f"Yeniden bağlanılıyor ({retry_count}/{max_retries})") await asyncio.sleep(2 ** retry_count) # Üstel bekleyiş else: print("Maksimum yeniden deneme sayısı aşıldı")
5. Performans ve Güvenlik İpuçları
✔ Bağlantı havuzu (connection pool) kullanarak performansı artırın
✔ Üstel geri çekilme (exponential backoff) ile yeniden deneme yapın
✔ TLS/SSL sertifikalarını doğrulayarak güvenliği sağlayın
✔ Bağlantı zaman aşımlarını (timeout) mutlaka ayarlayın
Örnek: Güvenli Socket Bağlantısı
import ssl def create_secure_connection(host, port): context = ssl.create_default_context() context.check_hostname = True context.verify_mode = ssl.CERT_REQUIRED sock = socket.socket() secure_sock = context.wrap_socket(sock, server_hostname=host) secure_sock.settimeout(10.0) # 10 saniye timeout try: secure_sock.connect((host, port)) return secure_sock except (ConnectionAbortedError, ssl.SSLError) as e: secure_sock.close() raise ConnectionError(f"Güvenli bağlantı kurulamadı: {e}")
Sonuç
✅ ConnectionAbortedError
, ağ bağlantılarının beklenmedik kesilmesinde oluşur
✅ Yeniden bağlanma mekanizmaları ile hataya dirençli uygulamalar geliştirilebilir
✅ Context manager'lar kaynak yönetimini kolaylaştırır
✅ Üretim ortamlarında mutlaka timeout ve SSL ayarları yapılmalıdır
Sık Sorulan Sorular (SSS)
❓ ConnectionAbortedError ile ConnectionResetError arasındaki fark nedir?
ConnectionAbortedError
: Bağlantı yerel sistemde kesildi (ECONNABORTED)ConnectionResetError
: Karşı taraf bağlantıyı sıfırladı (ECONNRESET)
❓ Yeniden deneme sayısı ne olmalıdır?
Genellikle 3-5 arası uygundur, çok fazla deneme servis saldırısı (DoS) gibi algılanabilir
❓ Hangi Python sürümlerinde bulunur?
Python 3.3+ ile standart kütüphanede mevcuttur
Özet Tablo
Yöntem | Avantajlar | Dezavantajlar |
---|---|---|
Yeniden bağlanma | Otomatik kurtarma | Sonsuz döngü riski |
Connection Pool | Performans artışı | Karmaşık yapılandırma |
Üstel Bekleyiş | Sunucuyu aşırı yüklemez | Kullanıcı deneyimini etkiler |