CAsyncSocket-Klasse

Stellt einen Windows-Socket dar – einen Endpunkt der Netzwerkkommunikation.

Syntax

class CAsyncSocket : public CObject

Member

Öffentliche Konstruktoren

Name Beschreibung
CAsyncSocket::CAsyncSocket Erstellt ein CAsyncSocket-Objekt.

Öffentliche Methoden

Name Beschreibung
CAsyncSocket::Accept Akzeptiert eine Verbindung im Socket.
CAsyncSocket::AsyncSelect Fordert ereignisbenachrichtigung für den Socket an.
CAsyncSocket::Attach Fügt ein Sockethandle an ein CAsyncSocket Objekt an.
CAsyncSocket::Bind Ordnet eine lokale Adresse dem Socket zu.
CAsyncSocket::Close Schließt den Socket.
CAsyncSocket::Connect Stellt eine Verbindung mit einem Peersocket her.
CAsyncSocket::Create Erstellt einen Socket.
CAsyncSocket::CreateEx Erstellt einen Socket mit erweiterten Optionen.
CAsyncSocket::Detach Trennt ein Sockethandle von einem CAsyncSocket Objekt.
CAsyncSocket::FromHandle Gibt einen Zeiger auf ein CAsyncSocket Objekt zurück, wenn ein Sockethandle angegeben ist.
CAsyncSocket::GetLastError Ruft den Fehlerstatus für den letzten fehlgeschlagenen Vorgang ab.
CAsyncSocket::GetPeerName Ruft die Adresse des Peersockets ab, mit dem der Socket verbunden ist.
CAsyncSocket::GetPeerNameEx Ruft die Adresse des Peersockets ab, mit dem der Socket verbunden ist (behandelt IPv6-Adressen).
CAsyncSocket::GetSockName Ruft den lokalen Namen für einen Socket ab.
CAsyncSocket::GetSockNameEx Ruft den lokalen Namen für einen Socket ab (behandelt IPv6-Adressen).
CAsyncSocket::GetSockOpt Ruft eine Socketoption ab.
CAsyncSocket::IOCtl Steuert den Modus des Sockets.
CAsyncSocket::Listen Richtet einen Socket ein, der auf eingehende Verbindungsanforderungen lauscht.
CAsyncSocket::Receive Empfängt Daten aus dem Socket.
CAsyncSocket::ReceiveFrom Empfängt ein Datagramm und speichert die Quelladresse.
CAsyncSocket::ReceiveFromEx Empfängt ein Datagramm und speichert die Quelladresse (behandelt IPv6-Adressen).
CAsyncSocket::Send Sendet Daten an einen verbundenen Socket.
CAsyncSocket::SendTo Sendet Daten an ein bestimmtes Ziel.
CAsyncSocket::SendToEx Sendet Daten an ein bestimmtes Ziel (behandelt IPv6-Adressen).
CAsyncSocket::SetSockOpt Legt eine Socketoption fest.
CAsyncSocket::ShutDown Deaktiviert und/oder Receive Aufrufe Send für den Socket.
CASyncSocket::Socket Weist einen Socketziehpunkt zu.

Geschützte Methoden

Name Beschreibung
CAsyncSocket::OnAccept Benachrichtigt einen Überwachungssocket, dass er ausstehende Verbindungsanforderungen durch Aufrufen Acceptannehmen kann.
CAsyncSocket::OnClose Benachrichtigt einen Socket, dass der mit dem Socket verbundene Socket geschlossen wurde.
CAsyncSocket::OnConnect Benachrichtigt einen Verbindungssocket, ob der Verbindungsversuch erfolgreich oder fehlerhaft ist.
CAsyncSocket::OnOutOfBandData Benachrichtigt einen empfangenden Socket, dass out-of-band-Daten im Socket gelesen werden sollen, in der Regel eine dringende Nachricht.
CAsyncSocket::OnReceive Benachrichtigt einen Überwachungssocket, dass daten durch Aufrufen Receiveabgerufen werden sollen.
CAsyncSocket::OnSend Benachrichtigt einen Socket, dass er Daten senden kann, indem er aufruft Send.

Öffentliche Operatoren

Name Beschreibung
CAsyncSocket::operator = Weist einem CAsyncSocket Objekt einen neuen Wert zu.
CAsyncSocket::operator SOCKET Verwenden Sie diesen Operator, um das SOCKET Handle des CAsyncSocket Objekts abzurufen.

Öffentliche Datenmember

Name Beschreibung
CAsyncSocket::m_hSocket Gibt das SOCKET an dieses CAsyncSocket Objekt angefügte Handle an.

Hinweise

Die Klasse CAsyncSocket kapselt die Windows Socket Functions-API und stellt eine objektorientierte Abstraktion für Programmierer bereit, die Windows-Sockets in Verbindung mit MFC verwenden möchten.

Diese Klasse basiert auf der Annahme, dass Sie die Netzwerkkommunikation verstehen. Sie sind für die Behandlung von Blockierungs-, Bytereihenfolge-Unterschieden und Konvertierungen zwischen Unicode- und MBCS-Zeichenfolgen (Multibyte Character Set) verantwortlich. Wenn Sie eine komfortablere Schnittstelle benötigen, die diese Probleme für Sie verwaltet, lesen Sie die Klasse CSocket.

Um ein CAsyncSocket Objekt zu verwenden, rufen Sie den Konstruktor auf, und rufen Sie dann die Create Funktion auf, um das zugrunde liegende Sockethandle (Typ SOCKET) zu erstellen, mit Ausnahme von akzeptierten Sockets. Rufen Sie für einen Serversocket die Listen Memberfunktion auf, und für einen Clientsocket rufen Sie die Connect Memberfunktion auf. Der Serversocket sollte die Accept Funktion beim Empfang einer Verbindungsanforderung aufrufen. Verwenden Sie die Re Standard ing-FunktionenCAsyncSocket, um die Kommunikation zwischen Sockets auszuführen. Nach Abschluss zerstören Sie das CAsyncSocket Objekt, wenn es auf dem Heap erstellt wurde; der Destruktor ruft die Close Funktion automatisch auf. Der SOCKET Datentyp wird im Artikel Windows Sockets: Background beschrieben.

Hinweis

Wenn Sie MFC-Sockets in sekundären Threads in einer statisch verknüpften MFC-Anwendung verwenden, müssen Sie in jedem Thread aufrufen AfxSocketInit , der Sockets zum Initialisieren der Socketbibliotheken verwendet. Standardmäßig AfxSocketInit wird nur im primären Thread aufgerufen.

Weitere Informationen finden Sie unter Windows Sockets: Verwenden von Klassen CAsyncSocket und verwandten Artikeln sowie windows Sockets 2-API.

Vererbungshierarchie

CObject

CAsyncSocket

Anforderungen

Headerafxsock.h:

CAsyncSocket::Accept

Rufen Sie diese Memberfunktion auf, um eine Verbindung in einem Socket zu akzeptieren.

virtual BOOL Accept(
    CAsyncSocket& rConnectedSocket,
    SOCKADDR* lpSockAddr = NULL,
    int* lpSockAddrLen = NULL);

Parameter

rConnectedSocket
Ein Verweis, der einen neuen Socket identifiziert, der für die Verbindung verfügbar ist.

lpSockAddr
Ein Zeiger auf eine SOCKADDR Struktur, die die Adresse des Verbindungssockets empfängt, wie im Netzwerk bekannt. Das genaue Format des lpSockAddr Arguments wird durch die Adressfamilie bestimmt, die beim Erstellen des Sockets festgelegt wurde. Wenn lpSockAddr und/oder lpSockAddrLen gleich NULLsind, werden keine Informationen zur Remoteadresse des akzeptierten Sockets zurückgegeben.

lpSockAddrLen
Ein Zeiger auf die Länge der Adresse in lpSockAddr Byte. Dies lpSockAddrLen ist ein Wertergebnisparameter: Sie sollte zunächst den Abstand enthalten, auf lpSockAddrden verwiesen wird; beim Zurückgeben enthält sie die tatsächliche Länge (in Byte) der zurückgegebenen Adresse.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpSockAddrLen Argument ist zu klein (kleiner als die Größe einer SOCKADDR Struktur).

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Aufruf wird ausgeführt.

  • WSAEINVALListen wurde vor der Annahme nicht aufgerufen.

  • WSAEMFILE Die Warteschlange ist nach der Eingabe leer, um sie anzunehmen, und es sind keine Deskriptoren verfügbar.

  • WSAENOBUFS Es ist kein Pufferspeicher verfügbar.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAEOPNOTSUPP Der referenzierte Socket ist kein Typ, der verbindungsorientierte Dienste unterstützt.

  • WSAEWOULDBLOCK Der Socket ist als Nichtblockierung gekennzeichnet, und es sind keine Verbindungen zulässig.

Hinweise

Diese Routine extrahiert die erste Verbindung in der Warteschlange ausstehender Verbindungen, erstellt einen neuen Socket mit den gleichen Eigenschaften wie diesen Socket und fügt sie an rConnectedSocket. Wenn keine ausstehenden Verbindungen in der Warteschlange vorhanden sind, Accept wird null zurückgegeben und GetLastError ein Fehler zurückgegeben. Der akzeptierte Socket (rConnectedSocket) kann nicht verwendet werden, um weitere Verbindungen zu akzeptieren. Die ursprünglichen Socket re Standard s öffnen und lauschen.

Das Argument lpSockAddr ist ein Ergebnisparameter, der mit der Adresse des Verbindungssockets gefüllt ist, wie es für die Kommunikationsschicht bekannt ist. Accept wird mit verbindungsbasierten Sockettypen verwendet, z SOCK_STREAM. B. .

CAsyncSocket::AsyncSelect

Rufen Sie diese Memberfunktion auf, um ereignisbenachrichtigungen für einen Socket anzufordern.

BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Parameter

lEvent
Eine Bitmaske, die eine Kombination von Netzwerkereignissen angibt, an denen die Anwendung interessiert ist.

  • FD_READ Möchten Sie eine Benachrichtigung über die Bereitschaft zum Lesen erhalten.

  • FD_WRITE Möchten Sie eine Benachrichtigung erhalten, wenn Daten gelesen werden können.

  • FD_OOB Möchten Sie eine Benachrichtigung über die Ankunft von Out-of-Band-Daten erhalten.

  • FD_ACCEPT Möchten Sie Benachrichtigungen über eingehende Verbindungen empfangen.

  • FD_CONNECT Möchten Sie eine Benachrichtigung über Verbindungsergebnisse erhalten.

  • FD_CLOSE Möchten Sie eine Benachrichtigung empfangen, wenn ein Socket von einem Peer geschlossen wurde.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEINVAL Gibt an, dass einer der angegebenen Parameter ungültig war.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

Hinweise

Diese Funktion wird verwendet, um anzugeben, welche MFC-Rückrufbenachrichtigungsfunktionen für den Socket aufgerufen werden. AsyncSelect Legt diesen Socket automatisch auf den Nichtblockierungsmodus fest. Weitere Informationen finden Sie im Artikel Windows Sockets: Socketbenachrichtigungen.

CAsyncSocket::Attach

Rufen Sie diese Memberfunktion auf, um das hSocket Handle an ein CAsyncSocket Objekt anzufügen.

