0Pricing
C Academy · Ders

TCP Sunucusu

Bağlantıları kabul edin

TCP Sunucusu, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.

TCP Sunucusu Oluşturma

Bir TCP sunucusu istemcileri bekler ve onların bağlantılarını kabul eder. Yaşam döngüsü şöyledir: bir soket oluşturun, onu bir bağlantı noktasına bağlayın, dinleyin ve ardından bir döngü içinde bağlantıları kabul edin.

1. Adım: Soketi Oluşturma

IPv4 TCP için akış soketi oluşturun. Negatif bir sonuç başarısızlık anlamına gelir.

#include <sys/socket.h>
#include <stdio.h>

int make_server_socket(void) {
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) { perror("socket"); }
    return fd;
}

2. Adım: Adresin Yeniden Kullanılmasına İzin Verme

Varsayılan olarak bir bağlantı noktası, sunucu durduktan sonra TIME_WAIT durumunda bir süre kalır ve yeniden başlatmaları engeller. setsockopt ile SO_REUSEADDR ayarını yaparak hemen yeniden bağlanabilirsiniz.

#include <sys/socket.h>

void allow_reuse(int fd) {
    int yes = 1;
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
}

3. Adım: Bir Bağlantı Noktasına Bağlanma

bind(), soketi yerel bir adrese ve bağlantı noktasına bağlar. INADDR_ANY, tüm ağ arayüzlerinde dinleme yapılmasını sağlar.

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int bind_port(int fd, unsigned short port) {
    struct sockaddr_in addr = {0};
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(port);
    if (bind(fd, (struct sockaddr *)&addr, sizeof addr) < 0) {
        perror("bind"); return -1;
    }
    return 0;
}

4. Adım: Dinleme

listen(), soketi pasif olarak işaretler (bağlantı kabul etmeye hazır hâle getirir). backlog bağımsız değişkeni, çekirdeğin sıraya alabileceği bekleyen bağlantı sayısını belirler.

#include <sys/socket.h>
#include <stdio.h>

int start_listen(int fd) {
    if (listen(fd, 16) < 0) { /* backlog of 16 */
        perror("listen"); return -1;
    }
    return 0;
}

5. Adım: Bağlantıları Kabul Etme

accept(), bir istemci bağlanana kadar bekler ve ardından o istemci için yeni bir soket döndürür. Özgün soket dinlemeye devam eder.

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int accept_one(int listen_fd) {
    struct sockaddr_in cli;
    socklen_t len = sizeof cli;
    int conn = accept(listen_fd, (struct sockaddr *)&cli, &len);
    if (conn < 0) perror("accept");
    return conn;
}

İki Soket, İki Rol

accept işleminden sonra elinizde iki soket bulunur:

  • Dinleyen soket yeni istemcileri kabul etmeye devam eder
  • Bağlantı soketi belirli bir istemciyle iletişim kurar

O istemciyle işiniz bittiğinde bağlantı soketini kapatın.

İsteği Okuma

İstemci verilerini bir arabelleğe okumak için recv kullanın. 0 dönüşü istemcinin bağlantıyı kestiği, -1 ise bir hata oluştuğu anlamına gelir.

#include <sys/socket.h>
#include <stdio.h>

void handle(int conn) {
    char buf[256];
    ssize_t n = recv(conn, buf, sizeof buf - 1, 0);
    if (n > 0) { buf[n] = 0; printf("got: %s\n", buf); }
}

Yanıt Gönderme

send ile yanıt verin. Büyük veriler için, tek bir çağrı arabelleğin yalnızca bir bölümünü yazabileceğinden tüm baytlar gönderilene kadar döngü kullanın.

#include <sys/socket.h>
#include <string.h>

void reply(int conn) {
    const char *msg = "hello from server\n";
    size_t left = strlen(msg);
    const char *p = msg;
    while (left > 0) {
        ssize_t n = send(conn, p, left, 0);
        if (n <= 0) break;
        p += n; left -= (size_t)n;
    }
}

Kabul Döngüsü

Basit bir yinelemeli sunucu bir istemciyi kabul eder, ona hizmet verir, bağlantısını kapatır ve ardından sıradaki istemciyi kabul etmek için döngünün başına döner. İstemcileri teker teker işler.

#include <unistd.h>

void serve_loop(int listen_fd, int (*accept_one)(int), void (*handle)(int)) {
    for (;;) {
        int conn = accept_one(listen_fd);
        if (conn < 0) continue;
        handle(conn);
        close(conn); /* done with this client */
    }
}

Düzenli Kapatma

Sunucu durduğunda dinleyen soketi kapatın ve döngüyü temiz biçimde sonlandırmak için SIGINT sinyalini işleyin. Çekirdek kaynaklarını serbest bırakmak için tanımlayıcıları her zaman kapatın.

Hızlı Kontrol

TCP sunucularını ne kadar anladığınızı test edin.

Özet

Adım adım bir TCP sunucusu oluşturdunuz.

  • socket, ardından SO_REUSEADDR, sonra bind, listen ve accept
  • accept, istemci başına kullanılacak yeni bir soket döndürür
  • İletişim için recv/send kullanın, ardından bağlantıyı kapatın
  • İstemcilere hizmet vermek için döngü kullanın; her dönüş değerini denetleyin

Sıkça Sorulan Sorular

“TCP Sunucusu” dersi ücretsiz mi?

Evet — “TCP Sunucusu” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.

“TCP Sunucusu” dersinde ne öğreneceğim?

Bağlantıları kabul edin C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“TCP Sunucusu” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Soketlere Genel Bakış
  2. TCP Sunucusu
  3. TCP İstemcisi
  4. Birden Çok İstemciyi İşleme
← C Academy Sayfasına Dön