CAsyncSocket-Klasse

Stellt einen Windows Socket dar – ein 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 einen Sockethandpunkt an ein CAsyncSocket Objekt an.
CAsyncSocket::Bind Ordnet eine lokale Adresse mit dem Socket zu.
CAsyncSocket::Close Schließt den Socket.
CAsyncSocket::Connect Stellt eine Verbindung mit einem Peer-Socket her.
CAsyncSocket::Create Erstellt einen Socket.
CAsyncSocket::CreateEx Erstellt einen Socket mit erweiterten Optionen.
CAsyncSocket::Detach Entfernt einen Sockethandpunkt von einem CAsyncSocket Objekt.
CAsyncSocket::FromHandle Gibt einen Zeiger auf ein CAsyncSocket Objekt zurück, wobei ein Sockethandpunkt angegeben wird.
CAsyncSocket::GetLastError Ruft den Fehlerstatus für den letzten Vorgang ab, der fehlgeschlagen ist.
CAsyncSocket::GetPeerName Ruft die Adresse des Peer-Sockets ab, mit dem der Socket verbunden ist.
CAsyncSocket::GetPeerNameEx Ruft die Adresse des Peer-Sockets 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 Legt einen Socket fest, um eingehende Verbindungsanforderungen zu hören.
CAsyncSocket::Receive Empfängt Daten aus dem Socket.
CAsyncSocket::ReceiveFrom Empfängt ein Datagram und speichert die Quelladresse.
CAsyncSocket::ReceiveFromEx Empfängt ein Datagram 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 aufruft Send den Socket.
CASyncSocket::Socket Weist einen Sockethandpunkt zu.

Geschützte Methoden

Name BESCHREIBUNG
CAsyncSocket::OnAccept Benachrichtigt einen Überwachungs socket, dass er ausstehende Verbindungsanforderungen durch Aufrufen Acceptakzeptieren kann.
CAsyncSocket::OnClose Benachrichtigt einen Socket, der mit dem Socket verbunden ist.
CAsyncSocket::OnConnect Benachrichtigt einen Verbindungs socket, dass der Verbindungsversuch abgeschlossen ist, ob erfolgreich oder in Fehler.
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 Abhör-Socket, dass Daten abgerufen werden sollen, indem Sie aufrufen Receive.
CAsyncSocket::OnSend Benachrichtigt einen Socket, der Daten durch Aufrufen Sendsenden kann.

Öffentliche Operatoren

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

Öffentliche Datenmember

Name BESCHREIBUNG
CAsyncSocket::m_hSocket Gibt den SOCKET an dieses CAsyncSocket Objekt angefügten Handle an.

Hinweise

Die CAsyncSocket Klasse kapselt die Windows Socketfunktionen-API, die eine objektorientierte Abstraktion für Programmierer bereitstellt, die Windows Sockets in Verbindung mit MFC verwenden möchten.

Diese Klasse basiert auf der Annahme, dass Sie netzwerkkommunikation verstehen. Sie sind verantwortlich für die Behandlung von Blockierungs-, Bytereihenunterschieden und Konvertierungen zwischen Unicode- und Multibyte-Zeichensatzzeichenfolgen (MBCS). Wenn Sie eine bequemere 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 den zugrunde liegenden Sockethandpunkt (Typ SOCKET) zu erstellen, außer bei akzeptierten Sockets. Für einen Server socket rufen Sie die Memberfunktion auf, und für einen Client socket rufen Sie die ListenConnect Memberfunktion auf. Der Server socket sollte die Accept Funktion aufrufen, nachdem eine Verbindungsanforderung empfangen wurde. Verwenden Sie die verbleibenden CAsyncSocket Funktionen, um die Kommunikation zwischen Sockets durchzuführen. Zerstören Sie nach Abschluss das CAsyncSocket Objekt, wenn sie auf dem Heap erstellt wurde; der Destruktor ruft die Close Funktion automatisch auf. Der SOCKET Datentyp wird im Artikel Windows Sockets beschrieben: Hintergrund.

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 verwendet, um die Socketbibliotheken zu initialisieren. Standardmäßig AfxSocketInit wird nur im primären Thread aufgerufen.

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

Vererbungshierarchie

CObject

CAsyncSocket

Anforderungen

Header:afxsock.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 Verbindungs sockets empfängt, wie im Netzwerk bekannt. Das genaue Format des Arguments wird durch die Adressfamilie bestimmt, die beim Erstellen des lpSockAddr Sockets eingerichtet 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 Bytes. Dies lpSockAddrLen ist ein Wertergebnisparameter: Es sollte zunächst den Abstand enthalten, der auf lpSockAddrdie zurückgegebene Adresse verweist; auf der Rückgabe wird die tatsächliche Länge (in Bytes) der zurückgegebenen Adresse enthalten.

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 Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

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

  • WSAEINPROGRESSEin blockierende Windows Sockets-Aufruf wird ausgeführt.

  • WSAEINVALListen wurde vor der Annahme nicht aufgerufen.

  • WSAEMFILE Die Warteschlange ist nach der Eingabe leer, um zu akzeptieren, und es stehen keine Deskriptoren zur Verfügung.

  • WSAENOBUFS Es ist kein Pufferspeicher verfügbar.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

  • WSAEOPNOTSUPP Der referenzierte Socket ist kein Typ, der verbindungsorientierter Dienst unterstützt.

  • WSAEWOULDBLOCK Der Socket ist als Nichtblockierung gekennzeichnet, und es werden keine Verbindungen akzeptiert.

Hinweise

