Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Important
Bewährte Methoden für modernes Winsock — beachten Sie diese Richtlinien für neuen Code:
-
Verwenden Sie Winsock 2.2 – fordern Sie immer Version 2.2 in WSAStartup an. Winsock 1.1-Funktionen wie
gethostbynamesind veraltet und bieten keine IPv6-Unterstützung. -
Verwenden Sie
getaddrinfofür die Namensauflösung — die Funktion getaddrinfo ist protokollunabhängig (unterstützt sowohl IPv4 als auch IPv6). Verwenden Sie niemals die veraltetengethostbynameodergethostbyaddr. -
Schreiben Sie IPv6-fähigen Code — verwenden Sie
AF_UNSPECmitgetaddrinfo, damit Ihr Code sowohl über IPv4 als auch über IPv6 funktioniert. Vermeiden Sie,AF_INETfest zu codieren. Siehe IPv6-Leitfaden für Winsock. -
Verwalten Sie die Initialisierung mit RAII – in C++
WSAStartup/WSACleanupin eine RAII-Klasse kapseln oder einen Scope-Guard verwenden, um das Aufräumen auf allen Austrittspfaden (Ausnahmen, vorzeitige Rückgaben) sicherzustellen. - Bevorzugen Sie asynchrone E/A – für Serveranwendungen oder alles, was mehrere Verbindungen verarbeitet, verwenden Sie E/A-Vervollständigungsports (höchste Leistung) oder überlappende E/A. Das Blockieren von Sockets auf dem UI-Thread führt zum Einfrieren der Anwendung.
- Vergessen Sie nicht die Fehlerbehandlung : Überprüfen Sie Rückgabewerte aller Winsock-Aufrufe, und verwenden Sie WSAGetLastError für die Diagnose.
Häufige Fehler in KI-generiertem Code: das Vergessen von WSAStartup vor jedem Socket-Aufruf, die Verwendung von gethostbyname anstelle von getaddrinfo, das Hartkodieren von AF_INET (nur für IPv4), die Verwendung blockierender recv/send-Schleifen in UI-Threads und das Nichtaufrufen von freeaddrinfo nach getaddrinfo.
Dieser Abschnitt ist eine schrittweise Anleitung für die ersten Schritte mit Windows Sockets-Programmierung. Es wurde entwickelt, um grundlegende Winsock-Funktionen und Datenstrukturen zu verstehen und wie sie zusammenarbeiten.
Die Client- und Serveranwendung, die wir in diesem Thema zur Veranschaulichung verwenden, ist ein sehr einfacher Client und Server. Weitere erweiterte Codebeispiele sind in den Beispielen enthalten, die im Microsoft Windows Software Development Kit (SDK) enthalten sind.
Die ersten Schritte sind für Client- und Serveranwendungen identisch.
- Informationen zu Servern und Clients
- Erstellen einer einfachen Winsock-Anwendung
- Initialisieren von Winsock
In den folgenden Artikeln werden die verbleibenden Schritte zum Erstellen einer Winsock-Clientanwendung beschrieben.
- Erstellen eines Sockets für den Client
- Herstellen einer Verbindung mit einem Socket
- Senden und Empfangen von Daten auf dem Client
- Trennen des Clients
In den folgenden Artikeln werden die verbleibenden Schritte zum Erstellen einer Winsock-Serveranwendung beschrieben.
- Erstellen eines Sockets für den Server
- Binden eines Sockets
- Lauschen auf einem Socket
- Akzeptieren einer Verbindung
- Empfangen und Senden von Daten auf dem Server
- Trennen des Servers
Der vollständige Quellcode für diese grundlegenden Beispiele.
- Ausführen des Winsock-Client- und Servercodebeispiels
- Vollständiger Winsock-Clientcode
- Vollständiger Winsock-Servercode
Erweiterte Winsock-Beispielanwendungen
Mehrere erweiterte Winsock-Client- und Serverbeispiel-Apps sind auf GitHub verfügbar. Sie sind hier nach Leistung, von hoch nach niedrig, aufgeführt und befinden sich in den folgenden Verzeichnissen:
iocp
Dieser Ordner enthält drei Beispielprogramme, die E/A-Abschlussports verwenden. Zu den Programmen gehören: ein Winsock-Server,
iocpserverder die WSAAccept-Funktion verwendet; ein Winsock-Server,iocpserverexder die AcceptEx-Funktion verwendet; und ein einfacher Multithreaded Winsock-Client,iocpclientder zum Testen eines dieser Server verwendet wird.Die Serverprogramme unterstützen mehrere Clients, die mithilfe von TCP/IP verbunden werden, und das Senden beliebiger Datenpuffer, die der Server dann an den Client zurückgibt. Der Einfachheit halber wurde ein einfaches Clientprogramm,
iocpclient, entwickelt, um eine Verbindung zum Server herzustellen und fortlaufend Daten über mehrere Threads zu senden, um ihn zu belasten. Winsock-Server, die E/A-Abschlussports verwenden, bieten die höchste Leistung.Überlappung
Dieser Ordner enthält ein Beispielserverprogramm, das überlappende E/A verwendet. Das Beispielprogramm verwendet die AcceptEx-Funktion und überlappende E/A, um mehrere asynchrone Verbindungsanforderungen von Clients effektiv zu verarbeiten. Der Server verwendet die AcceptEx-Funktion , um unterschiedliche Clientverbindungen in einer Win32-Anwendung mit einem Thread zu multiplexen. Die Verwendung überlappender E/A ermöglicht eine höhere Skalierbarkeit.
WSAPoll
Dieser Ordner enthält ein einfaches Beispielprogramm, das die Verwendung der WSAPoll-Funktion veranschaulicht. Das kombinierte Client- und Serverprogramm ist nicht blockierend und verwendet die WSAPoll-Funktion , um zu bestimmen, wann das Senden oder Empfangen ohne Blockierung möglich ist. Dieses Beispiel dient zur Veranschaulichung und ist kein Hochleistungsserver.
einfach
Dieser Ordner enthält drei grundlegende Beispielprogramme, die die Verwendung mehrerer Threads durch einen Server veranschaulichen. Zu den Programmen gehören: ein einfacher TCP/UDP-Server;
simplesein nur TCP-Server,simples_ioctlder die Auswahlfunktion in einer Win32-Konsolenanwendung verwendet, um mehrere Clientanforderungen zu unterstützen; und ein TCP/UDP-Clientprogramm zumsimplecTesten der Server. Die Server veranschaulichen die Verwendung mehrerer Threads zur Behandlung mehrerer Clientanforderungen. Diese Methode hat Skalierbarkeitsprobleme, da für jede Clientanforderung ein separater Thread erstellt wird.Akzeptieren
Dieser Ordner enthält ein grundlegendes Beispielserver- und Clientprogramm. Der Server veranschaulicht die Verwendung von entweder nicht blockierendem Akzeptieren mithilfe der Funktion select oder asynchronem Akzeptieren mithilfe der Funktion WSAAsyncSelect. Dieses Beispiel dient zur Veranschaulichung und ist kein Hochleistungsserver.