Netzwerkprogrammierung in C++: Von Sockets bis Asynchronität

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Netzwerkprogrammierung in C++: Von Sockets bis Asynchronität

\n\n

Haben Sie sich jemals gefragt, wie Chats, Online-Spiele oder Webserver funktionieren? Im Kern jeder dieser Anwendungen steckt die Netzwerkkommunikation. Und wenn Sie schnelle, zuverlässige und hardwarenahe Netzwerkanwendungen schreiben möchten, dann ist die Netzwerkprogrammierung in C++ genau das Richtige. In diesem Artikel gehen wir nicht nur die Theorie durch, sondern schreiben echten Code: von einem einfachen TCP-Chat bis zu einem asynchronen Server mit Boost.Asio. Machen Sie Ihre IDEs bereit – es wird spannend!

\n\n

Warum C++ für Netzwerke? Drei Gründe

\n

Viele Entwickler wählen Python oder Java für Netzwerkaufgaben, aber C++ bietet drei entscheidende Vorteile:

\n
    \n
  • Geschwindigkeit: Minimale Overhead-Kosten, direkter Zugriff auf Systemaufrufe (Syscalls).
  • \n
  • Kontrolle: Sie verwalten Speicher, Puffer und Timing manuell.
  • \n
  • Ökosystem: Boost.Asio, libcurl, Poco – leistungsstarke Bibliotheken für jede Aufgabe.
  • \n
\n

Doch mit großer Macht kommt große Verantwortung: Ein einziger Fehler bei der Socket-Verwaltung und Ihr Server stürzt ab. Lassen Sie uns herausfinden, wie Sie das vermeiden.

\n\n

Grundlagen: Sockets und das OSI-Modell

\n

Bevor wir Code schreiben, erinnern wir uns daran, was ein Socket ist. Es ist eine Abstraktion, die es einer Anwendung ermöglicht, Daten über ein Netzwerk zu senden und zu empfangen. In C++ arbeiten wir über sys/socket.h (Linux) oder winsock2.h (Windows).

\n\n

TCP vs. UDP: Wann verwendet man was?

\n
    \n
  • TCP (SOCK_STREAM): Garantiert Zustellung und Reihenfolge der Pakete. Ideal für Chats, HTTP, Datenbanken.
  • \n
  • UDP (SOCK_DGRAM): Schneller, aber ohne Garantien. Wird in Streaming, DNS, Online-Spielen verwendet (wo ein Paketverlust leichter zu verkraften ist als eine Verzögerung).
  • \n
\n\n

Einen TCP-Server und -Client in C++ schreiben (reine Sockets)

\n

Lassen Sie uns einen einfachen Echo-Server erstellen. Er empfängt eine Nachricht und sendet sie zurück. Das ist das klassische „Hello, World“ der Netzwerkprogrammierung in C++.

\n\n

Server-Teil (echo_server.cpp)

\n
#include <iostream>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <unistd.h>\n#include <cstring>\n\nint main() {\n    int server_fd, client_fd;\n    struct sockaddr_in address;\n    int opt = 1;\n    int addrlen = sizeof(address);\n    char buffer[1024] = {0};\n\n    // 1. Socket erstellen\n    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {\n        perror("socket failed");\n        exit(EXIT_FAILURE);\n    }\n\n    // 2. An Port binden (mit reuse port Option)\n    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {\n        perror("setsockopt");\n        exit(EXIT_FAILURE);\n    }\n    address.sin_family = AF_INET;\n    address.sin_addr.s_addr = INADDR_ANY;\n    address.sin_port = htons(8080);\n\n    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {\n        perror("bind failed");\n        exit(EXIT_FAILURE);\n    }\n\n    // 3. Auf eingehende Verbindungen lauschen\n    if (listen(server_fd, 3) < 0) {\n        perror("listen");\n        exit(EXIT_FAILURE);\n    }\n\n    std::cout << "Server gestartet auf Port 8080. Warte auf Verbindungen..." << std::endl;\n\n    // 4. Client akzeptieren\n    if ((client_fd = accept(server_fd, (struct sockaddr *)&address,\n                            (socklen_t*)&addrlen)) < 0) {\n        perror("accept");\n        exit(EXIT_FAILURE);\n    }\n\n    // 5. Lesen und zurücksenden (Echo)\n    int valread = read(client_fd, buffer, 1024);\n    std::cout << "Empfangen: " << buffer << std::endl;\n    send(client_fd, buffer, strlen(buffer), 0);\n    std::cout << "Echo-Antwort gesendet" << std::endl;\n\n    close(client_fd);\n    close(server_fd);\n    return 0;\n}
\n\n

Client-Teil (echo_client.cpp)

\n
#include <                

Blogs

Buchempfehlungen