Diese Routine extrahiert die erste Verbindung in der Warteschlange ausstehender Verbindungen, erstellt einen neuen Socket mit den gleichen Eigenschaften wie diesem Socket und fügt ihn an rConnectedSocket. Wenn keine ausstehenden Verbindungen in der Warteschlange vorhanden sind, Accept gibt null zurück und GetLastError gibt einen Fehler zurück. Der akzeptierte Socket (rConnectedSocket) kann nicht verwendet werden, um weitere Verbindungen zu akzeptieren. Der ursprüngliche Socket bleibt geöffnet und hört zu.

Das Argument lpSockAddr ist ein Ergebnisparameter, der mit der Adresse des Verbindungs sockets gefüllt ist, wie der Kommunikationsschicht bekannt. Accept wird mit verbindungsbasierten Sockettypen wie z SOCK_STREAM. B. verwendet.

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
Ein Bitmask, das eine Kombination aus Netzwerkereignissen angibt, in denen die Anwendung interessiert ist.

  • FD_READ Möchten Sie Benachrichtigungen zur Bereitschaft zum Lesen erhalten.

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

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

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

  • FD_CONNECT Möchten Sie Benachrichtigungen über Verbindungsergebnisse erhalten.

  • FD_CLOSE Möchten Sie Benachrichtigung erhalten, 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 Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

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

  • WSAEINPROGRESSEin 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 Nichtblockingmodus fest. Weitere Informationen finden Sie im Artikel Windows Sockets: Socketbenachrichtigungen.

CAsyncSocket::Attach

Rufen Sie diese Memberfunktion auf, um den 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 einen Handle zu einem Socket.

lEvent
Ein Bitmask, das eine Kombination aus Netzwerkereignissen angibt, in denen die Anwendung interessiert ist.

  • FD_READ Möchten Sie Benachrichtigungen zur Bereitschaft zum Lesen erhalten.

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

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

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

  • FD_CONNECT Möchten Sie Benachrichtigungen über Verbindungsergebnisse erhalten.

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

Rückgabewert

Ungleich null, wenn die Funktion erfolgreich ist.

Hinweise

Der SOCKET Handle wird im Datenelement des m_hSocket Objekts gespeichert.

CAsyncSocket::Bind

Rufen Sie diese Memberfunktion auf, um eine lokale Adresse mit dem Socket zuzuordnen.

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". Durch das Übergeben der NULL Zeichenfolge für diesen Parameter wird angegeben, dass die CAsyncSocket Instanz auf allen Netzwerkschnittstellen auf Clientaktivitäten 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 Bytes.

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 Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem 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).

  • WSAEINPROGRESSEin blockierende 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 auf einem nicht verbundenen Datagram oder Stream-Socket verwendet. Bevor sie Verbindungsanforderungen annehmen kann, muss ein Überwachungsserver-Socket eine Portnummer auswählen und durch Aufrufen BindWindows Sockets bekannt machen. Bind legt die lokale Zuordnung (Hostadresse/Portnummer) des Sockets fest, indem sie einem nicht benannten Socket einen lokalen Namen zuweisen.

CAsyncSocket::CAsyncSocket

Erstellt ein leeres Socketobjekt.

CAsyncSocket();

Hinweise

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

CAsyncSocket::Close

Schließt den Socket.

virtual void Close();

Hinweise

Diese Funktion veröffentlicht das Socketdeskriptor, sodass weitere Verweise darauf mit dem Fehler WSAENOTSOCKfehlschlagen. Wenn dies der letzte Verweis auf den zugrunde liegenden Socket ist, werden die zugeordneten Benennungsinformationen und Warteschlangendaten verworfen. Der Destruktor des Socketobjekts ruft Close Sie auf.

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

CAsyncSocket::Connect

Rufen Sie diese Memberfunktion auf, um eine Verbindung mit einem nicht verbundenen Datenstrom oder Datagram-Socket 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: ein 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 Bytes.

Rückgabewert

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

  • WSANOTINITIALISED Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAEADDRINUSE Die angegebene Adresse wird bereits verwendet.

  • WSAEINPROGRESSEin blockierende 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 Eine Zieladresse ist 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 zu diesem Zeitpunkt nicht von diesem Host 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 gekennzeichnet. Beachten Sie, dass wenn das Adressfeld der Namensstruktur alle Nullen ist, Connect null zurückgegeben wird. Rufen Sie die GetLastError Memberfunktion auf, um erweiterte Fehlerinformationen abzurufen.

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

Für einen Datagram-Socket (Typ SOCK_DGRAM) wird ein Standardziel festgelegt, das für nachfolgende Send und Receive Aufrufe 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 möchten.

nSocketType
SOCK_STREAM oder SOCK_DGRAM.