BOOL Attach(
    SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Parameter

hSocket
Enthält ein Handle für einen Socket.

lEvent
Eine Bitmaske, die eine Kombination von Netzwerkereignissen angibt, an denen die Anwendung interessiert ist.

  • FD_READ Möchten Sie eine Benachrichtigung über die Bereitschaft zum Lesen erhalten.

  • FD_WRITE Möchten Sie eine Benachrichtigung erhalten, wenn Daten gelesen werden können.

  • FD_OOB Möchten Sie eine Benachrichtigung über die Ankunft von Out-of-Band-Daten erhalten.

  • FD_ACCEPT Möchten Sie Benachrichtigungen über eingehende Verbindungen empfangen.

  • FD_CONNECT Möchten Sie eine Benachrichtigung über Verbindungsergebnisse erhalten.

  • FD_CLOSE Möchten Sie eine Benachrichtigung empfangen, wenn ein Socket von einem Peer geschlossen wurde.

Rückgabewert

Ungleich null, wenn die Funktion erfolgreich ist.

Hinweise

Das SOCKET Handle wird im Datenelement des m_hSocket Objekts gespeichert.

CAsyncSocket::Bind

Rufen Sie diese Memberfunktion auf, um eine lokale Adresse mit dem Socket zu verknüpfen.

BOOL Bind(
    UINT nSocketPort,
    LPCTSTR lpszSocketAddress = NULL);

BOOL Bind (
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

Parameter

nSocketPort
Der Port, der die Socketanwendung identifiziert.

lpszSocketAddress
Die Netzwerkadresse, eine gepunktete Zahl wie "128.56.22.8". Wenn Sie die NULL Zeichenfolge für diesen Parameter übergeben, wird angegeben, dass die CAsyncSocket Instanz auf Clientaktivitäten auf allen Netzwerkschnittstellen lauschen soll.

lpSockAddr
Ein Zeiger auf eine SOCKADDR Struktur, die die Adresse enthält, die diesem Socket zugewiesen werden soll.

nSockAddrLen
Die Länge der Adresse in lpSockAddr Byte.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. In der folgenden Liste werden einige der Fehler behandelt, die zurückgegeben werden können. Eine vollständige Liste finden Sie unter Windows Sockets Error Codes.

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEADDRINUSE Die angegebene Adresse wird bereits verwendet. (Siehe die SO_REUSEADDR Socketoption unter SetSockOpt.)

  • WSAEFAULT Das nSockAddrLen Argument ist zu klein (kleiner als die Größe einer SOCKADDR Struktur).

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Aufruf wird ausgeführt.

  • WSAEAFNOSUPPORT Die angegebene Adressfamilie wird von diesem Port nicht unterstützt.

  • WSAEINVAL Der Socket ist bereits an eine Adresse gebunden.

  • WSAENOBUFS Nicht genügend Puffer verfügbar, zu viele Verbindungen.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

Hinweise

Diese Routine wird vor nachfolgenden Connect oder Listen Aufrufen für ein nicht verbundenes Datagramm oder Datenstromsocket verwendet. Bevor verbindungsanforderungen akzeptiert werden können, muss ein Überwachungsserversocket eine Portnummer auswählen und windows-Sockets durch Aufrufen Bindbekannt machen. Bind richtet die lokale Zuordnung (Hostadresse/Portnummer) des Sockets ein, indem einem nicht benannten Socket ein lokaler Name zugewiesen wird.

CAsyncSocket::CAsyncSocket

Erstellt ein leeres Socketobjekt.

CAsyncSocket();

Hinweise

Nach dem Erstellen des Objekts müssen Sie die Create Memberfunktion aufrufen, um die Datenstruktur zu erstellen und ihre SOCKET Adresse zu binden. (Auf der Serverseite einer Windows Sockets-Kommunikation, wenn der Überwachungssocket einen Socket erstellt, der Accept im Anruf verwendet werden soll, rufen Sie diesen Socket nicht auf Create .)

CAsyncSocket::Close

Schließt den Socket.

virtual void Close();

Hinweise

Diese Funktion gibt den Socketdeskriptor frei, sodass weitere Verweise darauf mit dem Fehler WSAENOTSOCKfehlschlagen. Wenn dies der letzte Verweis auf den zugrunde liegenden Socket ist, werden die zugehörigen Benennungsinformationen und in die Warteschlange eingereihten Daten nicht Karte. Der Destruktor des Socketobjekts ruft Close Sie auf.

Für CAsyncSocket, aber nicht für CSocket, die Semantik von Close werden von den Socketoptionen SO_LINGER und SO_DONTLINGER. Weitere Informationen finden Sie unter Memberfunktion GetSockOpt.

CAsyncSocket::Connect

Rufen Sie diese Memberfunktion auf, um eine Verbindung mit einem nicht verbundenen Datenstrom- oder Datagrammsocket herzustellen.

BOOL Connect(
    LPCTSTR lpszHostAddress,
    UINT nHostPort);

BOOL Connect(
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

Parameter

lpszHostAddress
Die Netzwerkadresse des Sockets, mit dem dieses Objekt verbunden ist: computername wie "ftp.microsoft.com" oder eine gepunktete Zahl wie "128.56.22.8".

nHostPort
Der Port, der die Socketanwendung identifiziert.

lpSockAddr
Ein Zeiger auf eine SOCKADDR Struktur, die die Adresse des verbundenen Sockets enthält.

nSockAddrLen
Die Länge der Adresse in lpSockAddr Byte.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Wenn dies auf einen Fehlercode hinweist WSAEWOULDBLOCKund ihre Anwendung die überschreibbaren Rückrufe verwendet, erhält Ihre Anwendung eine OnConnect Meldung, wenn der Verbindungsvorgang abgeschlossen ist. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEADDRINUSE Die angegebene Adresse wird bereits verwendet.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Aufruf wird ausgeführt.

  • WSAEADDRNOTAVAIL Die angegebene Adresse ist vom lokalen Computer nicht verfügbar.

  • WSAEAFNOSUPPORT Adressen in der angegebenen Familie können nicht mit diesem Socket verwendet werden.

  • WSAECONNREFUSED Der Versuch, eine Verbindung herzustellen, wurde abgelehnt.

  • WSAEDESTADDRREQ Es ist eine Zieladresse erforderlich.

  • WSAEFAULT Das nSockAddrLen Argument ist falsch.

  • WSAEINVAL Ungültige Hostadresse.

  • WSAEISCONN Der Socket ist bereits verbunden.

  • WSAEMFILE Es sind keine weiteren Dateideskriptoren verfügbar.

  • WSAENETUNREACH Das Netzwerk kann derzeit nicht von diesem Host aus erreicht werden.

  • WSAENOBUFS Es ist kein Pufferspeicher verfügbar. Der Socket kann nicht verbunden werden.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAETIMEDOUT Versuchen Sie, einen Timeout herzustellen, ohne eine Verbindung herzustellen.

  • WSAEWOULDBLOCK Der Socket ist als Nichtblockierung gekennzeichnet, und die Verbindung kann nicht sofort abgeschlossen werden.

Hinweise

Wenn der Socket ungebunden ist, werden eindeutige Werte der lokalen Zuordnung durch das System zugewiesen, und der Socket wird als gebunden markiert. Beachten Sie, dass, wenn das Adressfeld der Namensstruktur alle Nullen ist, Connect Null zurückgibt. Rufen Sie die GetLastError Memberfunktion auf, um erweiterte Fehlerinformationen zu erhalten.

Für Datenstromsockets (Typ SOCK_STREAM) wird eine aktive Verbindung mit dem fremden Host initiiert. Wenn der Socketaufruf erfolgreich abgeschlossen ist, kann der Socket Daten senden/empfangen.

Für einen Datagrammsocket (TypSOCK_DGRAM) wird ein Standardziel festgelegt, das für nachfolgende Aufrufe ReceiveSend verwendet wird.

CAsyncSocket::Create

Rufen Sie die Create Memberfunktion nach dem Erstellen eines Socketobjekts auf, um den Windows-Socket zu erstellen und anzufügen.

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    LPCTSTR lpszSocketAddress = NULL);

Parameter

nSocketPort
Ein bekannter Port, der mit dem Socket verwendet werden soll, oder 0, wenn Windows Sockets einen Port auswählen sollen.

nSocketType
SOCK_STREAM oder SOCK_DGRAM

lEvent
Eine Bitmaske, die eine Kombination von Netzwerkereignissen angibt, an denen die Anwendung interessiert ist.

  • FD_READ Möchten Sie eine Benachrichtigung über die Bereitschaft zum Lesen erhalten.

  • FD_WRITE Möchten Sie eine Benachrichtigung über die Bereitschaft zum Schreiben erhalten.

  • FD_OOB Möchten Sie eine Benachrichtigung über die Ankunft von Out-of-Band-Daten erhalten.

  • FD_ACCEPT Möchten Sie Benachrichtigungen über eingehende Verbindungen empfangen.

  • FD_CONNECT Möchten Sie eine Benachrichtigung über die abgeschlossene Verbindung erhalten.

  • FD_CLOSE Möchten Sie eine Benachrichtigung über das Schließen des Sockets erhalten.

lpszSockAddress
Ein Zeiger auf eine Zeichenfolge, die die Netzwerkadresse des verbundenen Sockets enthält, eine gepunktete Zahl wie "128.56.22.8". Wenn Sie die NULL Zeichenfolge für diesen Parameter übergeben, wird angegeben, dass die CAsyncSocket Instanz auf Clientaktivitäten auf allen Netzwerkschnittstellen lauschen soll.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEAFNOSUPPORT Die angegebene Adressfamilie wird nicht unterstützt.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAEMFILE Es sind keine weiteren Dateideskriptoren verfügbar.

  • WSAENOBUFS Es ist kein Pufferspeicher verfügbar. Der Socket kann nicht erstellt werden.

  • WSAEPROTONOSUPPORT Der angegebene Port wird nicht unterstützt.

  • WSAEPROTOTYPE Der angegebene Port ist der falsche Typ für diesen Socket.

  • WSAESOCKTNOSUPPORT Der angegebene Sockettyp wird in dieser Adressfamilie nicht unterstützt.

Hinweise

Create Aufrufe Socket und bei erfolgreicher Ausführung wird aufgerufen Bind , um den Socket an die angegebene Adresse zu binden. Die folgenden Sockettypen werden unterstützt:

  • SOCK_STREAM Stellt sequenzierte, zuverlässige, vollduplexe, verbindungsbasierte Bytestreams bereit. Verwendet das Transmission Control Protocol (TCP) für die Internetadressenfamilie.

  • SOCK_DGRAM Unterstützt Datagramme, die verbindungslose, unzuverlässige Pakete einer festen (normalerweise kleinen) maximalen Länge sind. Verwendet das User Datagram Protocol (UDP) für die Internetadressenfamilie.

    Hinweis

    Die Accept Memberfunktion verwendet einen Verweis auf ein neues, leeres CSocket Objekt als Parameter. Sie müssen dieses Objekt erstellen, bevor Sie aufrufen Accept. Denken Sie daran, dass die Verbindung geschlossen wird, wenn dieses Socketobjekt den Gültigkeitsbereich überschreitet. Rufen Sie dieses neue Socketobjekt nicht auf Create .

Wichtig

Create ist nicht threadsicher. Wenn Sie ihn in einer Multithreadumgebung aufrufen, in der er gleichzeitig von verschiedenen Threads aufgerufen werden kann, sollten Sie jeden Aufruf mit einem Mutex oder einer anderen Synchronisierungssperre schützen.

Weitere Informationen zu Stream- und Datagrammsockets finden Sie in den Artikeln Windows Sockets: Hintergrund und Windows Sockets: Ports und Socketadressen und Windows Sockets 2-API.

CAsyncSocket::CreateEx

Rufen Sie die CreateEx Memberfunktion nach dem Erstellen eines Socketobjekts auf, um den Windows-Socket zu erstellen und anzufügen.

Verwenden Sie diese Funktion, wenn Sie erweiterte Optionen wie den Sockettyp angeben müssen.

BOOL CreateEx(
    ADDRINFOT* pAI,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Parameter

pAI
Ein Zeiger auf einen ADDRINFOT , der Socketinformationen enthält, z. B. die Familie und den Sockettyp.

lEvent
Eine Bitmaske, die eine Kombination von Netzwerkereignissen angibt, an denen die Anwendung interessiert ist.

  • FD_READ Möchten Sie eine Benachrichtigung über die Bereitschaft zum Lesen erhalten.

  • FD_WRITE Möchten Sie eine Benachrichtigung über die Bereitschaft zum Schreiben erhalten.

  • FD_OOB Möchten Sie eine Benachrichtigung über die Ankunft von Out-of-Band-Daten erhalten.

  • FD_ACCEPT Möchten Sie Benachrichtigungen über eingehende Verbindungen empfangen.

  • FD_CONNECT Möchten Sie eine Benachrichtigung über die abgeschlossene Verbindung erhalten.

  • FD_CLOSE Möchten Sie eine Benachrichtigung über das Schließen des Sockets erhalten.

Rückgabewert

Weitere Informationen finden Sie im Rückgabewert für Create().

Hinweise

Weitere Informationen finden Sie in den Hinweisen.Create()

CAsyncSocket::Detach

Rufen Sie diese Memberfunktion auf, um das SOCKET Handle im m_hSocket Datenelement vom CAsyncSocket Objekt zu trennen und auf .m_hSocketNULL

SOCKET Detach();

CAsyncSocket::FromHandle

Gibt einen Zeiger auf ein CAsyncSocket Objekt zurück.

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

Parameter

hSocket
Enthält ein Handle für einen Socket.

Rückgabewert

Ein Zeiger auf ein CAsyncSocket Objekt oder NULL wenn kein CAsyncSocket Objekt angefügt hSocketist.

Hinweise

Wenn ein Handle angegeben wird, wenn ein SOCKETCAsyncSocket Objekt nicht an das Handle angefügt ist, gibt die Memberfunktion zurück NULL.

CAsyncSocket::GetLastError

Rufen Sie diese Memberfunktion auf, um den Fehlerstatus für den letzten fehlgeschlagenen Vorgang abzurufen.

static int PASCAL GetLastError();

Rückgabewert

Der Rückgabewert gibt den Fehlercode für die letzte Von diesem Thread ausgeführte Windows Sockets-API-Routine an.

Hinweise

Wenn eine bestimmte Memberfunktion angibt, dass ein Fehler aufgetreten ist, sollte aufgerufen werden, GetLastError um den entsprechenden Fehlercode abzurufen. Eine Liste der anwendbaren Fehlercodes finden Sie in den Beschreibungen der einzelnen Memberfunktionen.

Weitere Informationen zu den Fehlercodes finden Sie unter der Windows Sockets 2-API.

CAsyncSocket::GetPeerName

Rufen Sie diese Memberfunktion auf, um die Adresse des Peersockets abzurufen, mit dem dieser Socket verbunden ist.

BOOL GetPeerName(
    CString& rPeerAddress,
    UINT& rPeerPort);

BOOL GetPeerName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

Parameter

rPeerAddress
Verweis auf ein CString Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.

rPeerPort
Verweisen auf einen UINT Port, der einen Port speichert.

lpSockAddr
Ein Zeiger auf die Struktur, die SOCKADDR den Namen des Peersockets empfängt.

lpSockAddrLen
Ein Zeiger auf die Länge der Adresse in lpSockAddr Byte. Beim Zurückgeben enthält das lpSockAddrLen Argument die tatsächliche Größe der lpSockAddr zurückgegebenen Bytes.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpSockAddrLen Argument ist nicht groß genug.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Aufruf wird ausgeführt.

  • WSAENOTCONN Der Socket ist nicht verbunden.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

Hinweise

Verwenden Sie zum Behandeln von CAsyncSocket::GetPeerNameExIPv6-Adressen .

CAsyncSocket::GetPeerNameEx

Rufen Sie diese Memberfunktion auf, um die Adresse des Peersockets abzurufen, mit dem dieser Socket verbunden ist (behandelt IPv6-Adressen).

BOOL GetPeerNameEx(
    CString& rPeerAddress,
    UINT& rPeerPort);

Parameter

rPeerAddress
Verweis auf ein CString Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.

rPeerPort
Verweisen auf einen UINT Port, der einen Port speichert.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpSockAddrLen Argument ist nicht groß genug.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Aufruf wird ausgeführt.

  • WSAENOTCONN Der Socket ist nicht verbunden.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

Hinweise

Diese Funktion ist identisch mit CAsyncSocket::GetPeerName der Ausnahme, dass sie IPv6-Adressen sowie ältere Protokolle behandelt.

CAsyncSocket::GetSockName

Rufen Sie diese Memberfunktion auf, um den lokalen Namen für einen Socket abzurufen.

BOOL GetSockName(
    CString& rSocketAddress,
    UINT& rSocketPort);

BOOL GetSockName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

Parameter

rSocketAddress
Verweis auf ein CString Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.

rSocketPort
Verweisen auf einen UINT Port, der einen Port speichert.

lpSockAddr
Ein Zeiger auf eine SOCKADDR Struktur, die die Adresse des Sockets empfängt.

lpSockAddrLen
Ein Zeiger auf die Länge der Adresse in lpSockAddr Byte.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpSockAddrLen Argument ist nicht groß genug.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAEINVAL Der Socket wurde nicht an eine Adresse gebunden mit Bind.

Hinweise

Dieser Aufruf ist besonders nützlich, wenn ein Connect Anruf durchgeführt wurde, ohne zuerst zu Bind tun. Dieser Aufruf stellt die einzige Möglichkeit bereit, mit der Sie die lokale Zuordnung bestimmen können, die vom System festgelegt wurde.

Verwenden Sie zum Behandeln von IPv6-Adressen CAsyncSocket::GetSockNameEx

CAsyncSocket::GetSockNameEx

Rufen Sie diese Memberfunktion auf, um den lokalen Namen für einen Socket abzurufen (behandelt IPv6-Adressen).

BOOL GetSockNameEx(
    CString& rSocketAddress,
    UINT& rSocketPort);

Parameter

rSocketAddress
Verweis auf ein CString Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.

rSocketPort
Verweisen auf einen UINT Port, der einen Port speichert.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpSockAddrLen Argument ist nicht groß genug.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAEINVAL Der Socket wurde nicht an eine Adresse gebunden mit Bind.

Hinweise

Dieser Aufruf ist identisch mit CAsyncSocket::GetSockName der Ausnahme, dass er IPv6-Adressen sowie ältere Protokolle verarbeitet.

Dieser Aufruf ist besonders nützlich, wenn ein Connect Anruf durchgeführt wurde, ohne zuerst zu Bind tun. Dieser Aufruf stellt die einzige Möglichkeit bereit, mit der Sie die lokale Zuordnung bestimmen können, die vom System festgelegt wurde.

CAsyncSocket::GetSockOpt

Rufen Sie diese Memberfunktion auf, um eine Socketoption abzurufen.

BOOL GetSockOpt(
    int nOptionName,
    void* lpOptionValue,
    int* lpOptionLen,
    int nLevel = SOL_SOCKET);

Parameter

nOptionName
Die Socketoption, für die der Wert abgerufen werden soll.

lpOptionValue
Ein Zeiger auf den Puffer, in dem der Wert für die angeforderte Option zurückgegeben werden soll. Der wert, der der ausgewählten Option zugeordnet ist, wird im Puffer lpOptionValuezurückgegeben. Die ganze Zahl, auf lpOptionLen die verwiesen wird, sollte ursprünglich die Größe dieses Puffers in Byte enthalten. Im Gegenzug wird sie auf die Größe des zurückgegebenen Werts festgelegt. Für SO_LINGER, dies ist die Größe einer LINGER Struktur; für alle anderen Optionen ist es die Größe eines BOOL oder einer int, abhängig von der Option. Weitere Informationen finden Sie in der Liste der Optionen und deren Größe im Abschnitt "Hinweise".

lpOptionLen
Ein Zeiger auf die Größe des lpOptionValue Puffers in Byte.

nLevel
Die Ebene, auf der die Option definiert ist; die einzigen unterstützten Ebenen sind SOL_SOCKET und IPPROTO_TCP.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Wenn eine Option nie mit SetSockOptfestgelegt wurde, gibt GetSockOpt sie den Standardwert für die Option zurück. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpOptionLen Argument war ungültig.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAENOPROTOOPT Die Option ist unbekannt oder nicht unterstützt. Insbesondere SO_BROADCAST wird für Sockets vom Typ SOCK_STREAM",", "SO_ACCEPTCONNSO_DONTLINGER, SO_KEEPALIVESO_LINGER" und ", " nicht unterstützt, und SO_OOBINLINE werden für Sockets vom Typ SOCK_DGRAMnicht unterstützt.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

Hinweise

GetSockOpt ruft den aktuellen Wert für eine Socketoption ab, die einem Socket eines beliebigen Typs zugeordnet ist, in jedem Zustand und speichert das Ergebnis in lpOptionValue. Optionen wirken sich auf Socketvorgänge aus, z. B. das Routing von Paketen, die Out-of-Band-Datenübertragung usw.

Die folgenden Optionen werden für GetSockOpt. Der Typ identifiziert den Typ der daten adressiert von lpOptionValue. Die TCP_NODELAY Option verwendet Ebene IPPROTO_TCP; alle anderen Optionen verwenden Ebene SOL_SOCKET.

Wert Typ Bedeutung
SO_ACCEPTCONN BOOL Socket überwacht.
SO_BROADCAST BOOL Socket ist für die Übertragung von Übertragungsnachrichten konfiguriert.
SO_DEBUG BOOL Das Debuggen ist aktiviert.
SO_DONTLINGER BOOL Wenn true, ist die SO_LINGER Option deaktiviert.
SO_DONTROUTE BOOL Routing ist deaktiviert.
SO_ERROR int Abrufen des Fehlerstatus und Löschens.
SO_KEEPALIVE BOOL Keep-Alives werden gesendet.
SO_LINGER struct LINGER Gibt die aktuellen Optionen für das Anhalten zurück.
SO_OOBINLINE BOOL Out-of-Band-Daten werden im normalen Datenstrom empfangen.
SO_RCVBUF int Puffergröße für Empfänge.
SO_REUSEADDR BOOL Der Socket kann an eine adresse gebunden werden, die bereits verwendet wird.
SO_SNDBUF int Puffergröße für Sendedaten.
SO_TYPE int Der Typ des Sockets (z. B SOCK_STREAM. ).
TCP_NODELAY BOOL Deaktiviert den Nagle-Algorithmus für Sammelsendungen.

Die BSD-Optionen (Berkeley Software Distribution) werden nicht unterstützt für GetSockOpt :

Wert Typ Bedeutung
SO_RCVLOWAT int Erhalten Sie ein Wasserzeichen mit geringem Wasser.
SO_RCVTIMEO int Timeout empfangen.
SO_SNDLOWAT int Senden Sie ein Wasserzeichen mit geringem Wasser.
SO_SNDTIMEO int Timeout senden.
IP_OPTIONS Ruft Optionen im IP-Header ab.
TCP_MAXSEG int Abrufen der maximalen TCP-Segmentgröße.

Das Aufrufen GetSockOpt mit einer nicht unterstützten Option führt zu einem Fehlercode, von GetLastErrordem WSAENOPROTOOPT zurückgegeben wird.

CAsyncSocket::IOCtl

Rufen Sie diese Memberfunktion auf, um den Modus eines Sockets zu steuern.

BOOL IOCtl(
    long lCommand,
    DWORD* lpArgument);

Parameter

lCommand
Der Befehl, der für den Socket ausgeführt werden soll.

lpArgument
Ein Zeiger auf einen Parameter für lCommand.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEINVALlCommand ist kein gültiger Befehl oder lpArgument kein zulässiger Parameter für lCommand, oder der Befehl gilt nicht für den typ des bereitgestellten Sockets.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

Hinweise

Diese Routine kann für jeden Socket in jedem Zustand verwendet werden. Es wird verwendet, um Betriebsparameter abzurufen oder abzurufen, die dem Socket zugeordnet sind, unabhängig vom Protokoll- und Kommunikationssubsystem. Die folgenden Befehle werden unterstützt:

  • FIONBIO Aktivieren oder Deaktivieren des Nichtblockingmodus im Socket. Der lpArgument Parameter verweist auf ein DWORD, das ungleich null ist, wenn der Nichtblockierungsmodus aktiviert werden soll, und null, wenn er deaktiviert werden soll. Wenn AsyncSelect für einen Socket ausgegeben wurde, schlägt jeder Versuch, IOCtl den Socket wieder auf den Blockierungsmodus festzulegen, fehl.WSAEINVAL Um den Socket wieder auf den Blockierungsmodus festzulegen und den WSAEINVAL Fehler zu verhindern, muss eine Anwendung zuerst durch Aufrufen AsyncSelect des lEvent Parameters gleich 0 deaktivieren AsyncSelect und dann aufrufenIOCtl.

  • FIONREAD Ermitteln Sie die maximale Anzahl von Bytes, die mit einem Receive Aufruf aus diesem Socket gelesen werden können. Der lpArgument Parameter verweist auf ein DWORD Objekt, in dem IOCtl das Ergebnis gespeichert wird. Wenn dieser Socket vom Typ SOCK_STREAMist, FIONREAD gibt die Gesamtmenge der Daten zurück, die in einem einzelnen Receivegelesen werden können. Dies entspricht normalerweise der Gesamtmenge der Daten, die im Socket in die Warteschlange gestellt werden. Wenn dieser Socket vom Typ SOCK_DGRAMist, wird die Größe des ersten Datagramms zurückgegeben, FIONREAD das im Socket in die Warteschlange gestellt wird.

  • SIOCATMARK Ermitteln Sie, ob alle Out-of-Band-Daten gelesen wurden. Dies gilt nur für einen Socket vom Typ SOCK_STREAM , der für den In-Line-Empfang von Out-of-Band-Daten ( SO_OOBINLINE) konfiguriert wurde. Wenn keine Out-of-Band-Daten gelesen werden müssen, gibt der Vorgang "nonzero" zurück. Andernfalls wird 0 zurückgegeben, und die nächste Receive oder ReceiveFrom für den Socket ausgeführte Daten ruft einige oder alle Daten ab, die dem "Mark" vorausgehen. Die Anwendung sollte den SIOCATMARK Vorgang verwenden, um zu bestimmen, ob Daten erneut Standard. Wenn es normale Daten vor den "dringenden" (Out-of-Band)-Daten gibt, werden sie in der Reihenfolge empfangen. (Beachten Sie, dass ein Receive oder ReceiveFrom mehrere Out-of-Band-Daten und normale Daten im gleichen Anruf niemals miteinander kombiniert werden.) Der lpArgument Parameter verweist auf ein DWORD Objekt, in dem IOCtl das Ergebnis gespeichert wird.

Diese Funktion ist eine Teilmenge der ioctl() in Berkeley-Sockets verwendeten. Insbesondere gibt es keinen Befehl, der gleichbedeutend FIOASYNCist, während SIOCATMARK es sich um den einzigen Befehl auf Socketebene handelt, der unterstützt wird.

CAsyncSocket::Listen

Rufen Sie diese Memberfunktion auf, um eingehende Verbindungsanforderungen zu überwachen.

BOOL Listen(int nConnectionBacklog = 5);

Parameter

nConnectionBacklog
Die maximale Länge, mit der die Warteschlange ausstehender Verbindungen vergrößert werden kann. Gültiger Bereich liegt zwischen 1 und 5.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEADDRINUSE Es wurde versucht, eine verwendete Adresse zu überwachen.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAEINVAL Der Socket wurde nicht mit Bind oder ist bereits verbunden.

  • WSAEISCONN Der Socket ist bereits verbunden.

  • WSAEMFILE Es sind keine weiteren Dateideskriptoren verfügbar.

  • WSAENOBUFS Es ist kein Pufferspeicher verfügbar.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAEOPNOTSUPP Der referenzierte Socket weist keinen Typ auf, der den Listen Vorgang unterstützt.

Hinweise

Um Verbindungen zu akzeptieren, wird der Socket zuerst mit Createerstellt, ein Backlog für eingehende Verbindungen wird mit Listenangegeben, und dann werden die Verbindungen akzeptiert.Accept Listen Gilt nur für Sockets, die Verbindungen unterstützen, d. h. solche vom Typ SOCK_STREAM. Dieser Socket wird in den "passiven" Modus versetzt, in dem eingehende Verbindungen erkannt und vom Prozess in die Warteschlange eingereiht werden.

Diese Funktion wird in der Regel von Servern (oder anwendungen, die Verbindungen akzeptieren möchten) verwendet, die mehrere Verbindungsanforderungen gleichzeitig haben können: Wenn eine Verbindungsanforderung mit der Warteschlange voll eingeht, erhält der Client eine Fehlermeldung mit einem Hinweis auf WSAECONNREFUSED.

Listen versucht, weiterhin rational zu funktionieren, wenn keine verfügbaren Ports (Deskriptoren) vorhanden sind. Es akzeptiert Verbindungen, bis die Warteschlange geleert wird. Wenn Ports verfügbar sind, wird die Warteschlange nach Möglichkeit durch einen späteren Anruf an ListenAccept den aktuellen oder letzten "Backlog" erneut ausgefüllt und die Überwachung eingehender Verbindungen fortgesetzt.

CAsyncSocket::m_hSocket

Enthält das SOCKET Handle für den socket, der von diesem CAsyncSocket Objekt gekapselt wird.

SOCKET m_hSocket;

CAsyncSocket::OnAccept

Vom Framework aufgerufen, um einen Überwachungssocket zu benachrichtigen, dass es ausstehende Verbindungsanforderungen akzeptieren kann, indem die Accept Memberfunktion aufgerufen wird.

virtual void OnAccept(int nErrorCode);

Parameter

nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnAccept Memberfunktion:

  • 0 Die Funktion wurde erfolgreich ausgeführt.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

Hinweise

Weitere Informationen finden Sie unter Windows Sockets: Socketbenachrichtigungen.

CAsyncSocket::OnClose

Wird vom Framework aufgerufen, um diesen Socket zu benachrichtigen, dass der verbundene Socket durch seinen Prozess geschlossen wird.

virtual void OnClose(int nErrorCode);

Parameter

nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnClose Memberfunktion:

  • 0 Die Funktion wurde erfolgreich ausgeführt.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAECONNRESET Die Verbindung wurde von der Remoteseite zurückgesetzt.

  • WSAECONNABORTED Die Verbindung wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.

Hinweise

Weitere Informationen finden Sie unter Windows Sockets: Socketbenachrichtigungen.

CAsyncSocket::OnConnect

Wird vom Framework aufgerufen, um diesen Verbindungssocket zu benachrichtigen, ob der Verbindungsversuch erfolgreich oder fehlerhaft ist.

virtual void OnConnect(int nErrorCode);

Parameter

nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnConnect Memberfunktion:

  • 0 Die Funktion wurde erfolgreich ausgeführt.

  • WSAEADDRINUSE Die angegebene Adresse wird bereits verwendet.

  • WSAEADDRNOTAVAIL Die angegebene Adresse ist vom lokalen Computer nicht verfügbar.

  • WSAEAFNOSUPPORT Adressen in der angegebenen Familie können nicht mit diesem Socket verwendet werden.

  • WSAECONNREFUSED Der Versuch, eine Verbindung herzustellen, wurde erzwungen abgelehnt.

  • WSAEDESTADDRREQ Es ist eine Zieladresse erforderlich.

  • WSAEFAULT Das lpSockAddrLen Argument ist falsch.

  • WSAEINVAL Der Socket ist bereits an eine Adresse gebunden.

  • WSAEISCONN Der Socket ist bereits verbunden.

  • WSAEMFILE Es sind keine weiteren Dateideskriptoren verfügbar.

  • WSAENETUNREACH Das Netzwerk kann derzeit nicht von diesem Host aus erreicht werden.

  • WSAENOBUFS Es ist kein Pufferspeicher verfügbar. Der Socket kann nicht verbunden werden.

  • WSAENOTCONN Der Socket ist nicht verbunden.

  • WSAENOTSOCK Der Deskriptor ist eine Datei, kein Socket.

  • WSAETIMEDOUT Der Versuch, ein Timeout herzustellen, ohne eine Verbindung herzustellen.

Hinweise

Hinweis

In CSocket, die OnConnect Benachrichtigungsfunktion wird nie aufgerufen. Bei Verbindungen rufen Sie einfach auf Connect, was bei Abschluss der Verbindung (entweder erfolgreich oder fehlerhaft) zurückgegeben wird. Wie Verbindungsbenachrichtigungen behandelt werden, ist ein MFC-Implementierungsdetails.

Weitere Informationen finden Sie unter Windows Sockets: Socketbenachrichtigungen.

Beispiel

void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
   if (0 != nErrorCode)
   {
      switch (nErrorCode)
      {
      case WSAEADDRINUSE:
         AfxMessageBox(_T("The specified address is already in use.\n"));
         break;
      case WSAEADDRNOTAVAIL:
         AfxMessageBox(_T("The specified address is not available from ")
                       _T("the local machine.\n"));
         break;
      case WSAEAFNOSUPPORT:
         AfxMessageBox(_T("Addresses in the specified family cannot be ")
                       _T("used with this socket.\n"));
         break;
      case WSAECONNREFUSED:
         AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
         break;
      case WSAEDESTADDRREQ:
         AfxMessageBox(_T("A destination address is required.\n"));
         break;
      case WSAEFAULT:
         AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
         break;
      case WSAEINVAL:
         AfxMessageBox(_T("The socket is already bound to an address.\n"));
         break;
      case WSAEISCONN:
         AfxMessageBox(_T("The socket is already connected.\n"));
         break;
      case WSAEMFILE:
         AfxMessageBox(_T("No more file descriptors are available.\n"));
         break;
      case WSAENETUNREACH:
         AfxMessageBox(_T("The network cannot be reached from this host ")
                       _T("at this time.\n"));
         break;
      case WSAENOBUFS:
         AfxMessageBox(_T("No buffer space is available. The socket ")
                       _T("cannot be connected.\n"));
         break;
      case WSAENOTCONN:
         AfxMessageBox(_T("The socket is not connected.\n"));
         break;
      case WSAENOTSOCK:
         AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
         break;
      case WSAETIMEDOUT:
         AfxMessageBox(_T("The attempt to connect timed out without ")
                       _T("establishing a connection. \n"));
         break;
      default:
         TCHAR szError[256];
         _stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
         AfxMessageBox(szError);
         break;
      }
      AfxMessageBox(_T("Please close the application"));
   }
   CAsyncSocket::OnConnect(nErrorCode);
}

CAsyncSocket::OnOutOfBandData

Wird vom Framework aufgerufen, um den empfangenden Socket zu benachrichtigen, dass der sendende Socket über Out-of-Band-Daten verfügt, die gesendet werden sollen.

virtual void OnOutOfBandData(int nErrorCode);

Parameter

nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnOutOfBandData Memberfunktion:

  • 0 Die Funktion wurde erfolgreich ausgeführt.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

Hinweise

Out-of-Band-Daten sind ein logisch unabhängiger Kanal, der jedem Paar verbundener Sockets vom Typ SOCK_STREAMzugeordnet ist. Der Kanal wird in der Regel verwendet, um dringende Daten zu senden.

MFC unterstützt Out-of-Band-Daten, benutzer der Klasse CAsyncSocket werden jedoch davon abgeraten, sie zu verwenden. Die einfachere Möglichkeit besteht darin, einen zweiten Socket zum Übergeben solcher Daten zu erstellen. Weitere Informationen zu Out-of-Band-Daten finden Sie unter Windows Sockets: Socketbenachrichtigungen.

CAsyncSocket::OnReceive

Wird vom Framework aufgerufen, um diesen Socket zu benachrichtigen, dass daten im Puffer vorhanden sind, die durch Aufrufen der Receive Memberfunktion abgerufen werden können.

virtual void OnReceive(int nErrorCode);

Parameter

nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnReceive Memberfunktion:

  • 0 Die Funktion wurde erfolgreich ausgeführt.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

Hinweise

Weitere Informationen finden Sie unter Windows Sockets: Socketbenachrichtigungen.

Beispiel

void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
  static int i = 0;

  i++;

  TCHAR buff[4096];
  int nRead;
  nRead = Receive(buff, 4096);

  switch (nRead)
  {
  case 0:
    Close();
    break;
  case SOCKET_ERROR:
    if (GetLastError() != WSAEWOULDBLOCK)
    {
      AfxMessageBox(_T("Error occurred"));
      Close();
    }
    break;
  default:
    buff[nRead] = _T('\0'); //terminate the string
    CString szTemp(buff);
    m_strRecv += szTemp; // m_strRecv is a CString declared
                         // in CMyAsyncSocket
    if (szTemp.CompareNoCase(_T("bye")) == 0)
    {
      ShutDown();
      s_eventDone.SetEvent();
    }
  }
  CAsyncSocket::OnReceive(nErrorCode);
}

CAsyncSocket::OnSend

Wird vom Framework aufgerufen, um den Socket zu benachrichtigen, dass er jetzt Daten senden kann, indem die Send Memberfunktion aufgerufen wird.

virtual void OnSend(int nErrorCode);

Parameter

nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnSend Memberfunktion:

  • 0 Die Funktion wurde erfolgreich ausgeführt.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

Hinweise

Weitere Informationen finden Sie unter Windows Sockets: Socketbenachrichtigungen.

Beispiel

// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
//    CString  m_sendBuffer;   //for async send
//    int      m_nBytesSent;
//    int      m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
   while (m_nBytesSent < m_nBytesBufferSize)
   {
      int dwBytes;

      if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
                          m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
      {
         if (GetLastError() == WSAEWOULDBLOCK)
         {
            break;
         }
         else
         {
            TCHAR szError[256];
            _stprintf_s(szError, _T("Server Socket failed to send: %d"),
                        GetLastError());
            Close();
            AfxMessageBox(szError);
         }
      }
      else
      {
         m_nBytesSent += dwBytes;
      }
   }

   if (m_nBytesSent == m_nBytesBufferSize)
   {
      m_nBytesSent = m_nBytesBufferSize = 0;
      m_sendBuffer = _T("");
   }

   CAsyncSocket::OnSend(nErrorCode);
}

