TCP sunucu
- C++ kursu
- İleri seviye
- Ders 57/83
- 5 dk
TCP sunucu yazmayı öğrenirsin.
TCP sunucu nedir?
Bir TCP sunucu (server), gelen bağlantıları bekleyen taraftır. Soket oluşturduktan sonra bind() ile bir porta bağlar, listen() ile bağlantı beklemeye başlar ve accept() ile gelen bağlantıyı kabul eder.
Örnek: bind(sock, (sockaddr*)&addr, sizeof(addr)); soketi adrese bağlar. listen(sock, 5); bağlantı kuyruğunu açar (5 bekleyen bağlantı). int client = accept(sock, nullptr, nullptr); bir istemci bağlantısı kabul eder ve yeni bir soket döndürür. Sunucu adresinde addr.sin_addr.s_addr = INADDR_ANY; kullanırsan sunucu tüm ağ arayüzlerinden bağlantı kabul eder.
listen ve accept
listen(sock, backlog) soketi pasif duruma geçirir: bağlantı kabul etmeye hazır hale gelir. backlog bekleme kuyruğunun uzunluğudur. accept(sock, ...) bir istemci bağlantısı gelene kadar bekler (engelleyici, blocking) ve o bağlantı için yeni bir soket döndürür.
Örnek: listen(sock, 5); ile en fazla 5 bağlantı kuyrukta bekler. int client = accept(sock, nullptr, nullptr); bir istemci bağlandığında yeni bir soket verir. Bu yeni soket send ve recv için kullanılır; ana soket yalnızca yeni bağlantı kabul etmeye devam eder. Sunucu genelde bir döngüde sürekli accept çağırır. Bu derste döngü olmadan temel akışı göreceğiz.
Uygulama TCP sunucu kur
#include <sys/socket.h> ve #include <netinet/in.h> ekle. int sock = socket(AF_INET, SOCK_STREAM, 0); ile soket oluştur. sockaddr_in addr; tanımla; addr.sin_family = AF_INET;, addr.sin_port = htons(8080);, addr.sin_addr.s_addr = INADDR_ANY; ata. bind(sock, (sockaddr*)&addr, sizeof(addr)); ve listen(sock, 5); çağır. std::cout << "Sunucu hazır"; yaz.
Başlangıç kodu
#include <iostream>
// Soket başlıklarını ekle, sunucu kur
int main() {
// socket, bind ve listen çağrılarını ekle
return 0;
}Örnek çözüm
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.s_addr = INADDR_ANY;
bind(sock, (sockaddr*)&addr, sizeof(addr));
listen(sock, 5);
std::cout << "Sunucu hazır";
return 0;
}Beklenen çıktı
Sunucu hazır
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 bind çağrısını tamamla
____(sock, (sockaddr*)&addr, sizeof(addr));
bind(sock, (sockaddr*)&addr, sizeof(addr));
Açıklama: bind, soketi bir porta bağlar.
2 Parçayı rolüne eşle
| Kavram | Anlamı |
|---|---|
bind(sock, ...) |
Porta bağlar |
listen(sock, 5) |
Bağlantı bekler |
accept(sock, ...) |
İstemci kabul eder |
INADDR_ANY |
Tüm arayüzler |
3 accept ne döndürür?
- Yeni bir istemci soketi Doğru cevap
- Bağlantı durum kodu
- Port numarası
- IP adresi
Açıklama: accept, istemci için yeni bir soket döndürür.