lEvent
Eine Bitmaske, die eine Kombination aus 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 von 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 Ein erfolgreicher Vorgang AfxSocketInit muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAEAFNOSUPPORT Die angegebene Adressfamilie wird nicht unterstützt.

  • WSAEINPROGRESSEin Blockierungsvorgang Windows Sockets 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 aufruft Socket und wenn dies erfolgreich verläuft, 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 Übertragungssteuerungsprotokoll (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. Beachten Sie, dass die Verbindung geschlossen wird, wenn dieses Socketobjekt außerhalb des Bereichs liegt. Rufen Sie dieses neue Socketobjekt nicht auf Create .

Wichtig

Create ist nicht threadsicher. Wenn Sie sie in einer Mehrthreadumgebung aufrufen, in der sie gleichzeitig von verschiedenen Threads aufgerufen werden könnte, sollten Sie jeden Aufruf mit einer Mutex- oder anderen Synchronisierungssperre schützen.

Weitere Informationen zu Stream- und Datagram-Sockets finden Sie in den Artikeln Windows Sockets: Hintergrundund Windows Sockets: Ports und Socketadressen undWindows 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 eine ADDRINFOT , um Socketinformationen wie die Familie und den Sockettyp zu speichern.

lEvent
Eine Bitmaske, die eine Kombination aus 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 von Sockets erhalten.

Rückgabewert

Siehe den Rückgabewert für Create().

Hinweise

Siehe die Hinweise für Create().

CAsyncSocket::Detach

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

SOCKET Detach();

CAsyncSocket::FromHandle

Gibt einen Zeiger auf ein CAsyncSocket Objekt zurück.

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

Parameter

hSocket
Enthält einen Handle an 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 den 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 Windows Sockets-API-Routine an, die von diesem Thread ausgeführt wird.

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 Windows Sockets 2-API.

CAsyncSocket::GetPeerName

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

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

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

Parameter

rPeerAddress
Verweisen Sie auf ein CString Objekt, das eine gepunktete Nummern-IP-Adresse empfängt.

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

lpSockAddr
Ein Zeiger auf die Struktur, die SOCKADDR den Namen des Peer-Sockets empfängt.

lpSockAddrLen
Ein Zeiger auf die Länge der Adresse in lpSockAddr Bytes. Bei der Rückgabe 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 Ein erfolgreicher Vorgang AfxSocketInit muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpSockAddrLen Argument ist nicht groß genug.

  • WSAEINPROGRESSEin Blockierung Windows Sockets-Aufrufs wird ausgeführt.

  • WSAENOTCONN Der Socket ist nicht verbunden.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

Hinweise

Um IPv6-Adressen zu behandeln, verwenden Sie CAsyncSocket::GetPeerNameEx.

CAsyncSocket::GetPeerNameEx

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

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

Parameter

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

rPeerPort
Verweisen sie 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 Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpSockAddrLen Argument ist nicht groß genug.

  • WSAEINPROGRESSEin blockierende 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 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
Verweisen Sie auf ein CString Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.

rSocketPort
Verweisen sie 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 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 Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpSockAddrLen Argument ist nicht groß genug.

  • WSAEINPROGRESSEin 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 Anruf ist besonders nützlich, wenn ein Connect Anruf ohne Bind ersten Vorgang durchgeführt wurde; dieser Aufruf bietet die einzige Möglichkeit, durch die 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
Verweisen Sie auf ein CString Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.

rSocketPort
Verweisen sie 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 Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpSockAddrLen Argument ist nicht groß genug.

  • WSAEINPROGRESSEin 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 ausnahme, dass es IPv6-Adressen sowie ältere Protokolle behandelt.

Dieser Anruf ist besonders nützlich, wenn ein Connect Anruf ohne Bind ersten Vorgang durchgeführt wurde; dieser Aufruf bietet die einzige Möglichkeit, durch die 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 mit der ausgewählten Option verknüpfte Wert wird im Puffer lpOptionValuezurückgegeben. Die ganze Zahl, die ursprünglich lpOptionLen auf den Wert verweist, sollte ursprünglich die Größe dieses Puffers in Bytes enthalten; und wird 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ößen im Abschnitt "Hinweise".

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

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 Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAEFAULT Das lpOptionLen Argument war ungültig.

  • WSAEINPROGRESSEin Blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAENOPROTOOPT Die Option ist unbekannt oder nicht unterstützt. Insbesondere SO_BROADCAST werden keine Sockets vom Typ , während SO_ACCEPTCONN, SO_DONTLINGERSO_LINGERSO_KEEPALIVEund SO_OOBINLINE werden nicht für Sockets des Typs SOCK_STREAMSOCK_DGRAMunterstützt.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

Hinweise

GetSockOpt ruft den aktuellen Wert für eine Socketoption ab, die einem Sockettyp 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 lpOptionValuevon . Die TCP_NODELAY Option verwendet Ebene IPPROTO_TCP; alle anderen Optionen verwenden Ebene SOL_SOCKET.

Wert Typ Bedeutung
SO_ACCEPTCONN BOOL Socket ist hören.
SO_BROADCAST BOOL Socket ist für die Übertragung von Übertragungen von Nachrichten konfiguriert.
SO_DEBUG BOOL Das Debuggen ist aktiviert.
SO_DONTLINGER BOOL Wenn true, ist die SO_LINGER Option deaktiviert.
SO_DONTROUTE BOOL Das 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 Lingeroptionen 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 Senden.
SO_TYPE int Der Typ des Sockets (z SOCK_STREAM. B. ).
TCP_NODELAY BOOL Deaktiviert den Nagle-Algorithmus für Sammelsendungen.

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

Wert Typ Bedeutung
SO_RCVLOWAT int Empfangen Sie ein Niedrigwasserzeichen.
SO_RCVTIMEO int Erhalten Sie Timeout.
SO_SNDLOWAT int Senden Sie das Wasserzeichen mit geringem Wasser.
SO_SNDTIMEO int Timeout senden.
IP_OPTIONS Abrufen von Optionen in DER IP-Kopfzeile.
TCP_MAXSEG int Abrufen der maximalen Segmentgröße von TCP.

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 im 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 Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

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

  • WSAEINPROGRESSEin Blockierter Windows Sockets-Vorgang wird ausgeführt.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

Hinweise

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

  • FIONBIO Aktivieren oder Deaktivieren des Nichtblockingmodus im Socket. Der Parameter verweist auf eine DWORD, die nichtzero ist, wenn der lpArgument Nichtblockingmodus aktiviert und null ist, wenn es deaktiviert werden soll. Wenn AsyncSelect auf einem Socket ausgestellt wurde, schlägt ein beliebiger Versuch IOCtl , den Socket auf den Blockierungsmodus festzulegen, fehl WSAEINVAL. Um den Socket auf den Blockierungsmodus zurückzusetzen und den Fehler zu verhindernWSAEINVAL, muss eine Anwendung zuerst deaktivierenAsyncSelect, indem sie mit dem lEvent Parameter gleich 0 aufrufen AsyncSelect und dann aufrufenIOCtl.

  • FIONREAD Bestimmen Sie die maximale Anzahl von Bytes, die mit einem Receive Aufruf aus diesem Socket gelesen werden können. Der lpArgument Parameter verweist auf eine DWORD Stelle, IOCtl in der das Ergebnis gespeichert wird. Wenn dieser Socket vom Typ SOCK_STREAMist, gibt die Gesamtmenge der Daten zurück, FIONREAD die in einem einzelnen Receivegelesen werden können; dies entspricht normalerweise der Gesamtmenge der Daten, die im Socket in der Warteschlange enthalten sind. Wenn dieser Socket vom Typ SOCK_DGRAMist, gibt die Größe des ersten Datagrams zurück, FIONREAD das im Socket in der Warteschlange steht.

  • 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 Empfang von Out-of-Band-Daten SO_OOBINLINE( ) konfiguriert wurde. Wenn keine Out-of-Band-Daten darauf warten, gelesen zu werden, gibt der Vorgang nonzero zurück. Andernfalls gibt es 0 zurück, und das Receive nächste oder ausgeführte Socket ruft einige oder ReceiveFrom alle Daten ab, die der "Markierung" vorausgehen; die Anwendung sollte den SIOCATMARK Vorgang verwenden, um zu bestimmen, ob daten bleiben. Wenn normale Daten vor den "dringenden" (Out-of-Band)-Daten vorhanden sind, wird sie in Der Reihenfolge empfangen. (Beachten Sie, dass ein ReceiveReceiveFrom oder niemals out-of-band- und normale Daten im gleichen Aufruf gemischt wird.) Der lpArgument Parameter verweist auf eine DWORD Stelle, IOCtl in der das Ergebnis gespeichert wird.

Diese Funktion ist eine Teilmenge, die ioctl() in Berkeley-Sockets verwendet wird. Insbesondere gibt es keinen Befehl, der dem entspricht, während SIOCATMARK der einzige Socketebenenbefehl ist, FIOASYNCder unterstützt wird.

CAsyncSocket::Listen

Rufen Sie diese Memberfunktion auf, um eingehende Verbindungsanforderungen zu hören.

BOOL Listen(int nConnectionBacklog = 5);

Parameter

nConnectionBacklog
Die maximale Länge, auf die die Warteschlange ausstehender Verbindungen wachsen kann. Gültiger Bereich ist von 1 bis 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 Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAEADDRINUSE Es wurde versucht, eine Adresse zu hören, die verwendet wird.

  • WSAEINPROGRESSEin 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 ist kein Typ, der den Listen Vorgang unterstützt.

Hinweise

Um Verbindungen zu akzeptieren, wird der Socket zuerst mit erstellt, ein Backlog für eingehende Verbindungen wird mit Createangegeben Listen, und dann werden die Verbindungen mit Acceptakzeptiert. Listen Gilt nur für Sockets, die Verbindungen unterstützen, also diejenigen des Typs SOCK_STREAM. Dieser Socket wird im "passiven" Modus eingefügt, in dem eingehende Verbindungen anerkannt und angehalten werden, bis die Annahme durch den Prozess aussteht.

Diese Funktion wird in der Regel von Servern (oder einer Beliebigen Anwendung, die Verbindungen akzeptieren möchte) verwendet, die mehrere Verbindungsanforderungen gleichzeitig haben könnten: Wenn eine Verbindungsanforderung mit der Warteschlange voll eintrifft, erhält der Client einen Fehler mit einem Hinweis auf WSAECONNREFUSED.

Listen versucht, rational zu funktionieren, wenn keine verfügbaren Ports (Descriptoren) vorhanden sind. Es akzeptiert Verbindungen, bis die Warteschlange leer ist. Wenn Ports verfügbar sind, wird eine spätere ListenAccept Aufrufe der Warteschlange an den aktuellen oder aktuellsten "Backlog" nach Möglichkeit erneut ausgefüllt und die Überwachung eingehender Verbindungen fortgesetzt.

CAsyncSocket::m_hSocket

Enthält den SOCKET Handle für den von diesem CAsyncSocket Objekt gekapselten Socket.

SOCKET m_hSocket;

CAsyncSocket::OnAccept

Wird vom Framework aufgerufen, um einen Überwachungs socket zu benachrichtigen, der ausstehende Verbindungsanforderungen annehmen kann, indem die Accept Memberfunktion aufgerufen wird.

virtual void OnAccept(int nErrorCode);

Parameter

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

  • 0 Die Funktion wurde erfolgreich ausgeführt.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem 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 neueste Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnClose Memberfunktion:

  • 0 Die Funktion wurde erfolgreich ausgeführt.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem 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 Verbindungs socket zu benachrichtigen, dass der Verbindungsversuch abgeschlossen ist, unabhängig davon, ob erfolgreich oder in Fehler.

virtual void OnConnect(int nErrorCode);

Parameter

nErrorCode
Der neueste 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 Eine Zieladresse ist 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 zu diesem Zeitpunkt nicht von diesem Host 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 und kein Socket.

  • WSAETIMEDOUT Der Versuch, timedout herzustellen, ohne eine Verbindung herzustellen.

Hinweise

Hinweis

In CSocket, die OnConnect Benachrichtigungsfunktion wird nie aufgerufen. Für Verbindungen rufen ConnectSie einfach auf, was zurückgegeben wird, wenn die Verbindung abgeschlossen ist (entweder erfolgreich oder im Fehler). 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 neueste Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnOutOfBandData Memberfunktion:

  • 0 Die Funktion wurde erfolgreich ausgeführt.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

Hinweise

Out-of-Band-Daten sind ein logischer unabhängiger Kanal, der jedem paar verbundenen Sockets des Typs SOCK_STREAMzugeordnet ist. Der Kanal wird im Allgemeinen verwendet, um dringende Daten zu senden.

MFC unterstützt Out-of-Band-Daten, aber Benutzer der Klasse CAsyncSocket werden davon abgehindert, 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 neueste Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnReceive Memberfunktion:

  • 0 Die Funktion wurde erfolgreich ausgeführt.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem 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 es jetzt Daten senden kann, indem die Memberfunktion aufgerufen Send wird.

virtual void OnSend(int nErrorCode);

Parameter

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

  • 0 Die Funktion wurde erfolgreich ausgeführt.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem 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 den SOCKET Handle des CAsyncSocket Objekts abzurufen.

operator SOCKET() const;

Rückgabewert

Wenn das SOCKET Objekt erfolgreich verläuft, wird der Handle des Objekts ausgeführt; andernfalls NULL.

Hinweise

Mit dem Handle können Sie Windows APIs direkt aufrufen.

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

nFlags
Gibt die Art und Weise an, in der der Aufruf vorgenommen wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem sie eine der folgenden Werte mit dem C++-Bitzeiger ODER-Operator () kombinieren (|):

  • MSG_PEEK Sehen Sie sich die eingehenden Daten an. 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 gibt die Anzahl der empfangenen Bytes zurück. Wenn die Verbindung geschlossen wurde, gibt sie 0 zurück. Andernfalls kann ein Wert von SOCKET_ERROR zurückgegeben werden, und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAENOTCONN Der Socket ist nicht verbunden.

  • WSAEINPROGRESSEin 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 auf nHow 0 oder 2 festgelegt wurde.

  • WSAEWOULDBLOCK Der Socket wird als Nichtblockierung markiert und der Receive Vorgang würde blockiert.

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

  • WSAEINVAL Der Socket wurde nicht mit Bind.

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

  • WSAECONNRESET Die virtuelle Schaltung wurde von der Remoteseite zurückgesetzt.

Hinweise

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

Für Sockets des Typs SOCK_STREAMwerden so viele Informationen wie derzeit bis zur Größe des bereitgestellten Puffers zurückgegeben. Wenn der Socket für den 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 gelesen werden sollen.

Für Datagram-Sockets werden Daten aus dem ersten enqueuierten Datagram extrahiert, bis zur Größe des bereitgestellten Puffers. Wenn das Datagram größer als der bereitgestellte Puffer ist, wird der Puffer mit dem ersten Teil des Datagrams gefüllt, die übersteigenden Daten verloren gehen und Receive einen Wert SOCKET_ERROR mit dem Fehlercode zurückgibt, auf den der Fehlercode festgelegt WSAEMSGSIZEist. Wenn keine eingehenden Daten im Socket verfügbar sind, wird ein Wert SOCKET_ERROR zurückgegeben, der mit dem Fehlercode festgelegt WSAEWOULDBLOCKist. Die OnReceive Rückruffunktion kann verwendet werden, um zu ermitteln, wann weitere Daten ankommen.

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

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

Beispiel

Siehe das Beispiel für CAsyncSocket::OnReceive.

CAsyncSocket::ReceiveFrom

Rufen Sie diese Memberfunktion auf, um ein Datagram 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 Bytes.

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

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

lpSockAddr
Ein Zeiger auf eine SOCKADDR Struktur, die die Quelladresse enthält, wenn sie zurückgegeben wird.

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

nFlags
Gibt die Art und Weise an, in der der Aufruf vorgenommen wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem sie eine der folgenden Werte mit dem C++-Bitzeiger ODER-Operator () kombinieren (|):

  • MSG_PEEK Sehen Sie sich die eingehenden Daten an. 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 gibt die Anzahl der empfangenen Bytes zurück. Wenn die Verbindung geschlossen wurde, gibt sie 0 zurück. Andernfalls kann ein Wert zurückgegeben SOCKET_ERROR werden, und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Ein erfolgreicher Vorgang AfxSocketInit muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAEFAULT Das Argument war ungültig: Der lpSockAddrLenlpSockAddr Puffer war zu klein, um die Peeradresse zu berücksichtigen.

  • WSAEINPROGRESSEin Blockierungsvorgang Windows Sockets wird ausgeführt.

  • WSAEINVAL Der Socket wurde nicht mit 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 blockiert.

  • WSAEMSGSIZE Das Datagram war zu groß, um in den angegebenen Puffer einzupassen und 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, aus der die Daten gesendet wurden.

Um IPv6-Adressen zu behandeln, verwenden Sie CAsyncSocket::ReceiveFromEx.

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 gelesen werden sollen. Die lpSockAddr Parameter werden lpSockAddrLen für SOCK_STREAM Sockets ignoriert.

Für Datagram-Sockets werden Daten aus dem ersten enqueuierten Datagram bis zur Größe des bereitgestellten Puffers extrahiert. Wenn das Datagram größer als der bereitgestellte Puffer ist, wird der Puffer mit dem ersten Teil der Nachricht gefüllt, die übersteigenden Daten gehen verloren und ReceiveFrom gibt einen Wert SOCKET_ERROR mit dem Fehlercode zurück, der auf WSAEMSGSIZEden Fehlercode festgelegt ist.

Wenn lpSockAddr es sich nicht um einen Fehler 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 der auf die Größe dieser Struktur verweist, wird initialisiert und wird auf der Rückgabe geändert, um die tatsächliche Größe der dort gespeicherten Adresse anzugeben. Wenn keine eingehenden Daten im Socket verfügbar sind, wartet der ReceiveFrom Anruf, bis Daten eintreffen, es sei denn, der Socket ist nicht blockiert. In diesem Fall wird ein Wert von SOCKET_ERROR zurückgegeben, der mit dem auf den Fehlercode festgelegt WSAEWOULDBLOCKist. Der OnReceive Rückruf 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 eine ReceiveFrom sofort mit 0 Bytes abgeschlossen.

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

rSocketAddress
Verweisen Sie auf ein CString Objekt, das eine gepunktete Nummern-IP-Adresse empfängt.

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

nFlags
Gibt die Art und Weise an, in der der Anruf ausgeführt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem eine der folgenden Werte mit dem C++-Bitzeiger ODER-Operator () kombiniert wird:|

  • MSG_PEEK Sehen Sie sich die eingehenden Daten an. 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 gibt die Anzahl der empfangenen Bytes zurück. Wenn die Verbindung geschlossen wurde, gibt sie 0 zurück. Andernfalls kann ein Wert zurückgegeben SOCKET_ERROR werden, und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Ein erfolgreicher Vorgang AfxSocketInit muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAEFAULT Das Argument war ungültig: Der lpSockAddrLenlpSockAddr Puffer war zu klein, um die Peeradresse zu berücksichtigen.

  • WSAEINPROGRESSEin Blockierungsvorgang Windows Sockets wird ausgeführt.

  • WSAEINVAL Der Socket wurde nicht mit 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 blockiert.

  • WSAEMSGSIZE Das Datagram war zu groß, um in den angegebenen Puffer einzupassen und 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, aus 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 gelesen werden sollen. Die lpSockAddr Parameter werden lpSockAddrLen für SOCK_STREAM Sockets ignoriert.

Für Datagram-Sockets werden Daten aus dem ersten enqueuierten Datagram bis zur Größe des bereitgestellten Puffers extrahiert. Wenn das Datagram größer als der bereitgestellte Puffer ist, wird der Puffer mit dem ersten Teil der Nachricht gefüllt, die übersteigenden Daten gehen verloren und ReceiveFromEx gibt einen Wert SOCKET_ERROR mit dem Fehlercode zurück, der auf WSAEMSGSIZEden Fehlercode festgelegt ist.

Wenn lpSockAddr es sich nicht um einen Fehler 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 der auf die Größe dieser Struktur verweist, wird initialisiert und wird auf der Rückgabe geändert, um die tatsächliche Größe der dort gespeicherten Adresse anzugeben. Wenn keine eingehenden Daten im Socket verfügbar sind, wartet der ReceiveFromEx Anruf, bis Daten eintreffen, es sei denn, der Socket ist nicht blockiert. In diesem Fall wird ein Wert von SOCKET_ERROR zurückgegeben, der mit dem auf den Fehlercode festgelegt WSAEWOULDBLOCKist. Der OnReceive Rückruf 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 eine ReceiveFromEx sofort mit 0 Bytes abgeschlossen.

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

nFlags
Gibt die Art und Weise an, in der der Anruf ausgeführt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem eine der folgenden Werte mit dem C++-Bitzeiger ODER-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 von 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 sein kann als die durch nBufLen.) Andernfalls kann ein Wert zurückgegeben SOCKET_ERROR werden, und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Ein erfolgreicher Vorgang AfxSocketInit muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

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

  • WSAEINPROGRESSEin Blockierungsvorgang Windows Sockets wird ausgeführt.

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

  • WSAENETRESETDie Verbindung muss zurückgesetzt werden, da die Windows Sockets-Implementierung sie verworfen hat.

  • WSAENOBUFSDie Windows Sockets-Implementierung 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 blockiert.

  • WSAEMSGSIZEDer Socket ist vom Typ SOCK_DGRAM, und das Datagram ist größer als das maximum, das von der Windows Sockets-Implementierung unterstützt wird.

  • WSAEINVAL Der Socket wurde nicht mit 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 Datagram-Sockets zu schreiben. Für Datagram-Sockets muss die maximale IP-Paketgröße der zugrunde liegenden Subnetze nicht überschritten werden, die vom iMaxUdpDg Element in der WSADATA von der Struktur zurückgegebenen AfxSocketInitStruktur angegeben wird. Wenn die Daten zu lang sind, um atomisch über das zugrunde liegende Protokoll zu übergeben, wird der Fehler WSAEMSGSIZE über GetLastError, und es werden keine Daten übertragen.