CAsyncSocket::operator =

Weist einem CAsyncSocket Objekt einen neuen Wert zu.

void operator=(const CAsyncSocket& rSrc);

Parameter

rSrc
Ein Verweis auf ein vorhandenes CAsyncSocket Objekt.

Hinweise

Rufen Sie diese Funktion auf, um ein vorhandenes CAsyncSocket Objekt in ein anderes CAsyncSocket Objekt zu kopieren.

CAsyncSocket::operator SOCKET

Verwenden Sie diesen Operator, um das SOCKET Handle des CAsyncSocket Objekts abzurufen.

operator SOCKET() const;

Rückgabewert

Bei erfolgreicher Ausführung des Objekts; SOCKET andernfalls NULL.

Hinweise

Sie können das Handle verwenden, um Windows-APIs direkt aufzurufen.

CAsyncSocket::Receive

Rufen Sie diese Memberfunktion auf, um Daten aus einem Socket zu empfangen.

virtual int Receive(
    void* lpBuf,
    int nBufLen,
    int nFlags = 0);

Parameter

lpBuf
Ein Puffer für die eingehenden Daten.

nBufLen
Die Länge in lpBuf Byte.

nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|) kombiniert wird:

  • MSG_PEEK Werfen Sie einen Blick auf die eingehenden Daten. Die Daten werden in den Puffer kopiert, aber nicht aus der Eingabewarteschlange entfernt.

  • MSG_OOB Verarbeiten von Out-of-Band-Daten.

