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 Accept akzeptieren 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 Send senden 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 Listen
Connect
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
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 NULL
sind, 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 lpSockAddr
die 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEFAULT
DaslpSockAddrLen
Argument ist zu klein (kleiner als die Größe einerSOCKADDR
Struktur).WSAEINPROGRESS
Ein blockierende Windows Sockets-Aufruf wird ausgeführt.WSAEINVAL
Listen
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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEINVAL
Gibt an, dass eine 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 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 GetLastError
abgerufen 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 erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEADDRINUSE
Die angegebene Adresse wird bereits verwendet. (Siehe dieSO_REUSEADDR
Socketoption unterSetSockOpt
.)WSAEFAULT
DasnSockAddrLen
Argument ist zu klein (kleiner als die Größe einerSOCKADDR
Struktur).WSAEINPROGRESS
Ein 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 Bind
Windows 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 WSAENOTSOCK
fehlschlagen. 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 GetLastError
abgerufen 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 erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEADDRINUSE
Die angegebene Adresse wird bereits verwendet.WSAEINPROGRESS
Ein 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
DasnSockAddrLen
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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicher VorgangAfxSocketInit
muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEAFNOSUPPORT
Die angegebene Adressfamilie wird nicht unterstützt.WSAEINPROGRESS
Ein 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, leeresCSocket
Objekt als Parameter. Sie müssen dieses Objekt erstellen, bevor Sie aufrufenAccept
. Beachten Sie, dass die Verbindung geschlossen wird, wenn dieses Socketobjekt außerhalb des Bereichs liegt. Rufen Sie dieses neue Socketobjekt nicht aufCreate
.
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 hSocket
ist.
Hinweise
Wenn ein Handle angegeben wird, wenn ein SOCKET
CAsyncSocket
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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicher VorgangAfxSocketInit
muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEFAULT
DaslpSockAddrLen
Argument ist nicht groß genug.WSAEINPROGRESS
Ein 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEFAULT
DaslpSockAddrLen
Argument ist nicht groß genug.WSAEINPROGRESS
Ein 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEFAULT
DaslpSockAddrLen
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 mitBind
.
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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEFAULT
DaslpSockAddrLen
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 mitBind
.
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 lpOptionValue
zurü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 GetLastError
abgerufen werden. Wenn eine Option nie mit SetSockOpt
festgelegt wurde, gibt GetSockOpt
sie den Standardwert für die Option zurück. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEFAULT
DaslpOptionLen
Argument war ungültig.WSAEINPROGRESS
Ein Blockierter Windows Sockets-Vorgang wird ausgeführt.WSAENOPROTOOPT
Die Option ist unbekannt oder nicht unterstützt. InsbesondereSO_BROADCAST
werden keine Sockets vom Typ , währendSO_ACCEPTCONN
,SO_DONTLINGER
SO_LINGER
SO_KEEPALIVE
undSO_OOBINLINE
werden nicht für Sockets des TypsSOCK_STREAM
SOCK_DGRAM
unterstü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 lpOptionValue
von . 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 GetLastError
dem 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEINVAL
lCommand
ist kein gültiger Befehl oder ist kein zulässiger Parameter fürlCommand
, oderlpArgument
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 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 eineDWORD
, die nichtzero ist, wenn derlpArgument
Nichtblockingmodus aktiviert und null ist, wenn es deaktiviert werden soll. WennAsyncSelect
auf einem Socket ausgestellt wurde, schlägt ein beliebiger VersuchIOCtl
, den Socket auf den Blockierungsmodus festzulegen, fehlWSAEINVAL
. Um den Socket auf den Blockierungsmodus zurückzusetzen und den Fehler zu verhindernWSAEINVAL
, muss eine Anwendung zuerst deaktivierenAsyncSelect
, indem sie mit demlEvent
Parameter gleich 0 aufrufenAsyncSelect
und dann aufrufenIOCtl
.FIONREAD
Bestimmen Sie die maximale Anzahl von Bytes, die mit einemReceive
Aufruf aus diesem Socket gelesen werden können. DerlpArgument
Parameter verweist auf eineDWORD
Stelle,IOCtl
in der das Ergebnis gespeichert wird. Wenn dieser Socket vom TypSOCK_STREAM
ist, gibt die Gesamtmenge der Daten zurück,FIONREAD
die in einem einzelnenReceive
gelesen werden können; dies entspricht normalerweise der Gesamtmenge der Daten, die im Socket in der Warteschlange enthalten sind. Wenn dieser Socket vom TypSOCK_DGRAM
ist, 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 TypSOCK_STREAM
, der für den Empfang von Out-of-Band-DatenSO_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 dasReceive
nächste oder ausgeführte Socket ruft einige oderReceiveFrom
alle Daten ab, die der "Markierung" vorausgehen; die Anwendung sollte denSIOCATMARK
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 einReceive
ReceiveFrom
oder niemals out-of-band- und normale Daten im gleichen Aufruf gemischt wird.) DerlpArgument
Parameter verweist auf eineDWORD
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, FIOASYNC
der 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEADDRINUSE
Es wurde versucht, eine Adresse zu hören, die verwendet wird.WSAEINPROGRESS
Ein Blockierter Windows Sockets-Vorgang wird ausgeführt.WSAEINVAL
Der Socket wurde nicht mitBind
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 denListen
Vorgang unterstützt.
Hinweise
Um Verbindungen zu akzeptieren, wird der Socket zuerst mit erstellt, ein Backlog für eingehende Verbindungen wird mit Create
angegeben Listen
, und dann werden die Verbindungen mit Accept
akzeptiert. 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 Listen
Accept
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.
WSAENETDOWN
Die 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.
WSAENETDOWN
Die 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
DaslpSockAddrLen
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 Connect
Sie 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.
WSAENETDOWN
Die 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_STREAM
zugeordnet 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.
WSAENETDOWN
Die 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.
WSAENETDOWN
Die 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAENOTCONN
Der Socket ist nicht verbunden.WSAEINPROGRESS
Ein Blockierter Windows Sockets-Vorgang wird ausgeführt.WSAENOTSOCK
Der Deskriptor ist kein Socket.WSAEOPNOTSUPP
MSG_OOB
wurde angegeben, aber der Socket ist nicht vom TypSOCK_STREAM
.WSAESHUTDOWN
Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufenReceive
, nachdemShutDown
er aufnHow
0 oder 2 festgelegt wurde.WSAEWOULDBLOCK
Der Socket wird als Nichtblockierung markiert und derReceive
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 mitBind
.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_STREAM
werden 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 WSAEMSGSIZE
ist. Wenn keine eingehenden Daten im Socket verfügbar sind, wird ein Wert SOCKET_ERROR
zurückgegeben, der mit dem Fehlercode festgelegt WSAEWOULDBLOCK
ist. 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 WSAECONNRESET
fehl.
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 rSocketAddress
zu 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicher VorgangAfxSocketInit
muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEFAULT
Das Argument war ungültig: DerlpSockAddrLen
lpSockAddr
Puffer war zu klein, um die Peeradresse zu berücksichtigen.WSAEINPROGRESS
Ein Blockierungsvorgang Windows Sockets wird ausgeführt.WSAEINVAL
Der Socket wurde nicht mitBind
.WSAENOTCONN
Der Socket ist nicht verbunden (SOCK_STREAM
nur).WSAENOTSOCK
Der Deskriptor ist kein Socket.WSAEOPNOTSUPP
MSG_OOB
wurde angegeben, aber der Socket ist nicht vom TypSOCK_STREAM
.WSAESHUTDOWN
Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufenReceiveFrom
, nachdemShutDown
er mitnHow
"0" oder "2" aufgerufen wurde.WSAEWOULDBLOCK
Der Socket ist als Nichtblockierung gekennzeichnet und derReceiveFrom
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_STREAM
werden 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 WSAEMSGSIZE
den Fehlercode festgelegt ist.
Wenn lpSockAddr
es sich nicht um einen Fehler handelt, und der Socket vom Typ SOCK_DGRAM
ist, 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 WSAEWOULDBLOCK
ist. 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicher VorgangAfxSocketInit
muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEFAULT
Das Argument war ungültig: DerlpSockAddrLen
lpSockAddr
Puffer war zu klein, um die Peeradresse zu berücksichtigen.WSAEINPROGRESS
Ein Blockierungsvorgang Windows Sockets wird ausgeführt.WSAEINVAL
Der Socket wurde nicht mitBind
.WSAENOTCONN
Der Socket ist nicht verbunden (SOCK_STREAM
nur).WSAENOTSOCK
Der Deskriptor ist kein Socket.WSAEOPNOTSUPP
MSG_OOB
wurde angegeben, aber der Socket ist nicht vom TypSOCK_STREAM
.WSAESHUTDOWN
Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufenReceiveFromEx
, nachdemShutDown
er mitnHow
"0" oder "2" aufgerufen wurde.WSAEWOULDBLOCK
Der Socket ist als Nichtblockierung gekennzeichnet und derReceiveFromEx
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_STREAM
werden 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 WSAEMSGSIZE
den Fehlercode festgelegt ist.
Wenn lpSockAddr
es sich nicht um einen Fehler handelt, und der Socket vom Typ SOCK_DGRAM
ist, 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 WSAEWOULDBLOCK
ist. 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicher VorgangAfxSocketInit
muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die 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.WSAEINPROGRESS
Ein Blockierungsvorgang Windows Sockets wird ausgeführt.WSAEFAULT
DaslpBuf
Argument befindet sich nicht in einem gültigen Teil des Benutzeradressenbereichs.WSAENETRESET
Die Verbindung muss zurückgesetzt werden, da die Windows Sockets-Implementierung sie verworfen hat.WSAENOBUFS
Die Windows Sockets-Implementierung meldet einen Puffer-Deadlock.WSAENOTCONN
Der Socket ist nicht verbunden.WSAENOTSOCK
Der Deskriptor ist kein Socket.WSAEOPNOTSUPP
MSG_OOB
wurde angegeben, aber der Socket ist nicht vom TypSOCK_STREAM
.WSAESHUTDOWN
Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufenSend
, nachdemShutDown
er mitnHow
"1" oder "2" aufgerufen wurde.WSAEWOULDBLOCK
Der Socket ist als Nichtblockierung gekennzeichnet, und der angeforderte Vorgang würde blockiert.WSAEMSGSIZE
Der Socket ist vom TypSOCK_DGRAM
, und das Datagram ist größer als das maximum, das von der Windows Sockets-Implementierung unterstützt wird.WSAEINVAL
Der Socket wurde nicht mitBind
.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 AfxSocketInit
Struktur 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_STREAM
kann 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicher VorgangAfxSocketInit
muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die 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.WSAEINPROGRESS
Ein Blockierungsvorgang Windows Sockets wird ausgeführt.WSAEFAULT
DielpBuf
ParameterlpSockAddr
sind nicht Teil des Benutzeradressenbereichs, oder daslpSockAddr
Argument ist zu klein (kleiner als die Größe einerSOCKADDR
Struktur).WSAEINVAL
Der Hostname ist ungültig.WSAENETRESET
Die Verbindung muss zurückgesetzt werden, da die Windows Sockets-Implementierung sie verworfen hat.WSAENOBUFS
Die Windows Sockets-Implementierung meldet einen Puffer-Deadlock.WSAENOTCONN
Der Socket ist nicht verbunden (SOCK_STREAM
nur).WSAENOTSOCK
Der Deskriptor ist kein Socket.WSAEOPNOTSUPP
MSG_OOB
wurde angegeben, aber der Socket ist nicht vom TypSOCK_STREAM
.WSAESHUTDOWN
Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufenSendTo
, nachdemShutDown
er mitnHow
"1" oder "2" aufgerufen wurde.WSAEWOULDBLOCK
Der Socket ist als Nichtblockierung gekennzeichnet, und der angeforderte Vorgang würde blockiert.WSAEMSGSIZE
Der Socket ist vom TypSOCK_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 AfxSocketInit
wird. 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicher VorgangAfxSocketInit
muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die 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.WSAEINPROGRESS
Ein Blockierungsvorgang Windows Sockets wird ausgeführt.WSAEFAULT
DielpBuf
ParameterlpSockAddr
sind nicht Teil des Benutzeradressenbereichs, oder daslpSockAddr
Argument ist zu klein (kleiner als die Größe einerSOCKADDR
Struktur).WSAEINVAL
Der Hostname ist ungültig.WSAENETRESET
Die Verbindung muss zurückgesetzt werden, da die Windows Sockets-Implementierung sie verworfen hat.WSAENOBUFS
Die Windows Sockets-Implementierung meldet einen Puffer-Deadlock.WSAENOTCONN
Der Socket ist nicht verbunden (SOCK_STREAM
nur).WSAENOTSOCK
Der Deskriptor ist kein Socket.WSAEOPNOTSUPP
MSG_OOB
wurde angegeben, aber der Socket ist nicht vom TypSOCK_STREAM
.WSAESHUTDOWN
Der Socket wurde heruntergefahren; Es ist nicht möglich, einen Socket aufzurufenSendToEx
, nachdemShutDown
er mitnHow
"1" oder "2" aufgerufen wurde.WSAEWOULDBLOCK
Der Socket ist als Nichtblockierung gekennzeichnet, und der angeforderte Vorgang würde blockiert.WSAEMSGSIZE
Der Socket ist vom TypSOCK_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 AfxSocketInit
Struktur 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 NULL
lautet, 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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEFAULT
lpOptionValue
ist nicht in einem gültigen Teil des Prozessadressenbereichs enthalten.WSAEINPROGRESS
Ein Blockierter Windows Sockets-Vorgang wird ausgeführt.WSAEINVAL
nLevel
ist ungültig, oder die InformationenlpOptionValue
in sind ungültig.WSAENETRESET
Die Verbindung hat zeitlimitiert, wennSO_KEEPALIVE
sie festgelegt ist.WSAENOPROTOOPT
Die Option ist unbekannt oder nicht unterstützt. InsbesondereSO_BROADCAST
werden keine Sockets vom Typ , währendSO_DONTLINGER
,SO_LINGER
SO_KEEPALIVE
undSO_OOBINLINE
nicht für Sockets des TypsSOCK_STREAM
SOCK_DGRAM
unterstützt werden.WSAENOTCONN
Die Verbindung wurde zurückgesetzt, wennSO_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, Bind
die 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_TCP
verwendet; 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 lpOptionValue
von .
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 GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Ein erfolgreicherAfxSocketInit
Vorgang muss erfolgen, bevor diese API verwendet wird.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerk-Subsystem fehlgeschlagen ist.WSAEINVAL
nHow
ist ungü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 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