Beachten Sie, dass für einen Datagram-Socket der erfolgreiche Abschluss einer Daten Send nicht darauf hinweist, dass die Daten erfolgreich übermittelt wurden.

Bei CAsyncSocket Objekten des Typs SOCK_STREAMkann die Anzahl der geschriebenen Bytes zwischen 1 und der angeforderten Länge bestehen, je nach Pufferverfügbarkeit sowohl auf den lokalen als auch auf ausländischen Hosts.

Beispiel

Weitere Informationen finden Sie im 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 Bytes.

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 ausgeführt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem eine der folgenden Werte mit dem C++-Bitzeiger ODER-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 von 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 Bytes.

Rückgabewert

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

  • WSANOTINITIALISED Ein erfolgreicher Vorgang AfxSocketInit muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

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

  • WSAEINPROGRESSEin Blockierungsvorgang Windows Sockets wird ausgeführt.

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

  • WSAEINVAL Der Hostname ist ungültig.

  • WSAENETRESETDie Verbindung muss zurückgesetzt werden, da die Windows Sockets-Implementierung sie verworfen hat.

  • WSAENOBUFSDie Windows Sockets-Implementierung 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 blockiert.

  • WSAEMSGSIZEDer Socket ist vom Typ SOCK_DGRAM, und das Datagram ist größer als das maximum, das von der Windows Sockets-Implementierung unterstützt wird.

  • 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 Eine Zieladresse ist erforderlich.

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