Rückgabewert

Wenn kein Fehler auftritt, Receive wird die Anzahl der empfangenen Bytes zurückgegeben. Wenn die Verbindung geschlossen wurde, wird 0 zurückgegeben. Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR , und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAENOTCONN Der Socket ist nicht verbunden.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAEOPNOTSUPPMSG_OOB wurde angegeben, aber der Socket ist nicht vom Typ SOCK_STREAM.

  • WSAESHUTDOWN Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufen Receive , nachdem ShutDown er mit nHow "0" oder "2" aufgerufen wurde.

  • WSAEWOULDBLOCK Der Socket ist als Nichtblockierung gekennzeichnet, und der Receive Vorgang würde blockieren.

  • WSAEMSGSIZE Das Datagramm war zu groß, um in den angegebenen Puffer zu passen und wurde abgeschnitten.

  • WSAEINVAL Der Socket wurde nicht an Bind.

  • WSAECONNABORTED Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.

  • WSAECONNRESET Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.

Hinweise

Diese Funktion wird für verbundene Datenstrom- oder Datagrammsockets verwendet und zum Lesen eingehender Daten verwendet.

Für Sockets vom Typ SOCK_STREAMwerden so viele Informationen wie derzeit bis zur Größe des bereitgestellten Puffers zurückgegeben. Wenn der Socket für den In-Line-Empfang von Out-of-Band-Daten (Socketoption SO_OOBINLINE) konfiguriert wurde und Out-of-Band-Daten ungelesen sind, werden nur Out-of-Band-Daten zurückgegeben. Die Anwendung kann die IOCtlSIOCATMARK Option verwenden oder OnOutOfBandData bestimmen, ob mehr Out-of-Band-Daten zu lesen sind Standard.

