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
acceptgibt 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.