Hinweise

SendTo wird für Datagram- oder Stream-Sockets verwendet und wird verwendet, um ausgehende Daten in einem Socket zu schreiben. Für Datagram-Sockets muss die maximale IP-Paketgröße der zugrunde liegenden Subnetze nicht überschritten werden, die vom iMaxUdpDg Element in der WSADATA struktur ausgefüllten Struktur angegeben AfxSocketInitwird. 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 angibt, 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 lpSockAddr vom Parameter identifiziert wird.

Um eine Übertragung (nur auf einer SOCK_DGRAM einzigen) Zu senden, sollte die Adresse im lpSockAddr Parameter zusammen mit der beabsichtigten Portnummer mithilfe der speziellen IP-Adresse INADDR_BROADCAST (definiert in der Windows Sockets-HeaderdateiWINSOCK.H) erstellt werden. Oder, wenn der lpszHostAddress Parameter lautet NULL, wird der Socket für die Übertragung konfiguriert. Es ist in der Regel unannehmbar, dass ein Broadcast-Datagramm die Größe überschreitet, in der fragmentiert werden kann, was bedeutet, dass der Datenteil des Datagrams (ohne Kopfzeilen) 512 Bytes nicht überschreiten sollte.

Um IPv6-Adressen zu behandeln, verwenden Sie CAsyncSocket::SendToEx.

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

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 ausgeführt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags Parameter bestimmt. Letzteres wird erstellt, indem eine der folgenden Werte mit dem C++-Bitzeiger ODER-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 von 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 sein kann als die durch nBufLen.) Andernfalls kann ein Wert zurückgegeben SOCKET_ERROR werden, und ein bestimmter Fehlercode kann durch Aufrufen GetLastErrorabgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:

  • WSANOTINITIALISED Ein erfolgreicher Vorgang AfxSocketInit muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

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

  • WSAEINPROGRESSEin Blockierungsvorgang Windows Sockets wird ausgeführt.

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

  • WSAEINVAL Der Hostname ist ungültig.

  • WSAENETRESETDie Verbindung muss zurückgesetzt werden, da die Windows Sockets-Implementierung sie verworfen hat.

  • WSAENOBUFSDie Windows Sockets-Implementierung 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 blockiert.

  • WSAEMSGSIZEDer Socket ist vom Typ SOCK_DGRAM, und das Datagram ist größer als das maximum, das von der Windows Sockets-Implementierung unterstützt wird.

  • 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 Eine Zieladresse ist erforderlich.

  • WSAENETUNREACH Das Netzwerk kann zu diesem Zeitpunkt nicht von diesem Host erreicht werden.