Bei Datagrammsockets werden Daten aus dem ersten enqueuierten Datagramm bis zur Größe des bereitgestellten Puffers extrahiert. Wenn das Datagramm größer als der bereitgestellte Puffer ist, wird der Puffer mit dem ersten Teil des Datagramms gefüllt, die überzähligen Daten gehen verloren und Receive gibt einen Wert mit SOCKET_ERROR dem Fehlercode zurück, auf den der Fehlercode festgelegt WSAEMSGSIZEist. Wenn keine eingehenden Daten im Socket verfügbar sind, wird ein Wert von SOCKET_ERROR zurückgegeben, auf den der Fehlercode festgelegt WSAEWOULDBLOCKist. Die OnReceive Rückruffunktion kann verwendet werden, um zu bestimmen, wann weitere Daten eintreffen.

Wenn der Socket vom Typ SOCK_STREAM ist und die Remoteseite die Verbindung ordnungsgemäß heruntergefahren hat, wird die Receive Verbindung sofort mit 0 Bytes empfangen. Wenn die Verbindung zurückgesetzt wurde, Receive tritt ein Fehler WSAECONNRESETauf.

Receive sollte nur einmal aufgerufen werden, wenn jedes Mal CAsyncSocket::OnReceive aufgerufen wird.

Beispiel

Sehen Sie sich das Beispiel für CAsyncSocket::OnReceive.

CAsyncSocket::ReceiveFrom

Rufen Sie diese Memberfunktion auf, um ein Datagramm zu empfangen und die Quelladresse in der SOCKADDR Struktur oder in rSocketAddresszu speichern.

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen,
    int nFlags = 0);

Parameter

lpBuf
Ein Puffer für die eingehenden Daten.

nBufLen
Die Länge in lpBuf Byte.

rSocketAddress
Verweis auf ein CString Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.

rSocketPort
Verweisen auf einen UINT Port, der einen Port speichert.

lpSockAddr
Ein Zeiger auf eine SOCKADDR Struktur, die die Quelladresse beim Zurückgeben enthält.

lpSockAddrLen
Ein Zeiger auf die Länge der Quelladresse in lpSockAddr Byte.

nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|) kombiniert wird:

  • MSG_PEEK Werfen Sie einen Blick auf die eingehenden Daten. Die Daten werden in den Puffer kopiert, aber nicht aus der Eingabewarteschlange entfernt.

  • MSG_OOB Verarbeiten von Out-of-Band-Daten.

Rückgabewert

Wenn kein Fehler auftritt, ReceiveFrom wird die Anzahl der empfangenen Bytes zurückgegeben. Wenn die Verbindung geschlossen wurde, wird 0 zurückgegeben. Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR , und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpSockAddrLen Argument war ungültig: Der lpSockAddr Puffer war zu klein, um die Peeradresse aufzunehmen.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAEINVAL Der Socket wurde nicht an Bind.

  • WSAENOTCONN Der Socket ist nicht verbunden (SOCK_STREAM nur).

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAEOPNOTSUPPMSG_OOB wurde angegeben, aber der Socket ist nicht vom Typ SOCK_STREAM.

  • WSAESHUTDOWN Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufen ReceiveFrom , nachdem ShutDown er mit nHow "0" oder "2" aufgerufen wurde.

  • WSAEWOULDBLOCK Der Socket ist als Nichtblockierung gekennzeichnet, und der ReceiveFrom Vorgang würde blockieren.

  • WSAEMSGSIZE Das Datagramm war zu groß, um in den angegebenen Puffer zu passen und wurde abgeschnitten.

  • WSAECONNABORTED Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.

  • WSAECONNRESET Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.

