Rust ile Ağ Programlama (TCP/UDP Sunucuları)

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Rust, düşük seviyeli kontrolü ve asenkron programlama yetenekleriyle ağ programlama için muazzam bir dildir. Özellikle Tokio kütüphanesi, Rust ekosistemini asenkron ağ uygulamaları için endüstri standartına taşımıştır.
Ağ programlamanın temelini oluşturan TCP (Bağlantı yönelimli) ve UDP (Bağlantısız) sunucularının Rust ile nasıl inşa edildiğine yakından bakalım.

1. TCP Sunucusu: Güvenilir İletişim​

TCP, verinin sırasıyla ve eksiksiz ulaştığından emin olur. Rust'ta standart kütüphane (std::net) senkron bir yapı sunarken, yüksek ölçeklenebilirlik için genellikle asenkron yapı tercih edilir.

Örnek: Asenkron TCP Echo Sunucusu​

Bu sunucu, istemciden gelen mesajı olduğu gibi geri gönderir.
Kod:
 use tokio::net::TcpListener; use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let listener = TcpListener::bind("127.0.0.1:8080").await?; println!("TCP Sunucusu 8080 portunda dinleniyor...");
[CODE]loop {
    let (mut socket, adres) = listener.accept().await?;
    println!("Yeni bağlantı: {}", adres);

    // Her bağlantı için yeni bir asenkron görev (task) başlatılır
    tokio::spawn(async move {
        let mut tampon = [0; 1024];
        loop {
            let n = match socket.read(&mut tampon).await {
                Ok(n) if n == 0 => return, // Bağlantı kapandı
                Ok(n) => n,
                Err(_) => return,
            };

            if socket.write_all(&tampon[..n]).await.is_err() {
                return;
            }
        }
    });
}
} [/CODE]

2. UDP Sunucusu: Hızlı ve Bağlantısız​

UDP, el sıkışması yapmaz ve verinin ulaşıp ulaşmadığını kontrol etmez. Bu yüzden oyun sunucuları veya canlı yayınlar gibi hızın kritik olduğu yerlerde kullanılır.

Örnek: Basit UDP Sunucusu​

Kod:
 use tokio::net::UdpSocket;
#[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let socket = UdpSocket::bind("127.0.0.1:8081").await?; let mut tampon = [0; 1024];
[CODE]println!("UDP Sunucusu 8081 portunda hazır...");

loop {
    let (boyut, adres) = socket.recv_from(&mut tampon).await?;
    println!("{} adresinden {} bayt veri geldi", adres, boyut);

    socket.send_to(&tampon[..boyut], &adres).await?;
}
} [/CODE]

3. TCP vs UDP: Hangi Durumda Hangisi?​

ÖzellikTCPUDP
BağlantıGerekli (Handshake)Gerekli Değil
GüvenilirlikYüksek (Veri kaybı yok)Düşük (Kayıp olabilir)
HızDaha Yavaş (Kontrol mekanizmaları)Çok Hızlı
Rust KütüphanesiTcpStream, TcpListenerUdpSocket

4. Asenkron Çalışma Zamanı (Tokio) Neden Gerekli?​

Geleneksel senkron ağ programlamasında, her yeni bağlantı için yeni bir işletim sistemi iş parçacığı (thread) oluşturulur. Ancak bu, binlerce bağlantıda sistemi kilitler.

Rust'ın Tokio kütüphanesi ise "M:N Scheduling" kullanarak binlerce asenkron görevi (task) çok az sayıda gerçek thread üzerinde çalıştırır. Bu da Rust sunucularının çok düşük RAM tüketimiyle devasa trafikleri yönetmesini sağlar.


5. Güvenlik: TLS/SSL Ekleme​

Ağ trafiğini şifrelemek için Rust'ta genellikle rustls kütüphanesi kullanılır. TCP soketlerinizi tokio-rustls ile sarmalayarak verilerinizi güvenli hale getirebilirsiniz.


Özet​

Rust ile ağ programlama, size donanımın tam gücünü sunarken asenkron yapı sayesinde modern web ihtiyaçlarını karşılar. TCP ile hatasız veri iletimi sağlayabilir, UDP ile yüksek performanslı veri akışları oluşturabilirsiniz.
 
Geri
Üst