Hinweise

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

SendToEx wird für Datagram- oder Stream-Sockets verwendet und wird verwendet, um ausgehende Daten in einem Socket zu schreiben. Für Datagram-Sockets muss die maximale IP-Paketgröße der zugrunde liegenden Subnetze nicht überschritten werden, die vom iMaxUdpDg Element in der WSADATA struktur ausgefüllten AfxSocketInitStruktur angegeben wird. Wenn die Daten zu lang sind, um atomisch über das zugrunde liegende Protokoll zu übergeben, wird der Fehler WSAEMSGSIZE zurückgegeben, und keine Daten werden übertragen.

Beachten Sie, dass der erfolgreiche Abschluss einer Nachricht SendToEx nicht angibt, dass die Daten erfolgreich übermittelt wurden.

SendToEx wird nur in einem SOCK_DGRAM Socket verwendet, um ein Datagram an einen bestimmten Socket zu senden, der lpSockAddr vom Parameter identifiziert wird.

Um eine Übertragung (nur nur auf einer SOCK_DGRAM Einzigen) zu senden, sollte die Adresse im Parameter mithilfe der speziellen IP-Adresse INADDR_BROADCAST (definiert in der lpSockAddr Windows Sockets-Headerdatei WINSOCK.H) zusammen mit der vorgesehenen Portnummer erstellt werden. Oder wenn der Parameter NULLlautet, wird der lpszHostAddress Socket für die Übertragung konfiguriert. Es ist in der Regel nicht möglich, dass ein Übertragungsdatenogramm die Größe überschreitet, bei der die Fragmentierung auftreten kann, was bedeutet, dass der Datenteil des Datagrams (außer Kopfzeilen) 512 Bytes 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 lpOptionValue Puffers in Bytes.

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 Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

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

  • WSAEINPROGRESSEin Blockierter Windows Sockets-Vorgang wird ausgeführt.

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

  • WSAENETRESET Die Verbindung hat zeitlimitiert, wenn SO_KEEPALIVE sie festgelegt ist.

  • WSAENOPROTOOPT Die Option ist unbekannt oder nicht unterstützt. Insbesondere SO_BROADCAST werden keine Sockets vom Typ , während SO_DONTLINGER, SO_LINGERSO_KEEPALIVEund SO_OOBINLINE nicht für Sockets des Typs SOCK_STREAMSOCK_DGRAMunterstützt werden.

  • WSAENOTCONN Die Verbindung wurde zurückgesetzt, wenn SO_KEEPALIVE sie festgelegt ist.

  • WSAENOTSOCK Der Deskriptor ist kein Socket.