Hinweise

Diese Funktion wird verwendet, um eingehende Daten in einem (möglicherweise verbundenen) Socket zu lesen und die Adresse zu erfassen, von der die Daten gesendet wurden.

Verwenden Sie zum Behandeln von CAsyncSocket::ReceiveFromExIPv6-Adressen .

Für Sockets vom Typ SOCK_STREAMwerden so viele Informationen wie derzeit bis zur Größe des bereitgestellten Puffers zurückgegeben. Wenn der Socket für den In-Line-Empfang von Out-of-Band-Daten (Socketoption SO_OOBINLINE) konfiguriert wurde und Out-of-Band-Daten ungelesen sind, werden nur Out-of-Band-Daten zurückgegeben. Die Anwendung kann die IOCtlSIOCATMARK Option verwenden oder OnOutOfBandData bestimmen, ob mehr Out-of-Band-Daten zu lesen sind Standard. Die lpSockAddr Parameter werden lpSockAddrLen für SOCK_STREAM Sockets ignoriert.

Bei Datagrammsockets werden Daten aus dem ersten enqueuierten Datagramm bis zur Größe des bereitgestellten Puffers extrahiert. Wenn das Datagramm größer als der bereitgestellte Puffer ist, wird der Puffer mit dem ersten Teil der Nachricht gefüllt, die überzähligen Daten gehen verloren und ReceiveFrom gibt einen Wert mit SOCKET_ERROR dem Fehlercode zurück, auf den der Fehlercode festgelegt WSAEMSGSIZEist.

Wenn lpSockAddr es sich um einen Nichtzero handelt und der Socket vom Typ SOCK_DGRAMist, wird die Netzwerkadresse des Sockets, der die Daten gesendet hat, in die entsprechende SOCKADDR Struktur kopiert. Der wert, lpSockAddrLen auf den verwiesen wird, wird auf die Größe dieser Struktur initialisiert und wird beim Zurückgeben geändert, um die tatsächliche Größe der dort gespeicherten Adresse anzugeben. Wenn keine eingehenden Daten im Socket verfügbar sind, wartet der Anruf auf die Eintreffen von ReceiveFrom Daten, es sei denn, der Socket ist nicht blockiert. In diesem Fall wird ein Wert von SOCKET_ERROR zurückgegeben, auf den der Fehlercode festgelegt WSAEWOULDBLOCKist. Der OnReceive Rückruf kann verwendet werden, um zu bestimmen, wann weitere Daten eingehen.

Wenn der Socket vom Typ SOCK_STREAM ist und die Remoteseite die Verbindung ordnungsgemäß heruntergefahren hat, wird die ReceiveFrom Verbindung sofort mit 0 Bytes empfangen.

CAsyncSocket::ReceiveFromEx

Rufen Sie diese Memberfunktion auf, um ein Datagramm zu empfangen und die Quelladresse in der SOCKADDR Struktur oder in rSocketAddress (behandelt IPv6-Adressen) zu speichern.

int ReceiveFromEx(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

Parameter

lpBuf
Ein Puffer für die eingehenden Daten.

nBufLen
Die Länge in lpBuf Byte.

rSocketAddress
Verweis auf ein CString Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.

rSocketPort
Verweisen auf einen UINT Port, der einen Port speichert.

nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|) kombiniert wird:

  • MSG_PEEK Werfen Sie einen Blick auf die eingehenden Daten. Die Daten werden in den Puffer kopiert, aber nicht aus der Eingabewarteschlange entfernt.

  • MSG_OOB Verarbeiten von Out-of-Band-Daten.

Rückgabewert

Wenn kein Fehler auftritt, ReceiveFromEx wird die Anzahl der empfangenen Bytes zurückgegeben. Wenn die Verbindung geschlossen wurde, wird 0 zurückgegeben. Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR , und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpSockAddrLen Argument war ungültig: Der lpSockAddr Puffer war zu klein, um die Peeradresse aufzunehmen.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAEINVAL Der Socket wurde nicht an Bind.

  • WSAENOTCONN Der Socket ist nicht verbunden (SOCK_STREAM nur).

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAEOPNOTSUPPMSG_OOB wurde angegeben, aber der Socket ist nicht vom Typ SOCK_STREAM.

  • WSAESHUTDOWN Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufen ReceiveFromEx , nachdem ShutDown er mit nHow "0" oder "2" aufgerufen wurde.

  • WSAEWOULDBLOCK Der Socket ist als Nichtblockierung gekennzeichnet, und der ReceiveFromEx Vorgang würde blockieren.

  • WSAEMSGSIZE Das Datagramm war zu groß, um in den angegebenen Puffer zu passen und wurde abgeschnitten.

  • WSAECONNABORTED Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.

  • WSAECONNRESET Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.

Hinweise

Diese Funktion wird verwendet, um eingehende Daten in einem (möglicherweise verbundenen) Socket zu lesen und die Adresse zu erfassen, von der die Daten gesendet wurden.

Diese Funktion ist identisch mit CAsyncSocket::ReceiveFrom der Ausnahme, dass sie IPv6-Adressen sowie ältere Protokolle behandelt.

Für Sockets vom Typ SOCK_STREAMwerden so viele Informationen wie derzeit bis zur Größe des bereitgestellten Puffers zurückgegeben. Wenn der Socket für den In-Line-Empfang von Out-of-Band-Daten (Socketoption SO_OOBINLINE) konfiguriert wurde und Out-of-Band-Daten ungelesen sind, werden nur Out-of-Band-Daten zurückgegeben. Die Anwendung kann die IOCtlSIOCATMARK Option verwenden oder OnOutOfBandData bestimmen, ob mehr Out-of-Band-Daten zu lesen sind Standard. Die lpSockAddr Parameter werden lpSockAddrLen für SOCK_STREAM Sockets ignoriert.

Bei Datagrammsockets werden Daten aus dem ersten enqueuierten Datagramm bis zur Größe des bereitgestellten Puffers extrahiert. Wenn das Datagramm größer als der bereitgestellte Puffer ist, wird der Puffer mit dem ersten Teil der Nachricht gefüllt, die überzähligen Daten gehen verloren und ReceiveFromEx gibt einen Wert mit SOCKET_ERROR dem Fehlercode zurück, auf den der Fehlercode festgelegt WSAEMSGSIZEist.

Wenn lpSockAddr es sich um einen Nichtzero handelt und der Socket vom Typ SOCK_DGRAMist, wird die Netzwerkadresse des Sockets, der die Daten gesendet hat, in die entsprechende SOCKADDR Struktur kopiert. Der wert, lpSockAddrLen auf den verwiesen wird, wird auf die Größe dieser Struktur initialisiert und wird beim Zurückgeben geändert, um die tatsächliche Größe der dort gespeicherten Adresse anzugeben. Wenn keine eingehenden Daten im Socket verfügbar sind, wartet der Anruf auf die Eintreffen von ReceiveFromEx Daten, es sei denn, der Socket ist nicht blockiert. In diesem Fall wird ein Wert von SOCKET_ERROR zurückgegeben, auf den der Fehlercode festgelegt WSAEWOULDBLOCKist. Der OnReceive Rückruf kann verwendet werden, um zu bestimmen, wann weitere Daten eingehen.

Wenn der Socket vom Typ SOCK_STREAM ist und die Remoteseite die Verbindung ordnungsgemäß heruntergefahren hat, wird die ReceiveFromEx Verbindung sofort mit 0 Bytes empfangen.

CAsyncSocket::Send

Rufen Sie diese Memberfunktion auf, um Daten in einem verbundenen Socket zu senden.

virtual int Send(
    const void* lpBuf,
    int nBufLen,
    int nFlags = 0);

Parameter

lpBuf
Ein Puffer, der die zu übertragenden Daten enthält.

nBufLen
Die Länge der Daten in lpBuf Byte.

nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|) kombiniert wird:

  • MSG_DONTROUTE Gibt an, dass die Daten nicht dem Routing unterliegen sollen. Ein Windows Sockets-Lieferant kann diese Kennzeichnung ignorieren.

  • MSG_OOB Senden Sie Out-of-Band-Daten (SOCK_STREAM nur).

Rückgabewert

Wenn kein Fehler auftritt, Send wird die Gesamtanzahl der gesendeten Zeichen zurückgegeben. (Beachten Sie, dass dies kleiner als die zahl sein kann, die durch nBufLen.) Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR , und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEACCES Die angeforderte Adresse ist eine Übertragungsadresse, aber das entsprechende Flag wurde nicht festgelegt.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAEFAULT Das lpBuf Argument befindet sich nicht in einem gültigen Teil des Benutzeradressraums.

  • WSAENETRESET Die Verbindung muss zurückgesetzt werden, da die Windows Sockets-Implementierung sie gelöscht hat.

  • WSAENOBUFS Die Implementierung von Windows Sockets meldet einen Puffer-Deadlock.

  • WSAENOTCONN Der Socket ist nicht verbunden.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAEOPNOTSUPPMSG_OOB wurde angegeben, aber der Socket ist nicht vom Typ SOCK_STREAM.

  • WSAESHUTDOWN Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufen Send , nachdem ShutDown er mit nHow "1" oder "2" aufgerufen wurde.

  • WSAEWOULDBLOCK Der Socket ist als Nichtblockierung gekennzeichnet, und der angeforderte Vorgang würde blockieren.

  • WSAEMSGSIZE Der Socket ist vom Typ SOCK_DGRAM, und das Datagramm ist größer als die maximale Unterstützung durch die Windows Sockets-Implementierung.

  • WSAEINVAL Der Socket wurde nicht an Bind.

  • WSAECONNABORTED Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.

  • WSAECONNRESET Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.

Hinweise

Send wird verwendet, um ausgehende Daten in verbundenen Datenstrom- oder Datagrammsockets zu schreiben. Für Datagrammsockets muss die maximale IP-Paketgröße der zugrunde liegenden Subnetze, die iMaxUdpDg vom Element in der WSADATA von der Struktur zurückgegebenen AfxSocketInitStruktur angegeben wird, nicht überschritten werden. Wenn die Daten zu lang sind, um atomisch über das zugrunde liegende Protokoll zu übergeben, wird der Fehler WSAEMSGSIZE via GetLastErrorzurückgegeben, und es werden keine Daten übertragen.

Beachten Sie, dass bei einem Datagrammsocket der erfolgreiche Abschluss eines Datensockets Send nicht darauf hinweist, dass die Daten erfolgreich übermittelt wurden.

Bei CAsyncSocket Objekten vom Typ SOCK_STREAMkann die Anzahl der geschriebenen Bytes zwischen 1 und der angeforderten Länge lauten, abhängig von der Pufferverfügbarkeit auf den lokalen und ausländischen Hosts.

Beispiel

Sehen Sie sich das Beispiel für CAsyncSocket::OnSend.

CAsyncSocket::SendTo

Rufen Sie diese Memberfunktion auf, um Daten an ein bestimmtes Ziel zu senden.

