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.
} [/CODE]
} [/CODE]
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.
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;
}
}
});
}
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?;
}
3. TCP vs UDP: Hangi Durumda Hangisi?
| Özellik | TCP | UDP |
| Bağlantı | Gerekli (Handshake) | Gerekli Değil |
| Güvenilirlik | Yüksek (Veri kaybı yok) | Düşük (Kayıp olabilir) |
| Hız | Daha Yavaş (Kontrol mekanizmaları) | Çok Hızlı |
| Rust Kütüphanesi | TcpStream, TcpListener | UdpSocket |
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.