Hinweise

SetSockOpt legt den aktuellen Wert für eine Socketoption fest, die einem Sockettyp zugeordnet ist, in jedem Zustand. 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 und so weiter.

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

SO_LINGER steuert die Aktion, die ausgeführt wird, wenn nicht angezeigte Daten in 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, Binddie bereits verwendet wird. Gelegentlich kann es jedoch wünschenswert sein, eine Adresse auf diese Weise wiederzuverwenden. Da jede Verbindung durch die Kombination von lokalen und Remoteadressen eindeutig identifiziert wird, gibt es kein Problem mit zwei Sockets, die an dieselbe lokale Adresse gebunden sind, solange die Remoteadressen unterschiedlich sind.

Um die Windows Sockets-Implementierung 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 auf einem Socket festzulegen, der nicht an eine vorhandene Adresse gebunden ist, und festlegen oder zurücksetzen, nachdem der Bind Anruf keine Auswirkungen auf dieses oder andere Socket hat.

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

Die TCP_NODELAY Option deaktiviert den Nagle-Algorithmus. Der Nagle-Algorithmus wird verwendet, um die Anzahl von kleinen Paketen zu reduzieren, die von einem Host gesendet werden, indem nicht bekannte Gesendete Daten gepuffert werden, bis ein vollformatiertes Paket gesendet werden kann. Für einige Anwendungen kann dieser Algorithmus jedoch die Leistung beeinträchtigen und TCP_NODELAY zum Deaktivieren verwendet werden. Anwendungsautoren sollten nicht festgelegt TCP_NODELAY werden, es sei denn, die Auswirkungen der Ausführung sind gut verstanden und gewünscht, da die Einstellung TCP_NODELAY eine erhebliche negative Auswirkung 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 geben Ausgabedebuginformationen an, wenn die SO_DEBUG Option von einer Anwendung festgelegt wird.

Die folgenden Optionen werden für SetSockOpt. Der Typ identifiziert den Typ der lpOptionValuevon .

Wert Typ Bedeutung
SO_BROADCAST BOOL Zulassen der Übertragung von Übertragungen auf dem Socket.
SO_DEBUG BOOL Zeichnet Debuginformationen auf.
SO_DONTLINGER BOOL Blockieren Sie nicht Close , bis nicht gesendete Daten gesendet werden. Das Festlegen dieser Option entspricht der Einstellung mit festgelegtem SO_LINGER Wert auf l_onoff Null.
SO_DONTROUTE BOOL Weiterleiten Sie nicht: Direkt an die Schnittstelle senden.
SO_KEEPALIVE BOOL Senden Sie Keep-Alives.
SO_LINGER struct LINGER Lingern Sie, Close wenn nicht vorhandene 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 empfangene Nachrichten an.
SO_REUSEADDR BOOL Zulassen, dass der Socket an eine Adresse gebunden werden kann, die bereits verwendet wird. (Siehe Bind.)
SO_SNDBUF int Geben Sie die Puffergröße für Senden an.
TCP_NODELAY BOOL Deaktiviert den Nagle-Algorithmus für Sammelsendungen.

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

Wert Typ Bedeutung
SO_ACCEPTCONN BOOL Socket ist hören
SO_ERROR int Fehlerstatus abrufen und löschen.
SO_RCVLOWAT int Empfangen Sie ein Niedrigwasserzeichen.
SO_RCVTIMEO int Empfangstimeout
SO_SNDLOWAT int Senden Sie das Wasserzeichen mit geringem Wasser.
SO_SNDTIMEO int Timeout senden.
SO_TYPE int Typ des Sockets.
IP_OPTIONS Legen Sie das Feld "Optionen" in IP-Header fest.

CAsyncSocket::ShutDown

Rufen Sie diese Memberfunktion auf, um Senden, 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, indem die folgenden aufgezählten Werte verwendet werden:

  • empfängt = 0

  • sendet = 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 Ein erfolgreicher AfxSocketInit Vorgang muss erfolgen, bevor diese API verwendet wird.

  • WSAENETDOWNDie Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.

  • WSAEINVALnHow ist ungültig.

  • WSAEINPROGRESSEin 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 ausgelastet 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. Ist nHow 1, werden nachfolgende Senden nicht zugelassen. 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 wird. Eine Anwendung sollte sich nicht darauf verlassen, einen Socket nach dem Herunterfahren wiederverwenden zu können. Insbesondere ist eine Windows Sockets-Implementierung nicht erforderlich, um die Verwendung eines Connect solchen Sockets zu unterstützen.

Beispiel

Weitere Informationen finden Sie im Beispiel für CAsyncSocket::OnReceive.

CASyncSocket::Socket

Ordnet 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 aus 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 die Socketschließung 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 einen Sockethandpunkt zu. Sie ruft nicht auf 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 die Socketoption festlegen CAsyncSocket::SetSockOpt , bevor sie gebunden ist.

Siehe auch

CObject Klasse
Hierarchiediagramm
CSocket Klasse
CSocketFile Klasse