int SendTo(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

int SendTo(
    const void* lpBuf,
    int nBufLen,
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen,
    int nFlags = 0);

Parameter

lpBuf
Ein Puffer, der die zu übertragenden Daten enthält.

nBufLen
Die Länge der Daten in lpBuf Byte.

nHostPort
Der Port, der die Socketanwendung identifiziert.

lpszHostAddress
Die Netzwerkadresse des Sockets, mit dem dieses Objekt verbunden ist: ein Computername wie "ftp.microsoft.com" oder eine gepunktete Zahl wie "128.56.22.8".

nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|) kombiniert wird:

  • MSG_DONTROUTE Gibt an, dass die Daten nicht dem Routing unterliegen sollen. Ein Windows Sockets-Lieferant kann diese Kennzeichnung ignorieren.

  • MSG_OOB Senden Sie Out-of-Band-Daten (SOCK_STREAM nur).

lpSockAddr
Ein Zeiger auf eine SOCKADDR Struktur, die die Adresse des Zielsockets enthält.

nSockAddrLen
Die Länge der Adresse in lpSockAddr Byte.

Rückgabewert

Wenn kein Fehler auftritt, SendTo wird die Gesamtanzahl der gesendeten Zeichen zurückgegeben. (Beachten Sie, dass dies kleiner als die zahl sein kann, die durch nBufLen.) Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR , und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEACCES Die angeforderte Adresse ist eine Übertragungsadresse, aber das entsprechende Flag wurde nicht festgelegt.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAEFAULT Die lpBuf Parameter lpSockAddr sind nicht Teil des Benutzeradressraums, oder das lpSockAddr Argument ist zu klein (kleiner als die Größe einer SOCKADDR Struktur).

  • WSAEINVAL Der Hostname ist ungültig.

  • WSAENETRESET Die Verbindung muss zurückgesetzt werden, da die Windows Sockets-Implementierung sie gelöscht hat.

  • WSAENOBUFS Die Implementierung von Windows Sockets meldet einen Puffer-Deadlock.

  • WSAENOTCONN Der Socket ist nicht verbunden (SOCK_STREAM nur).

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAEOPNOTSUPPMSG_OOB wurde angegeben, aber der Socket ist nicht vom Typ SOCK_STREAM.

  • WSAESHUTDOWN Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufen SendTo , nachdem ShutDown er mit nHow "1" oder "2" aufgerufen wurde.

  • WSAEWOULDBLOCK Der Socket ist als Nichtblockierung gekennzeichnet, und der angeforderte Vorgang würde blockieren.

  • WSAEMSGSIZE Der Socket ist vom Typ SOCK_DGRAM, und das Datagramm ist größer als die maximale Unterstützung durch die Windows Sockets-Implementierung.

  • WSAECONNABORTED Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.

  • WSAECONNRESET Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.

  • WSAEADDRNOTAVAIL Die angegebene Adresse ist vom lokalen Computer nicht verfügbar.

  • WSAEAFNOSUPPORT Adressen in der angegebenen Familie können nicht mit diesem Socket verwendet werden.

  • WSAEDESTADDRREQ Es ist eine Zieladresse erforderlich.

  • WSAENETUNREACH Das Netzwerk kann derzeit nicht von diesem Host aus erreicht werden.

Hinweise

SendTo wird für Datagramm- oder Datenstromsockets verwendet und zum Schreiben ausgehender Daten in einem Socket verwendet. Für Datagrammsockets muss darauf geachtet werden, dass die maximale IP-Paketgröße der zugrunde liegenden Subnetze, die iMaxUdpDg vom Element in der WSADATA struktur ausgefüllt AfxSocketInitwird, nicht überschritten werden. Wenn die Daten zu lang sind, um atomisch über das zugrunde liegende Protokoll zu übergeben, wird der Fehler WSAEMSGSIZE zurückgegeben, und es werden keine Daten übertragen.

Beachten Sie, dass der erfolgreiche Abschluss eines Vorgangs SendTo nicht darauf hinweist, dass die Daten erfolgreich übermittelt wurden.

SendTo wird nur für einen SOCK_DGRAM Socket verwendet, um ein Datagramm an einen bestimmten Socket zu senden, der durch den lpSockAddr Parameter identifiziert wird.

Zum Senden einer Übertragung (nur auf einer SOCK_DGRAM Einzigen) sollte die Adresse im lpSockAddr Parameter mit der speziellen IP-Adresse INADDR_BROADCAST (definiert in der Headerdatei WINSOCK.Hvon Windows Sockets) zusammen mit der vorgesehenen Portnummer erstellt werden. Oder, wenn der lpszHostAddress Parameter lautet NULL, wird der Socket für die Übertragung konfiguriert. Es ist in der Regel nicht möglich, dass ein Übertragungsdatendiagramm die Größe überschreitet, in der fragmentiert werden kann, was bedeutet, dass der Datenteil des Datagramms (ohne Header) 512 Byte nicht überschreiten sollte.

Verwenden Sie zum Behandeln von CAsyncSocket::SendToExIPv6-Adressen .

CAsyncSocket::SendToEx

Rufen Sie diese Memberfunktion auf, um Daten an ein bestimmtes Ziel zu senden (behandelt IPv6-Adressen).

int SendToEx(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

Parameter

lpBuf
Ein Puffer, der die zu übertragenden Daten enthält.

nBufLen
Die Länge der Daten in lpBuf Byte.

nHostPort
Der Port, der die Socketanwendung identifiziert.

lpszHostAddress
Die Netzwerkadresse des Sockets, mit dem dieses Objekt verbunden ist: ein Computername wie "ftp.microsoft.com" oder eine gepunktete Zahl wie "128.56.22.8".

nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|) kombiniert wird:

  • MSG_DONTROUTE Gibt an, dass die Daten nicht dem Routing unterliegen sollen. Ein Windows Sockets-Lieferant kann diese Kennzeichnung ignorieren.

  • MSG_OOB Senden Sie Out-of-Band-Daten (SOCK_STREAM nur).

Rückgabewert

Wenn kein Fehler auftritt, SendToEx wird die Gesamtanzahl der gesendeten Zeichen zurückgegeben. (Beachten Sie, dass dies kleiner als die zahl sein kann, die durch nBufLen.) Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR , und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEACCES Die angeforderte Adresse ist eine Übertragungsadresse, aber das entsprechende Flag wurde nicht festgelegt.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAEFAULT Die lpBuf Parameter lpSockAddr sind nicht Teil des Benutzeradressraums, oder das lpSockAddr Argument ist zu klein (kleiner als die Größe einer SOCKADDR Struktur).

  • WSAEINVAL Der Hostname ist ungültig.

  • WSAENETRESET Die Verbindung muss zurückgesetzt werden, da die Windows Sockets-Implementierung sie gelöscht hat.

  • WSAENOBUFS Die Implementierung von Windows Sockets meldet einen Puffer-Deadlock.

  • WSAENOTCONN Der Socket ist nicht verbunden (SOCK_STREAM nur).

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAEOPNOTSUPPMSG_OOB wurde angegeben, aber der Socket ist nicht vom Typ SOCK_STREAM.

  • WSAESHUTDOWN Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufen SendToEx , nachdem ShutDown er mit nHow "1" oder "2" aufgerufen wurde.

  • WSAEWOULDBLOCK Der Socket ist als Nichtblockierung gekennzeichnet, und der angeforderte Vorgang würde blockieren.

  • WSAEMSGSIZE Der Socket ist vom Typ SOCK_DGRAM, und das Datagramm ist größer als die maximale Unterstützung durch die Windows Sockets-Implementierung.

  • WSAECONNABORTED Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.

  • WSAECONNRESET Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.

  • WSAEADDRNOTAVAIL Die angegebene Adresse ist vom lokalen Computer nicht verfügbar.

  • WSAEAFNOSUPPORT Adressen in der angegebenen Familie können nicht mit diesem Socket verwendet werden.

  • WSAEDESTADDRREQ Es ist eine Zieladresse erforderlich.

  • WSAENETUNREACH Das Netzwerk kann derzeit nicht von diesem Host aus erreicht werden.

Hinweise

Diese Methode ist identisch mit CAsyncSocket::SendTo der Ausnahme, dass sie IPv6-Adressen sowie ältere Protokolle behandelt.

SendToEx wird für Datagramm- oder Datenstromsockets verwendet und zum Schreiben ausgehender Daten in einem Socket verwendet. Für Datagrammsockets muss darauf geachtet werden, dass die maximale IP-Paketgröße der zugrunde liegenden Subnetze, die iMaxUdpDg vom Element in der WSADATA struktur ausgefüllt AfxSocketInitwird, nicht überschritten werden. Wenn die Daten zu lang sind, um atomisch über das zugrunde liegende Protokoll zu übergeben, wird der Fehler WSAEMSGSIZE zurückgegeben, und es werden keine Daten übertragen.

Beachten Sie, dass der erfolgreiche Abschluss eines Vorgangs SendToEx nicht darauf hinweist, dass die Daten erfolgreich übermittelt wurden.

SendToEx wird nur für einen SOCK_DGRAM Socket verwendet, um ein Datagramm an einen bestimmten Socket zu senden, der durch den lpSockAddr Parameter identifiziert wird.

Zum Senden einer Übertragung (nur auf einer SOCK_DGRAM Einzigen) sollte die Adresse im lpSockAddr Parameter mit der speziellen IP-Adresse INADDR_BROADCAST (definiert in der Headerdatei WINSOCK.Hvon Windows Sockets) zusammen mit der vorgesehenen Portnummer erstellt werden. Oder, wenn der lpszHostAddress Parameter lautet NULL, wird der Socket für die Übertragung konfiguriert. Es ist in der Regel nicht möglich, dass ein Übertragungsdatendiagramm die Größe überschreitet, in der fragmentiert werden kann, was bedeutet, dass der Datenteil des Datagramms (ohne Header) 512 Byte nicht überschreiten sollte.

CAsyncSocket::SetSockOpt

Rufen Sie diese Memberfunktion auf, um eine Socketoption festzulegen.

BOOL SetSockOpt(
    int nOptionName,
    const void* lpOptionValue,
    int nOptionLen,
    int nLevel = SOL_SOCKET);

Parameter

nOptionName
Die Socketoption, für die der Wert festgelegt werden soll.

lpOptionValue
Ein Zeiger auf den Puffer, in dem der Wert für die angeforderte Option angegeben wird.

nOptionLen
Die Größe des Puffers lpOptionValue in Byte.

nLevel
Die Ebene, auf der die Option definiert ist; die einzigen unterstützten Ebenen sind SOL_SOCKET und IPPROTO_TCP.

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEFAULTlpOptionValue ist nicht in einem gültigen Teil des Prozessadressraums enthalten.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAEINVALnLevel ist ungültig, oder die Darin enthaltenen lpOptionValue Informationen sind ungültig.

  • WSAENETRESETVerbinden ion ist beim Festlegen ein Timeout SO_KEEPALIVE aufgetreten.

  • WSAENOPROTOOPT Die Option ist unbekannt oder nicht unterstützt. Insbesondere SO_BROADCAST wird für Sockets vom Typ SOCK_STREAM", while SO_KEEPALIVESO_DONTLINGER" , , SO_LINGER, und SO_OOBINLINE werden nicht für Sockets vom Typ SOCK_DGRAMunterstützt.

  • WSAENOTCONNVerbinden ion wurde zurückgesetzt, wenn SO_KEEPALIVE festgelegt wird.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

