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.
Hinweis
Die Microsoft Foundation Classes (MFC)-Bibliothek wird weiterhin unterstützt. Wir fügen jedoch keine Features mehr hinzu oder aktualisieren die Dokumentation.
In diesem Artikel und zwei Begleitartikeln werden mehrere Probleme bei der Programmierung von Windows Sockets erläutert. In diesem Artikel wird die Blockierung behandelt. Die anderen Probleme werden in den Artikeln behandelt: Windows Sockets: Byte-Sortierung und Windows Sockets: Konvertieren von Zeichenfolgen.
Wenn Sie die Klasse CAsyncSocket verwenden oder von dieser ableiten, müssen Sie diese Probleme selbst verwalten. Wenn Sie die Klasse CSocket verwenden oder ableiten, verwaltet MFC sie für Sie.
Blockierung
Ein Socket kann sich im „blockierenden Modus” oder im „nicht blockierenden Modus” befinden. Die Funktionen von Sockets im blockierenden (oder synchronen) Modus werden erst zurückgegeben, wenn sie ihre Aktion abgeschlossen haben. Dies wird als Blockierung bezeichnet, da der Socket, dessen Funktion aufgerufen wurde, nichts ausführen kann – wird blockiert , bis der Aufruf zurückgegeben wird. Ein Aufruf der Receive-Mitgliedsfunktion kann zum Beispiel eine willkürlich lange Zeit dauern, da sie darauf wartet, dass die sendende Anwendung sendet (dies ist der Fall, wenn Sie CSocket verwenden oder CAsyncSocket mit Blockierung nutzen). Wenn sich ein CAsyncSocket Objekt im Nicht-Blockier-Modus befindet (asynchron ausgeführt), wird der Aufruf sofort zurückgegeben, und der aktuelle Fehlercode, der mit der GetLastError-Memberfunktion abgerufen werden kann, ist WSAEWOULDBLOCK. Dies weist darauf hin, dass der Aufruf blockiert hätte, wenn er aufgrund des Modus nicht sofort zurückgegeben worden wäre. (CSocket gibt nie WSAEWOULDBLOCK zurück. Die Klasse verwaltet die Blockierung für Sie.)
Das Verhalten von Sockets unterscheidet sich unter 32-Bit- und 64-Bit-Betriebssystemen (z. B. Windows 95 oder Windows 98) als unter 16-Bit-Betriebssystemen (z. B. Windows 3.1). Im Gegensatz zu 16-Bit-Betriebssystemen verwenden die 32-Bit- und 64-Bit-Betriebssysteme präemptives Multitasking und bieten Multithreading. Unter den 32-Bit- und 64-Bit-Betriebssystemen können Sie Ihre Sockets in separate Arbeitsthreads einfügen. Ein Socket in einem Thread kann blockieren, ohne andere Aktivitäten in Ihrer Anwendung zu stören und ohne Rechenzeit für das Blockieren aufzuwenden. Informationen zur Multithread-Programmierung finden Sie im Artikel Multithreading.
Hinweis
In Multithread-Anwendungen können Sie die Blockierungsform CSocket verwenden, um das Design Ihres Programms zu vereinfachen, ohne die Reaktionsfähigkeit der Benutzeroberfläche zu beeinträchtigen. Durch die Behandlung von Benutzerinteraktionen im Hauptthread und CSocket der Verarbeitung in alternativen Threads können Sie diese logischen Vorgänge trennen. In einer Anwendung, die nicht multithreaded ist, müssen diese beiden Aktivitäten kombiniert und als einzelner Thread behandelt werden, was in der Regel bedeutet, dass Sie CAsyncSocket verwenden, um Kommunikationsanforderungen bei Bedarf zu verarbeiten, oder CSocket::OnMessagePending überschreiben, um Benutzeraktionen während einer langen synchronen Aktivität zu handhaben.
Der Rest dieser Diskussion richtet sich an Programmierer für 16-Bit-Betriebssysteme:
Normalerweise sollten Sie bei der Verwendung von CAsyncSocket Blockierungsvorgänge vermeiden und stattdessen asynchron arbeiten. Bei asynchronen Vorgängen, ab dem Zeitpunkt, an dem Sie nach dem Aufruf einen Receive erhalten, warten Sie beispielsweise, bis die OnReceive Mitgliedsfunktion aufgerufen wird, um Sie darüber zu informieren, dass Sie erneut lesen können. Asynchrone Aufrufe erfolgen durch Aufrufen der entsprechenden Rückrufbenachrichtigungsfunktion Ihres Sockets, z. B. OnReceive.
Unter Windows gilt das Blockieren von Anrufen als schlechte Methode. Standardmäßig unterstützt CAsyncSocket asynchrone Aufrufe, und Sie müssen die Blockierung selbst mithilfe von Rückrufbenachrichtigungen verwalten. Klasse CSocket hingegen ist synchron. Es pumpt Windows-Nachrichten und verwaltet Blockaden für Sie.
Weitere Informationen zum Blockieren finden Sie in der Windows Sockets-Spezifikation. Weitere Informationen zu "On"-Funktionen finden Sie unter Windows Sockets: Socket-Benachrichtigungen und Windows Sockets: Ableiten von Socketklassen.
Weitere Informationen finden Sie unter: