0Pricing
C Academy · Lektion

TCP-Server

Verbindungen akzeptieren

TCP-Server ist eine kostenlose C Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.

Einen TCP-Server erstellen

Ein TCP-Server wartet auf Clients und nimmt deren Verbindungen an. Der Lebenszyklus lautet: einen Socket erstellen, ihn an einen Port binden, auf Verbindungen warten und diese anschließend in einer Schleife annehmen.

Schritt 1: Den Socket erstellen

Erstellen Sie einen Stream-Socket für IPv4-TCP. Ein negatives Ergebnis bedeutet, dass ein Fehler aufgetreten ist.

#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;
}

Schritt 2: Adresswiederverwendung erlauben

Standardmäßig verbleibt ein Port nach dem Beenden des Servers in TIME_WAIT, wodurch Neustarts blockiert werden. Setzen Sie SO_REUSEADDR mit setsockopt, damit Sie sofort erneut binden können.

#include <sys/socket.h>

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

Schritt 3: An einen Port binden

bind() bindet den Socket an eine lokale Adresse und einen Port. INADDR_ANY wartet auf allen Netzwerkschnittstellen.

#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;
}

Schritt 4: Auf Verbindungen warten

listen() markiert den Socket als passiv, also bereit für das Annehmen von Verbindungen. Das Argument backlog legt fest, wie viele ausstehende Verbindungen der Kernel in die Warteschlange einreihen darf.

#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;
}

Schritt 5: Verbindungen annehmen

accept() wartet blockierend, bis ein Client eine Verbindung herstellt, und gibt anschließend einen neuen Socket für diesen Client zurück. Der ursprüngliche Socket wartet weiterhin auf Verbindungen.

#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;
}

Zwei Sockets, zwei Aufgaben

Nach accept verfügen Sie über zwei Sockets:

  • Der lauschende Socket nimmt weiterhin neue Clients an
  • Der Verbindungs-Socket kommuniziert mit einem bestimmten Client

Schließen Sie den Verbindungs-Socket, wenn Sie mit diesem Client fertig sind.

Die Anfrage lesen

Verwenden Sie recv, um Clientdaten in einen Puffer zu lesen. Ein Rückgabewert von 0 bedeutet, dass der Client die Verbindung getrennt hat; -1 bedeutet, dass ein Fehler aufgetreten ist.

#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); }
}

Eine Antwort senden

Antworten Sie mit send. Bei großen Datenmengen müssen Sie eine Schleife verwenden, bis alle Bytes gesendet wurden, da ein einzelner Aufruf möglicherweise nur einen Teil des Puffers schreibt.

#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;
    }
}

Die Accept-Schleife

Ein einfacher iterativer Server nimmt einen Client an, bedient ihn, schließt die Verbindung und wartet anschließend in einer Schleife auf den nächsten. Er verarbeitet die Clients nacheinander.

#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 */
    }
}

Geordnetes Herunterfahren

Schließen Sie den lauschenden Socket, wenn der Server beendet wird, und behandeln Sie SIGINT, um die Schleife sauber zu verlassen. Schließen Sie Deskriptoren immer, um Kernel-Ressourcen freizugeben.

Kurzer Test

Testen Sie Ihr Verständnis von TCP-Servern.

Zusammenfassung

Sie haben Schritt für Schritt einen TCP-Server erstellt.

  • socket, dann SO_REUSEADDR, anschließend bind, listen und accept
  • accept gibt einen neuen Socket pro Client zurück
  • Mit recv/send kommunizieren und anschließend die Verbindung schließen
  • Clients in einer Schleife bedienen und jeden Rückgabewert prüfen

Häufig gestellte Fragen

Ist die Lektion „TCP-Server“ kostenlos?

Ja — der vollständige Text von „TCP-Server“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „TCP-Server“?

Verbindungen akzeptieren Du übst C Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C Academy zu starten?

Keine Vorkenntnisse erforderlich. C Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „TCP-Server“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C Academy-Lektion Code schreiben und ausführen?

Ja. Jede C Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Überblick über Sockets
  2. TCP-Server
  3. TCP-Client
  4. Mehrere Clients verarbeiten
← Zurück zu C Academy