Hinweise

SetSockOpt legt den aktuellen Wert für eine Socketoption fest, die einem Socket eines beliebigen Typs in einem beliebigen Zustand zugeordnet ist. Obwohl Optionen auf mehreren Protokollebenen vorhanden sein können, definiert diese Spezifikation nur Optionen, die auf der obersten Ebene "Socket" vorhanden sind. Optionen wirken sich auf Socketvorgänge aus, z. B. ob beschleunigte Daten im normalen Datenstrom empfangen werden, ob Übertragungsnachrichten im Socket gesendet werden können usw.

Es gibt zwei Arten von Socketoptionen: Boolesche Optionen, die ein Feature oder Verhalten aktivieren oder deaktivieren, und Optionen, die einen ganzzahligen Wert oder eine ganze Struktur erfordern. Um eine boolesche Option zu aktivieren, lpOptionValue zeigt sie auf eine ganze Zahl ohne Nullzahl. Um die Option lpOptionValue zu deaktivieren, wird eine ganze Zahl gleich Null angezeigt. nOptionLen sollte für boolesche Optionen gleich sizeof(BOOL) sein. Zeigt bei anderen Optionen auf die ganze Zahl oder Struktur, lpOptionValue die den gewünschten Wert für die Option enthält, und nOptionLen ist die Länge der ganzen Zahl oder Struktur.

SO_LINGER steuert die Aktion, die ausgeführt wird, wenn nicht gesendete Daten auf einem Socket in die Warteschlange gestellt werden, und die Close Funktion wird aufgerufen, um den Socket zu schließen.

Standardmäßig kann ein Socket nicht an eine lokale Adresse gebunden werden(siehe Bind), die bereits verwendet wird. Gelegentlich kann es jedoch wünschenswert sein, eine Adresse auf diese Weise "wiederzuverwenden". Da jede Verbindung durch die Kombination lokaler und Remoteadressen eindeutig identifiziert wird, besteht kein Problem mit zwei Sockets, die an dieselbe lokale Adresse gebunden sind, solange die Remoteadressen unterschiedlich sind.

Um die Windows Sockets-Implementierung darüber zu informieren, dass ein Bind Aufruf eines Sockets nicht zulässig sein sollte, da die gewünschte Adresse bereits von einem anderen Socket verwendet wird, sollte die Anwendung die SO_REUSEADDR Socketoption für den Socket festlegen, bevor sie den Bind Aufruf ausstellen. Beachten Sie, dass die Option nur zum Zeitpunkt des Bind Anrufs interpretiert wird: Es ist daher unnötig (aber harmlos), die Option für einen Socket festzulegen, der nicht an eine vorhandene Adresse gebunden werden soll, und das Festlegen oder Zurücksetzen der Option, nachdem der Bind Anruf keine Auswirkungen auf dieses oder einen anderen Socket hat.

Eine Anwendung kann anfordern, dass die Windows Sockets-Implementierung die Verwendung von "Keep-Alive"-Paketen für TCP-Verbindungen (Transmission Control Protocol) ermöglicht, indem die SO_KEEPALIVE Socketoption aktiviert wird. Eine Windows Sockets-Implementierung muss die Verwendung von Keep-Alives nicht unterstützen: Wenn dies der Fall ist, sind die genauen Semantik implementierungsspezifisch, sollten jedoch Abschnitt 4.2.3.6 von RFC 1122 entsprechen: "Anforderungen für Internethosts – Kommunikationsebenen". Wenn eine Verbindung als Ergebnis von "keep-alives" verworfen wird, wird der Fehlercode WSAENETRESET an alle Aufrufe zurückgegeben, die im Socket ausgeführt werden, und alle nachfolgenden Aufrufe schlagen mit WSAENOTCONN.

Die TCP_NODELAY Option deaktiviert den Nagle-Algorithmus. Der Nagle-Algorithmus wird verwendet, um die Anzahl der kleinen Pakete zu reduzieren, die von einem Host gesendet werden, indem nicht erkannte Sendedaten gepuffert werden, bis ein Paket mit voller Größe gesendet werden kann. Für einige Anwendungen kann dieser Algorithmus jedoch die Leistung beeinträchtigen und TCP_NODELAY zum Deaktivieren verwendet werden. Anwendungsautoren sollten nur festgelegt werden TCP_NODELAY , wenn die Auswirkungen ders gut verstanden und gewünscht sind, da die Einstellung TCP_NODELAY erhebliche negative Auswirkungen auf die Netzwerkleistung haben kann. TCP_NODELAY ist die einzige unterstützte Socketoption, die Ebene IPPROTO_TCPverwendet; alle anderen Optionen verwenden Ebene SOL_SOCKET.

Einige Implementierungen von Windows Sockets liefern Ausgabedebuginformationen, wenn die SO_DEBUG Option von einer Anwendung festgelegt wird.

Die folgenden Optionen werden für SetSockOpt. Der Typ identifiziert den Typ der daten adressiert von lpOptionValue.

Wert Typ Bedeutung
SO_BROADCAST BOOL Übertragung von Übertragungsnachrichten im Socket zulassen.
SO_DEBUG BOOL Zeichnet Debuginformationen auf.
SO_DONTLINGER BOOL Warten Close Sie nicht, bis nicht gesendete Daten gesendet werden. Das Festlegen dieser Option entspricht der Einstellung SO_LINGER mit l_onoff "Null".
SO_DONTROUTE BOOL Leiten Sie nicht weiter: Senden Sie direkt an die Schnittstelle.
SO_KEEPALIVE BOOL Keep-Alives senden.
SO_LINGER struct LINGER Bleiben Sie eingeschaltet Close , wenn nicht gesendete Daten vorhanden sind.
SO_OOBINLINE BOOL Empfangen von Out-of-Band-Daten im normalen Datenstrom.
SO_RCVBUF int Geben Sie die Puffergröße für Empfänge an.
SO_REUSEADDR BOOL Zulassen, dass der Socket an eine adresse gebunden wird, die bereits verwendet wird. (Siehe Bind.)
SO_SNDBUF int Geben Sie die Puffergröße für Sendedaten an.
TCP_NODELAY BOOL Deaktiviert den Nagle-Algorithmus für Sammelsendungen.

Die BSD-Optionen (Berkeley Software Distribution) werden nicht unterstützt für SetSockOpt :

Wert Typ Bedeutung
SO_ACCEPTCONN BOOL Socket überwacht
SO_ERROR int Abrufen des Fehlerstatus und Löschens.
SO_RCVLOWAT int Erhalten Sie ein Wasserzeichen mit geringem Wasser.
SO_RCVTIMEO int Timeout empfangen
SO_SNDLOWAT int Senden Sie ein Wasserzeichen mit geringem Wasser.
SO_SNDTIMEO int Timeout senden.
SO_TYPE int Typ des Sockets.
IP_OPTIONS Festlegen des Optionsfelds im IP-Header.

CAsyncSocket::ShutDown

Rufen Sie diese Memberfunktion auf, um Sende-, Empfangen- oder beides im Socket zu deaktivieren.

BOOL ShutDown(int nHow = sends);

Parameter

nHow
Ein Flag, das beschreibt, welche Arten von Vorgängen nicht mehr zulässig sind, wobei die folgenden aufgezählten Werte verwendet werden:

  • empfängt = 0

  • sends = 1

  • beide = 2

Rückgabewert

Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Bevor Sie diese API verwenden, muss ein erfolgreicher AfxSocketInit Vorgang ausgeführt werden.

  • WSAENETDOWN Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.

  • WSAEINVALnHow ist nicht gültig.

  • WSAEINPROGRESS Ein blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAENOTCONN Der Socket ist nicht verbunden (SOCK_STREAM nur).

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

Hinweise

ShutDown wird für alle Arten von Sockets verwendet, um den Empfang, die Übertragung oder beides zu deaktivieren. Wenn nHow 0 ist, wird der nachfolgende Erhalt des Sockets nicht zulässig. Dies hat keine Auswirkungen auf die unteren Protokollebenen.

Für das Übertragungssteuerungsprotokoll (TCP) wird das TCP-Fenster nicht geändert, und eingehende Daten werden akzeptiert (aber nicht bestätigt), bis das Fenster erschöpft ist. Für das User Datagram Protocol (UDP) werden eingehende Datagramme akzeptiert und in die Warteschlange gestellt. In keinem Fall wird ein ICMP-Fehlerpaket generiert. Wenn nHow 1 ist, sind nachfolgende Senden unzulässig. Für TCP-Sockets wird eine FIN gesendet. Die Einstellung nHow auf 2 deaktiviert sowohl Sende- als auch Empfänge wie oben beschrieben.

Beachten Sie, dass ShutDown der Socket nicht geschlossen wird, und ressourcen, die an den Socket angefügt sind, werden erst freigegeben, wenn Close sie aufgerufen werden. Eine Anwendung sollte sich nicht darauf verlassen, einen Socket nach dem Herunterfahren wiederzuverwenden. Insbesondere ist keine Windows Sockets-Implementierung erforderlich, um die Verwendung eines Connect solchen Sockets zu unterstützen.

Beispiel

Sehen Sie sich das Beispiel für CAsyncSocket::OnReceive.

CASyncSocket::Socket

Weist einen Socketziehpunkt zu.

BOOL Socket(
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    int nProtocolType = 0,
    int nAddressFormat = PF_INET);

Parameter

nSocketType
Gibt SOCK_STREAM an oder SOCK_DGRAM.

lEvent
Eine Bitmaske, die eine Kombination von Netzwerkereignissen angibt, an denen die Anwendung interessiert ist.

  • FD_READ: Möchten Sie eine Benachrichtigung über die Bereitschaft zum Lesen erhalten.

  • FD_WRITE: Möchten Sie eine Benachrichtigung über die Bereitschaft zum Schreiben erhalten.

  • FD_OOB: Möchten Sie eine Benachrichtigung über die Ankunft von Out-of-Band-Daten erhalten.

  • FD_ACCEPT: Möchten Sie eine Benachrichtigung über eingehende Verbindungen erhalten.

  • FD_CONNECT: Möchten Sie eine Benachrichtigung über die abgeschlossene Verbindung erhalten.

  • FD_CLOSE: Möchten Sie eine Benachrichtigung über das Schließen des Sockets erhalten.

nProtocolType
Protokoll, das mit dem Socket verwendet werden soll, der für die angegebene Adressfamilie spezifisch ist.

nAddressFormat
Adressfamilienspezifikation.

Rückgabewert

Gibt TRUE bei Erfolg bzw. FALSE bei einem Fehler zurück.

Hinweise

Diese Methode weist ein Sockethandle zu. Es wird nicht aufgerufen CAsyncSocket::Bind , um den Socket an eine angegebene Adresse zu binden, daher müssen Sie später aufrufen Bind , um den Socket an eine angegebene Adresse zu binden. Sie können CAsyncSocket::SetSockOpt die Socketoption festlegen, bevor sie gebunden ist.

Siehe auch

CObject Klasse
Hierarchiediagramm
CSocket Klasse
CSocketFile Klasse