Ağ Programlama
Ağ Programlama, C++ ile yazılım geliştirirken uygulamaların bilgisayarlar arasında veri alışverişi yapabilmesini sağlayan temel bir beceridir. C++’ta ağ programlama, yüksek performans gerektiren sunucu-istemci uygulamaları, gerçek zamanlı veri iletimi, dağıtık sistemler ve IoT projeleri gibi çeşitli senaryolarda kritik öneme sahiptir.
C++ dilinde ağ programlama yaparken, socket’ler, TCP/UDP protokolleri ve veri paketlerinin yönetimi gibi temel kavramların yanında, veri yapıları ve algoritmaların etkin kullanımı, OOP prensipleriyle güvenli ve sürdürülebilir kod yazımı önemlidir. Ayrıca bellek yönetimi ve hata yakalama konularına dikkat edilmelidir; aksi takdirde bellek sızıntıları veya veri kayıpları yaşanabilir.
Bu eğitimde, okuyucu C++ kullanarak basit bir TCP sunucusu kurmayı, istemci bağlantılarını kabul etmeyi, mesaj gönderip almayı ve hata yönetimi uygulamalarını öğrenebilecektir. Ayrıca, çoklu istemci desteği, performans optimizasyonu ve güvenlik önlemleri gibi ileri seviye konulara da değinilecektir. Bu bilgiler, C++ ile ağ tabanlı uygulamalar geliştiren yazılım mühendisleri için güçlü bir temel oluşturur ve sistem mimarisi bağlamında etkili çözümler geliştirmeyi mümkün kılar.
Temel Örnek
text\#include <iostream>
\#include <cstring>
\#include \<sys/types.h>
\#include \<sys/socket.h>
\#include \<netinet/in.h>
\#include \<unistd.h>
int main() {
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
std::cerr << "Socket oluşturulamadı" << std::endl;
return 1;
}
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(8080);
if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
std::cerr << "Bind hatası" << std::endl;
close(serverSocket);
return 1;
}
if (listen(serverSocket, 5) < 0) {
std::cerr << "Listen hatası" << std::endl;
close(serverSocket);
return 1;
}
std::cout << "Sunucu 8080 portunda çalışıyor..." << std::endl;
int clientSocket = accept(serverSocket, nullptr, nullptr);
if (clientSocket < 0) {
std::cerr << "Accept hatası" << std::endl;
close(serverSocket);
return 1;
}
const char* message = "C++ sunucusundan merhaba!\n";
send(clientSocket, message, std::strlen(message), 0);
close(clientSocket);
close(serverSocket);
return 0;
}
Bu temel örnek, bir TCP sunucusunun adım adım nasıl oluşturulduğunu göstermektedir. socket() ile iletişim noktası oluşturulur, bind() ile IP ve port atanır, listen() ile gelen bağlantılara hazır hale getirilir ve accept() ile istemciler kabul edilir. send() fonksiyonu, istemciye veri göndermeyi sağlar. close() ile socket kapatılır ve kaynaklar serbest bırakılır.
Kod, C++’ta hataların kontrol edilmesi ve kaynakların düzgün yönetilmesini sağlayan iyi uygulama örneklerini içerir. const kullanımı ile veri güvenliği sağlanmış, return değerleri kontrol edilerek hatalar yakalanmıştır. Bu örnek, ağ programlamada temel kavramları öğrenmek ve güvenli kod yazımı pratiği yapmak için uygundur.
Pratik Örnek
text\#include <iostream>
\#include <thread>
\#include <vector>
\#include <cstring>
\#include \<sys/types.h>
\#include \<sys/socket.h>
\#include \<netinet/in.h>
\#include \<unistd.h>
void handleClient(int clientSocket) {
char buffer\[1024];
std::memset(buffer, 0, sizeof(buffer));
ssize_t bytesRead = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);
if (bytesRead > 0) {
std::cout << "Mesaj alındı: " << buffer << std::endl;
const char* response = "Mesaj alındı\n";
send(clientSocket, response, std::strlen(response), 0);
}
close(clientSocket);
}
int main() {
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) return 1;
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(8080);
if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) return 1;
if (listen(serverSocket, 5) < 0) return 1;
std::vector<std::thread> threads;
while (true) {
int clientSocket = accept(serverSocket, nullptr, nullptr);
if (clientSocket >= 0) {
threads.emplace_back(std::thread(handleClient, clientSocket));
}
}
for (auto& t : threads) t.join();
close(serverSocket);
return 0;
}
Bu gelişmiş örnek, çoklu istemci desteğine sahip bir TCP sunucusu sunar. Her istemci, ayrı bir thread içinde işlenir. recv() ile güvenli veri alımı yapılır ve buffer taşmalarının önüne geçilir. std::vector kullanımı, thread yönetimini kolaylaştırır ve join() ile tüm thread’ler düzgün şekilde sonlandırılır. Bu örnek, C++’ta RAII, concurrency ve standart kütüphane kullanımı açısından iyi bir uygulamadır.
C++ ağ programlamada iyi uygulamalar, kritik fonksiyonların dönüş değerlerinin kontrolü, RAII kullanımı, bloklanmayan socket işlemleri ve etkin hata yönetimini içerir. Yaygın hatalar arasında bellek sızıntıları, hatalı hata kontrolü ve verimsiz algoritmalar bulunur. Debugging için detaylı loglama, Valgrind gibi araçlar ve hata kodu yönetimi önerilir. Performans optimizasyonu için buffer tekrar kullanımı, batch işlemleri ve non-blocking socket’ler kullanılır. Güvenlik açısından veri doğrulama, overflow önleme ve SSL/TLS kullanımı önemlidir.
📊 Referans Tablosu
C++ Element/Concept | Description | Usage Example |
---|---|---|
Socket | Ağ iletişim noktası | int sock = socket(AF_INET, SOCK_STREAM, 0); |
Bind | IP ve port atar | bind(sock, (struct sockaddr*)\&addr, sizeof(addr)); |
Listen | Sunucuyu dinlemeye hazırlar | listen(sock, 5); |
Accept | Gelen bağlantıyı kabul eder | int client = accept(sock, nullptr, nullptr); |
Send/Recv | Veri gönderir ve alır | send(client, msg, strlen(msg), 0); recv(client, buffer, 1024, 0); |
Threads | Çoklu istemci yönetimi | std::thread t(handleClient, client); |
Ağ programlama C++’ta uygulama geliştirenler için kritik bir beceridir. TCP/UDP protokolleri, concurrency, buffer yönetimi ve hata kontrolü konularında yetkinlik, güçlü ve güvenilir ağ uygulamaları üretmeyi sağlar.
İleri seviyede, Boost.Asio, SSL/TLS entegrasyonu, gelişmiş veri yapıları ve gerçek dünya projeleri (chat uygulamaları, HTTP sunucuları) çalışmaları önerilir. Bu pratikler, ağ programlama yeteneklerini geliştirip C++ ile ölçeklenebilir ve güvenli uygulamalar oluşturmayı mümkün kılar.
🧠 Bilginizi Test Edin
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek