CAsyncSocket
-Klasse
Stellt einen Windows-Socket dar – einen Endpunkt der Netzwerkkommunikation.
Syntax
class CAsyncSocket : public CObject
Member
Öffentliche Konstruktoren
Name | Beschreibung |
---|---|
CAsyncSocket::CAsyncSocket |
Erstellt ein CAsyncSocket -Objekt. |
Öffentliche Methoden
Name | Beschreibung |
---|---|
CAsyncSocket::Accept |
Akzeptiert eine Verbindung im Socket. |
CAsyncSocket::AsyncSelect |
Fordert ereignisbenachrichtigung für den Socket an. |
CAsyncSocket::Attach |
Fügt ein Sockethandle an ein CAsyncSocket Objekt an. |
CAsyncSocket::Bind |
Ordnet eine lokale Adresse dem Socket zu. |
CAsyncSocket::Close |
Schließt den Socket. |
CAsyncSocket::Connect |
Stellt eine Verbindung mit einem Peersocket her. |
CAsyncSocket::Create |
Erstellt einen Socket. |
CAsyncSocket::CreateEx |
Erstellt einen Socket mit erweiterten Optionen. |
CAsyncSocket::Detach |
Trennt ein Sockethandle von einem CAsyncSocket Objekt. |
CAsyncSocket::FromHandle |
Gibt einen Zeiger auf ein CAsyncSocket Objekt zurück, wenn ein Sockethandle angegeben ist. |
CAsyncSocket::GetLastError |
Ruft den Fehlerstatus für den letzten fehlgeschlagenen Vorgang ab. |
CAsyncSocket::GetPeerName |
Ruft die Adresse des Peersockets ab, mit dem der Socket verbunden ist. |
CAsyncSocket::GetPeerNameEx |
Ruft die Adresse des Peersockets ab, mit dem der Socket verbunden ist (behandelt IPv6-Adressen). |
CAsyncSocket::GetSockName |
Ruft den lokalen Namen für einen Socket ab. |
CAsyncSocket::GetSockNameEx |
Ruft den lokalen Namen für einen Socket ab (behandelt IPv6-Adressen). |
CAsyncSocket::GetSockOpt |
Ruft eine Socketoption ab. |
CAsyncSocket::IOCtl |
Steuert den Modus des Sockets. |
CAsyncSocket::Listen |
Richtet einen Socket ein, der auf eingehende Verbindungsanforderungen lauscht. |
CAsyncSocket::Receive |
Empfängt Daten aus dem Socket. |
CAsyncSocket::ReceiveFrom |
Empfängt ein Datagramm und speichert die Quelladresse. |
CAsyncSocket::ReceiveFromEx |
Empfängt ein Datagramm und speichert die Quelladresse (behandelt IPv6-Adressen). |
CAsyncSocket::Send |
Sendet Daten an einen verbundenen Socket. |
CAsyncSocket::SendTo |
Sendet Daten an ein bestimmtes Ziel. |
CAsyncSocket::SendToEx |
Sendet Daten an ein bestimmtes Ziel (behandelt IPv6-Adressen). |
CAsyncSocket::SetSockOpt |
Legt eine Socketoption fest. |
CAsyncSocket::ShutDown |
Deaktiviert und/oder Receive Aufrufe Send für den Socket. |
CASyncSocket::Socket |
Weist einen Socketziehpunkt zu. |
Geschützte Methoden
Name | Beschreibung |
---|---|
CAsyncSocket::OnAccept |
Benachrichtigt einen Überwachungssocket, dass er ausstehende Verbindungsanforderungen durch Aufrufen Accept annehmen kann. |
CAsyncSocket::OnClose |
Benachrichtigt einen Socket, dass der mit dem Socket verbundene Socket geschlossen wurde. |
CAsyncSocket::OnConnect |
Benachrichtigt einen Verbindungssocket, ob der Verbindungsversuch erfolgreich oder fehlerhaft ist. |
CAsyncSocket::OnOutOfBandData |
Benachrichtigt einen empfangenden Socket, dass out-of-band-Daten im Socket gelesen werden sollen, in der Regel eine dringende Nachricht. |
CAsyncSocket::OnReceive |
Benachrichtigt einen Überwachungssocket, dass daten durch Aufrufen Receive abgerufen werden sollen. |
CAsyncSocket::OnSend |
Benachrichtigt einen Socket, dass er Daten senden kann, indem er aufruft Send . |
Öffentliche Operatoren
Name | Beschreibung |
---|---|
CAsyncSocket::operator = | Weist einem CAsyncSocket Objekt einen neuen Wert zu. |
CAsyncSocket::operator SOCKET | Verwenden Sie diesen Operator, um das SOCKET Handle des CAsyncSocket Objekts abzurufen. |
Öffentliche Datenmember
Name | Beschreibung |
---|---|
CAsyncSocket::m_hSocket |
Gibt das SOCKET an dieses CAsyncSocket Objekt angefügte Handle an. |
Hinweise
Die Klasse CAsyncSocket
kapselt die Windows Socket Functions-API und stellt eine objektorientierte Abstraktion für Programmierer bereit, die Windows-Sockets in Verbindung mit MFC verwenden möchten.
Diese Klasse basiert auf der Annahme, dass Sie die Netzwerkkommunikation verstehen. Sie sind für die Behandlung von Blockierungs-, Bytereihenfolge-Unterschieden und Konvertierungen zwischen Unicode- und MBCS-Zeichenfolgen (Multibyte Character Set) verantwortlich. Wenn Sie eine komfortablere Schnittstelle benötigen, die diese Probleme für Sie verwaltet, lesen Sie die Klasse CSocket
.
Um ein CAsyncSocket
Objekt zu verwenden, rufen Sie den Konstruktor auf, und rufen Sie dann die Create
Funktion auf, um das zugrunde liegende Sockethandle (Typ SOCKET
) zu erstellen, mit Ausnahme von akzeptierten Sockets. Rufen Sie für einen Serversocket die Listen
Memberfunktion auf, und für einen Clientsocket rufen Sie die Connect
Memberfunktion auf. Der Serversocket sollte die Accept
Funktion beim Empfang einer Verbindungsanforderung aufrufen. Verwenden Sie die verbleibenden CAsyncSocket
Funktionen, um die Kommunikation zwischen Sockets durchzuführen. Nach Abschluss zerstören Sie das CAsyncSocket
Objekt, wenn es auf dem Heap erstellt wurde; der Destruktor ruft die Close
Funktion automatisch auf. Der SOCKET
Datentyp wird im Artikel Windows Sockets: Background beschrieben.
Hinweis
Wenn Sie MFC-Sockets in sekundären Threads in einer statisch verknüpften MFC-Anwendung verwenden, müssen Sie in jedem Thread aufrufen AfxSocketInit
, der Sockets zum Initialisieren der Socketbibliotheken verwendet. Standardmäßig AfxSocketInit
wird nur im primären Thread aufgerufen.
Weitere Informationen finden Sie unter Windows Sockets: Verwenden von Klassen CAsyncSocket
und verwandten Artikeln sowie windows Sockets 2-API.
Vererbungshierarchie
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 Verbindungssockets empfängt, wie im Netzwerk bekannt. Das genaue Format des lpSockAddr
Arguments wird durch die Adressfamilie bestimmt, die beim Erstellen des Sockets festgelegt wurde. Wenn lpSockAddr
und/oder lpSockAddrLen
gleich NULL
sind, werden keine Informationen zur Remoteadresse des akzeptierten Sockets zurückgegeben.
lpSockAddrLen
Ein Zeiger auf die Länge der Adresse in lpSockAddr
Byte. Dies lpSockAddrLen
ist ein Wertergebnisparameter: Sie sollte zunächst den Abstand enthalten, auf lpSockAddr
den verwiesen wird; beim Zurückgeben enthält sie die tatsächliche Länge (in Byte) der zurückgegebenen Adresse.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEFAULT
DaslpSockAddrLen
Argument ist zu klein (kleiner als die Größe einerSOCKADDR
Struktur).WSAEINPROGRESS
Ein blockierter Windows Sockets-Aufruf wird ausgeführt.WSAEINVAL
Listen
wurde vor der Annahme nicht aufgerufen.WSAEMFILE
Die Warteschlange ist nach der Eingabe leer, um sie anzunehmen, und es sind keine Deskriptoren verfügbar.WSAENOBUFS
Es ist kein Pufferspeicher verfügbar.WSAENOTSOCK
Der Deskriptor ist kein Socket.WSAEOPNOTSUPP
Der referenzierte Socket ist kein Typ, der verbindungsorientierte Dienste unterstützt.WSAEWOULDBLOCK
Der Socket ist als Nichtblockierung gekennzeichnet, und es sind keine Verbindungen zulässig.
Hinweise
Diese Routine extrahiert die erste Verbindung in der Warteschlange ausstehender Verbindungen, erstellt einen neuen Socket mit den gleichen Eigenschaften wie diesen Socket und fügt sie an rConnectedSocket
. Wenn keine ausstehenden Verbindungen in der Warteschlange vorhanden sind, Accept
wird null zurückgegeben und GetLastError
ein Fehler zurückgegeben. Der akzeptierte Socket (rConnectedSocket
) kann nicht verwendet werden, um weitere Verbindungen zu akzeptieren. Der ursprüngliche Socket bleibt geöffnet und hört zu.
Das Argument lpSockAddr
ist ein Ergebnisparameter, der mit der Adresse des Verbindungssockets gefüllt ist, wie es für die Kommunikationsschicht bekannt ist. Accept
wird mit verbindungsbasierten Sockettypen verwendet, z SOCK_STREAM
. B. .
CAsyncSocket::AsyncSelect
Rufen Sie diese Memberfunktion auf, um ereignisbenachrichtigungen für einen Socket anzufordern.
BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameter
lEvent
Eine Bitmaske, die eine Kombination von Netzwerkereignissen angibt, an denen die Anwendung interessiert ist.
FD_READ
Möchten Sie eine Benachrichtigung über die Bereitschaft zum Lesen erhalten.FD_WRITE
Möchten Sie eine Benachrichtigung erhalten, wenn Daten gelesen werden können.FD_OOB
Möchten Sie eine Benachrichtigung über die Ankunft von Out-of-Band-Daten erhalten.FD_ACCEPT
Möchten Sie Benachrichtigungen über eingehende Verbindungen empfangen.FD_CONNECT
Möchten Sie eine Benachrichtigung über Verbindungsergebnisse erhalten.FD_CLOSE
Möchten Sie eine Benachrichtigung empfangen, wenn ein Socket von einem Peer geschlossen wurde.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEINVAL
Gibt an, dass einer der angegebenen Parameter ungültig war.WSAEINPROGRESS
Ein blockierter Windows Sockets-Vorgang wird ausgeführt.
Hinweise
Diese Funktion wird verwendet, um anzugeben, welche MFC-Rückrufbenachrichtigungsfunktionen für den Socket aufgerufen werden. AsyncSelect
Legt diesen Socket automatisch auf den Nichtblockierungsmodus fest. Weitere Informationen finden Sie im Artikel Windows Sockets: Socketbenachrichtigungen.
CAsyncSocket::Attach
Rufen Sie diese Memberfunktion auf, um das hSocket
Handle an ein CAsyncSocket
Objekt anzufügen.
BOOL Attach(
SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameter
hSocket
Enthält ein Handle für einen Socket.
lEvent
Eine Bitmaske, die eine Kombination von Netzwerkereignissen angibt, an denen die Anwendung interessiert ist.
FD_READ
Möchten Sie eine Benachrichtigung über die Bereitschaft zum Lesen erhalten.FD_WRITE
Möchten Sie eine Benachrichtigung erhalten, wenn Daten gelesen werden können.FD_OOB
Möchten Sie eine Benachrichtigung über die Ankunft von Out-of-Band-Daten erhalten.FD_ACCEPT
Möchten Sie Benachrichtigungen über eingehende Verbindungen empfangen.FD_CONNECT
Möchten Sie eine Benachrichtigung über Verbindungsergebnisse erhalten.FD_CLOSE
Möchten Sie eine Benachrichtigung empfangen, wenn ein Socket von einem Peer geschlossen wurde.
Rückgabewert
Ungleich null, wenn die Funktion erfolgreich ist.
Hinweise
Das SOCKET
Handle wird im Datenelement des m_hSocket
Objekts gespeichert.
CAsyncSocket::Bind
Rufen Sie diese Memberfunktion auf, um eine lokale Adresse mit dem Socket zu verknüpfen.
BOOL Bind(
UINT nSocketPort,
LPCTSTR lpszSocketAddress = NULL);
BOOL Bind (
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parameter
nSocketPort
Der Port, der die Socketanwendung identifiziert.
lpszSocketAddress
Die Netzwerkadresse, eine gepunktete Zahl wie "128.56.22.8". Wenn Sie die NULL
Zeichenfolge für diesen Parameter übergeben, wird angegeben, dass die CAsyncSocket
Instanz auf Clientaktivitäten auf allen Netzwerkschnittstellen lauschen soll.
lpSockAddr
Ein Zeiger auf eine SOCKADDR
Struktur, die die Adresse enthält, die diesem Socket zugewiesen werden soll.
nSockAddrLen
Die Länge der Adresse in lpSockAddr
Byte.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen 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
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem 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 blockierter Windows Sockets-Aufruf wird ausgeführt.WSAEAFNOSUPPORT
Die angegebene Adressfamilie wird von diesem Port nicht unterstützt.WSAEINVAL
Der Socket ist bereits an eine Adresse gebunden.WSAENOBUFS
Nicht genügend Puffer verfügbar, zu viele Verbindungen.WSAENOTSOCK
Der Deskriptor ist kein Socket.
Hinweise
Diese Routine wird vor nachfolgenden Connect
oder Listen
Aufrufen für ein nicht verbundenes Datagramm oder Datenstromsocket verwendet. Bevor verbindungsanforderungen akzeptiert werden können, muss ein Überwachungsserversocket eine Portnummer auswählen und windows-Sockets durch Aufrufen Bind
bekannt machen. Bind
richtet die lokale Zuordnung (Hostadresse/Portnummer) des Sockets ein, indem einem nicht benannten Socket ein lokaler Name zugewiesen wird.
CAsyncSocket::CAsyncSocket
Erstellt ein leeres Socketobjekt.
CAsyncSocket();
Hinweise
Nach dem Erstellen des Objekts müssen Sie die Create
Memberfunktion aufrufen, um die Datenstruktur zu erstellen und ihre SOCKET
Adresse zu binden. (Auf der Serverseite einer Windows Sockets-Kommunikation, wenn der Überwachungssocket einen Socket erstellt, der Accept
im Anruf verwendet werden soll, rufen Sie diesen Socket nicht auf Create
.)
CAsyncSocket::Close
Schließt den Socket.
virtual void Close();
Hinweise
Diese Funktion gibt den Socketdeskriptor frei, sodass weitere Verweise darauf mit dem Fehler WSAENOTSOCK
fehlschlagen. Wenn dies der letzte Verweis auf den zugrunde liegenden Socket ist, werden die zugehörigen Benennungsinformationen und in die Warteschlange eingereihten Daten verworfen. Der Destruktor des Socketobjekts ruft Close
Sie auf.
Für CAsyncSocket
, aber nicht für CSocket
, die Semantik von Close
werden von den Socketoptionen SO_LINGER
und SO_DONTLINGER
. Weitere Informationen finden Sie unter Memberfunktion GetSockOpt
.
CAsyncSocket::Connect
Rufen Sie diese Memberfunktion auf, um eine Verbindung mit einem nicht verbundenen Datenstrom- oder Datagrammsocket herzustellen.
BOOL Connect(
LPCTSTR lpszHostAddress,
UINT nHostPort);
BOOL Connect(
const SOCKADDR* lpSockAddr,
int nSockAddrLen);
Parameter
lpszHostAddress
Die Netzwerkadresse des Sockets, mit dem dieses Objekt verbunden ist: computername wie "ftp.microsoft.com" oder eine gepunktete Zahl wie "128.56.22.8".
nHostPort
Der Port, der die Socketanwendung identifiziert.
lpSockAddr
Ein Zeiger auf eine SOCKADDR
Struktur, die die Adresse des verbundenen Sockets enthält.
nSockAddrLen
Die Länge der Adresse in lpSockAddr
Byte.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Wenn dies auf einen Fehlercode hinweist WSAEWOULDBLOCK
und ihre Anwendung die überschreibbaren Rückrufe verwendet, erhält Ihre Anwendung eine OnConnect
Meldung, wenn der Verbindungsvorgang abgeschlossen ist. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEADDRINUSE
Die angegebene Adresse wird bereits verwendet.WSAEINPROGRESS
Ein blockierter Windows Sockets-Aufruf wird ausgeführt.WSAEADDRNOTAVAIL
Die angegebene Adresse ist vom lokalen Computer nicht verfügbar.WSAEAFNOSUPPORT
Adressen in der angegebenen Familie können nicht mit diesem Socket verwendet werden.WSAECONNREFUSED
Der Versuch, eine Verbindung herzustellen, wurde abgelehnt.WSAEDESTADDRREQ
Es ist eine Zieladresse erforderlich.WSAEFAULT
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 derzeit nicht von diesem Host aus erreicht werden.WSAENOBUFS
Es ist kein Pufferspeicher verfügbar. Der Socket kann nicht verbunden werden.WSAENOTSOCK
Der Deskriptor ist kein Socket.WSAETIMEDOUT
Versuchen Sie, einen Timeout herzustellen, ohne eine Verbindung herzustellen.WSAEWOULDBLOCK
Der Socket ist als Nichtblockierung gekennzeichnet, und die Verbindung kann nicht sofort abgeschlossen werden.
Hinweise
Wenn der Socket ungebunden ist, werden eindeutige Werte der lokalen Zuordnung durch das System zugewiesen, und der Socket wird als gebunden markiert. Beachten Sie, dass, wenn das Adressfeld der Namensstruktur alle Nullen ist, Connect
Null zurückgibt. Rufen Sie die GetLastError
Memberfunktion auf, um erweiterte Fehlerinformationen zu erhalten.
Für Datenstromsockets (Typ SOCK_STREAM
) wird eine aktive Verbindung mit dem fremden Host initiiert. Wenn der Socketaufruf erfolgreich abgeschlossen ist, kann der Socket Daten senden/empfangen.
Für einen Datagrammsocket (TypSOCK_DGRAM
) wird ein Standardziel festgelegt, das für nachfolgende Aufrufe Receive
Send
verwendet wird.
CAsyncSocket::Create
Rufen Sie die Create
Memberfunktion nach dem Erstellen eines Socketobjekts auf, um den Windows-Socket zu erstellen und anzufügen.
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
LPCTSTR lpszSocketAddress = NULL);
Parameter
nSocketPort
Ein bekannter Port, der mit dem Socket verwendet werden soll, oder 0, wenn Windows Sockets einen Port auswählen sollen.
nSocketType
SOCK_STREAM
oder SOCK_DGRAM
lEvent
Eine Bitmaske, die eine Kombination von Netzwerkereignissen angibt, an denen die Anwendung interessiert ist.
FD_READ
Möchten Sie eine Benachrichtigung über die Bereitschaft zum Lesen erhalten.FD_WRITE
Möchten Sie eine Benachrichtigung über die Bereitschaft zum Schreiben erhalten.FD_OOB
Möchten Sie eine Benachrichtigung über die Ankunft von Out-of-Band-Daten erhalten.FD_ACCEPT
Möchten Sie Benachrichtigungen über eingehende Verbindungen empfangen.FD_CONNECT
Möchten Sie eine Benachrichtigung über die abgeschlossene Verbindung erhalten.FD_CLOSE
Möchten Sie eine Benachrichtigung über das Schließen des Sockets erhalten.
lpszSockAddress
Ein Zeiger auf eine Zeichenfolge, die die Netzwerkadresse des verbundenen Sockets enthält, eine gepunktete Zahl wie "128.56.22.8". Wenn Sie die NULL
Zeichenfolge für diesen Parameter übergeben, wird angegeben, dass die CAsyncSocket
Instanz auf Clientaktivitäten auf allen Netzwerkschnittstellen lauschen soll.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEAFNOSUPPORT
Die angegebene Adressfamilie wird nicht unterstützt.WSAEINPROGRESS
Ein blockierter Windows Sockets-Vorgang wird ausgeführt.WSAEMFILE
Es sind keine weiteren Dateideskriptoren verfügbar.WSAENOBUFS
Es ist kein Pufferspeicher verfügbar. Der Socket kann nicht erstellt werden.WSAEPROTONOSUPPORT
Der angegebene Port wird nicht unterstützt.WSAEPROTOTYPE
Der angegebene Port ist der falsche Typ für diesen Socket.WSAESOCKTNOSUPPORT
Der angegebene Sockettyp wird in dieser Adressfamilie nicht unterstützt.
Hinweise
Create
Aufrufe Socket
und bei erfolgreicher Ausführung wird aufgerufen Bind
, um den Socket an die angegebene Adresse zu binden. Die folgenden Sockettypen werden unterstützt:
SOCK_STREAM
Stellt sequenzierte, zuverlässige, vollduplexe, verbindungsbasierte Bytestreams bereit. Verwendet das Transmission Control Protocol (TCP) für die Internetadressenfamilie.SOCK_DGRAM
Unterstützt Datagramme, die verbindungslose, unzuverlässige Pakete einer festen (normalerweise kleinen) maximalen Länge sind. Verwendet das User Datagram Protocol (UDP) für die Internetadressenfamilie.Hinweis
Die
Accept
Memberfunktion verwendet einen Verweis auf ein neues, leeresCSocket
Objekt als Parameter. Sie müssen dieses Objekt erstellen, bevor Sie aufrufenAccept
. Denken Sie daran, dass die Verbindung geschlossen wird, wenn dieses Socketobjekt den Gültigkeitsbereich überschreitet. Rufen Sie dieses neue Socketobjekt nicht aufCreate
.
Wichtig
Create
ist nicht threadsicher. Wenn Sie ihn in einer Multithreadumgebung aufrufen, in der er gleichzeitig von verschiedenen Threads aufgerufen werden kann, sollten Sie jeden Aufruf mit einem Mutex oder einer anderen Synchronisierungssperre schützen.
Weitere Informationen zu Stream- und Datagrammsockets finden Sie in den Artikeln Windows Sockets: Hintergrund und Windows Sockets: Ports und Socketadressen und Windows Sockets 2-API.
CAsyncSocket::CreateEx
Rufen Sie die CreateEx
Memberfunktion nach dem Erstellen eines Socketobjekts auf, um den Windows-Socket zu erstellen und anzufügen.
Verwenden Sie diese Funktion, wenn Sie erweiterte Optionen wie den Sockettyp angeben müssen.
BOOL CreateEx(
ADDRINFOT* pAI,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
Parameter
pAI
Ein Zeiger auf einen ADDRINFOT
, der Socketinformationen enthält, z. B. die Familie und den Sockettyp.
lEvent
Eine Bitmaske, die eine Kombination von Netzwerkereignissen angibt, an denen die Anwendung interessiert ist.
FD_READ
Möchten Sie eine Benachrichtigung über die Bereitschaft zum Lesen erhalten.FD_WRITE
Möchten Sie eine Benachrichtigung über die Bereitschaft zum Schreiben erhalten.FD_OOB
Möchten Sie eine Benachrichtigung über die Ankunft von Out-of-Band-Daten erhalten.FD_ACCEPT
Möchten Sie Benachrichtigungen über eingehende Verbindungen empfangen.FD_CONNECT
Möchten Sie eine Benachrichtigung über die abgeschlossene Verbindung erhalten.FD_CLOSE
Möchten Sie eine Benachrichtigung über das Schließen des Sockets erhalten.
Rückgabewert
Weitere Informationen finden Sie im Rückgabewert für Create()
.
Hinweise
Weitere Informationen finden Sie in den Hinweisen.Create()
CAsyncSocket::Detach
Rufen Sie diese Memberfunktion auf, um das SOCKET
Handle im m_hSocket
Datenelement vom CAsyncSocket
Objekt zu trennen und auf .m_hSocket
NULL
SOCKET Detach();
CAsyncSocket::FromHandle
Gibt einen Zeiger auf ein CAsyncSocket
Objekt zurück.
static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);
Parameter
hSocket
Enthält ein Handle für einen Socket.
Rückgabewert
Ein Zeiger auf ein CAsyncSocket
Objekt oder NULL
wenn kein CAsyncSocket
Objekt angefügt hSocket
ist.
Hinweise
Wenn ein Handle angegeben wird, wenn ein SOCKET
CAsyncSocket
Objekt nicht an das Handle angefügt ist, gibt die Memberfunktion zurück NULL
.
CAsyncSocket::GetLastError
Rufen Sie diese Memberfunktion auf, um den Fehlerstatus für den letzten fehlgeschlagenen Vorgang abzurufen.
static int PASCAL GetLastError();
Rückgabewert
Der Rückgabewert gibt den Fehlercode für die letzte Von diesem Thread ausgeführte Windows Sockets-API-Routine an.
Hinweise
Wenn eine bestimmte Memberfunktion angibt, dass ein Fehler aufgetreten ist, sollte aufgerufen werden, GetLastError
um den entsprechenden Fehlercode abzurufen. Eine Liste der anwendbaren Fehlercodes finden Sie in den Beschreibungen der einzelnen Memberfunktionen.
Weitere Informationen zu den Fehlercodes finden Sie unter der Windows Sockets 2-API.
CAsyncSocket::GetPeerName
Rufen Sie diese Memberfunktion auf, um die Adresse des Peersockets abzurufen, mit dem dieser Socket verbunden ist.
BOOL GetPeerName(
CString& rPeerAddress,
UINT& rPeerPort);
BOOL GetPeerName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parameter
rPeerAddress
Verweis auf ein CString
Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.
rPeerPort
Verweisen auf einen UINT
Port, der einen Port speichert.
lpSockAddr
Ein Zeiger auf die Struktur, die SOCKADDR
den Namen des Peersockets empfängt.
lpSockAddrLen
Ein Zeiger auf die Länge der Adresse in lpSockAddr
Byte. Beim Zurückgeben enthält das lpSockAddrLen
Argument die tatsächliche Größe der lpSockAddr
zurückgegebenen Bytes.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEFAULT
DaslpSockAddrLen
Argument ist nicht groß genug.WSAEINPROGRESS
Ein blockierter Windows Sockets-Aufruf wird ausgeführt.WSAENOTCONN
Der Socket ist nicht verbunden.WSAENOTSOCK
Der Deskriptor ist kein Socket.
Hinweise
Verwenden Sie zum Behandeln von CAsyncSocket::GetPeerNameEx
IPv6-Adressen .
CAsyncSocket::GetPeerNameEx
Rufen Sie diese Memberfunktion auf, um die Adresse des Peersockets abzurufen, mit dem dieser Socket verbunden ist (behandelt IPv6-Adressen).
BOOL GetPeerNameEx(
CString& rPeerAddress,
UINT& rPeerPort);
Parameter
rPeerAddress
Verweis auf ein CString
Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.
rPeerPort
Verweisen auf einen UINT
Port, der einen Port speichert.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEFAULT
DaslpSockAddrLen
Argument ist nicht groß genug.WSAEINPROGRESS
Ein blockierter Windows Sockets-Aufruf wird ausgeführt.WSAENOTCONN
Der Socket ist nicht verbunden.WSAENOTSOCK
Der Deskriptor ist kein Socket.
Hinweise
Diese Funktion ist identisch mit CAsyncSocket::GetPeerName
der Ausnahme, dass sie IPv6-Adressen sowie ältere Protokolle behandelt.
CAsyncSocket::GetSockName
Rufen Sie diese Memberfunktion auf, um den lokalen Namen für einen Socket abzurufen.
BOOL GetSockName(
CString& rSocketAddress,
UINT& rSocketPort);
BOOL GetSockName(
SOCKADDR* lpSockAddr,
int* lpSockAddrLen);
Parameter
rSocketAddress
Verweis auf ein CString
Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.
rSocketPort
Verweisen auf einen UINT
Port, der einen Port speichert.
lpSockAddr
Ein Zeiger auf eine SOCKADDR
Struktur, die die Adresse des Sockets empfängt.
lpSockAddrLen
Ein Zeiger auf die Länge der Adresse in lpSockAddr
Byte.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem 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 besonders nützlich, wenn ein Connect
Anruf durchgeführt wurde, ohne zuerst zu Bind
tun. Dieser Aufruf stellt die einzige Möglichkeit bereit, mit der Sie die lokale Zuordnung bestimmen können, die vom System festgelegt wurde.
Verwenden Sie zum Behandeln von IPv6-Adressen CAsyncSocket::GetSockNameEx
CAsyncSocket::GetSockNameEx
Rufen Sie diese Memberfunktion auf, um den lokalen Namen für einen Socket abzurufen (behandelt IPv6-Adressen).
BOOL GetSockNameEx(
CString& rSocketAddress,
UINT& rSocketPort);
Parameter
rSocketAddress
Verweis auf ein CString
Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.
rSocketPort
Verweisen auf einen UINT
Port, der einen Port speichert.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem 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
der Ausnahme, dass er IPv6-Adressen sowie ältere Protokolle verarbeitet.
Dieser Aufruf ist besonders nützlich, wenn ein Connect
Anruf durchgeführt wurde, ohne zuerst zu Bind
tun. Dieser Aufruf stellt die einzige Möglichkeit bereit, mit der Sie die lokale Zuordnung bestimmen können, die vom System festgelegt wurde.
CAsyncSocket::GetSockOpt
Rufen Sie diese Memberfunktion auf, um eine Socketoption abzurufen.
BOOL GetSockOpt(
int nOptionName,
void* lpOptionValue,
int* lpOptionLen,
int nLevel = SOL_SOCKET);
Parameter
nOptionName
Die Socketoption, für die der Wert abgerufen werden soll.
lpOptionValue
Ein Zeiger auf den Puffer, in dem der Wert für die angeforderte Option zurückgegeben werden soll. Der wert, der der ausgewählten Option zugeordnet ist, wird im Puffer lpOptionValue
zurückgegeben. Die ganze Zahl, auf lpOptionLen
die verwiesen wird, sollte ursprünglich die Größe dieses Puffers in Byte enthalten. Im Gegenzug wird sie auf die Größe des zurückgegebenen Werts festgelegt. Für SO_LINGER
, dies ist die Größe einer LINGER
Struktur; für alle anderen Optionen ist es die Größe eines BOOL oder einer int
, abhängig von der Option. Weitere Informationen finden Sie in der Liste der Optionen und deren Größe im Abschnitt "Hinweise".
lpOptionLen
Ein Zeiger auf die Größe des lpOptionValue
Puffers in Byte.
nLevel
Die Ebene, auf der die Option definiert ist; die einzigen unterstützten Ebenen sind SOL_SOCKET
und IPPROTO_TCP
.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen 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
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem 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
wird für Sockets vom TypSOCK_STREAM
",", "SO_ACCEPTCONN
SO_DONTLINGER
,SO_KEEPALIVE
SO_LINGER
" und ", " nicht unterstützt, undSO_OOBINLINE
werden für Sockets vom TypSOCK_DGRAM
nicht unterstützt.WSAENOTSOCK
Der Deskriptor ist kein Socket.
Hinweise
GetSockOpt
ruft den aktuellen Wert für eine Socketoption ab, die einem Socket eines beliebigen Typs zugeordnet ist, in jedem Zustand und speichert das Ergebnis in lpOptionValue
. Optionen wirken sich auf Socketvorgänge aus, z. B. das Routing von Paketen, die Out-of-Band-Datenübertragung usw.
Die folgenden Optionen werden für GetSockOpt
. Der Typ identifiziert den Typ der daten adressiert von lpOptionValue
. Die TCP_NODELAY
Option verwendet Ebene IPPROTO_TCP
; alle anderen Optionen verwenden Ebene SOL_SOCKET
.
Wert | Typ | Bedeutung |
---|---|---|
SO_ACCEPTCONN |
BOOL |
Socket überwacht. |
SO_BROADCAST |
BOOL |
Socket ist für die Übertragung von Übertragungsnachrichten konfiguriert. |
SO_DEBUG |
BOOL |
Debugging ist aktiviert. |
SO_DONTLINGER |
BOOL |
Wenn true, ist die SO_LINGER Option deaktiviert. |
SO_DONTROUTE |
BOOL |
Routing ist deaktiviert. |
SO_ERROR |
int |
Abrufen des Fehlerstatus und Löschens. |
SO_KEEPALIVE |
BOOL |
Keep-Alives werden gesendet. |
SO_LINGER |
struct LINGER |
Gibt die aktuellen Verweiloptionen zurück. |
SO_OOBINLINE |
BOOL |
Out-of-Band-Daten werden im normalen Datenstrom empfangen. |
SO_RCVBUF |
int |
Puffergröße für Empfänge. |
SO_REUSEADDR |
BOOL |
Der Socket kann an eine adresse gebunden werden, die bereits verwendet wird. |
SO_SNDBUF |
int |
Puffergröße für Sendedaten. |
SO_TYPE |
int |
Der Typ des Sockets (z. B SOCK_STREAM . ). |
TCP_NODELAY |
BOOL |
Deaktiviert den Nagle-Algorithmus für Sammelsendungen. |
Die BSD-Optionen (Berkeley Software Distribution) werden nicht unterstützt für GetSockOpt
:
Wert | Typ | Bedeutung |
---|---|---|
SO_RCVLOWAT |
int |
Erhalten Sie ein Wasserzeichen mit geringem Wasser. |
SO_RCVTIMEO |
int |
Timeout empfangen. |
SO_SNDLOWAT |
int |
Senden Sie ein Wasserzeichen mit geringem Wasser. |
SO_SNDTIMEO |
int |
Timeout senden. |
IP_OPTIONS |
Ruft Optionen im IP-Header ab. | |
TCP_MAXSEG |
int |
Abrufen der maximalen TCP-Segmentgröße. |
Das Aufrufen GetSockOpt
mit einer nicht unterstützten Option führt zu einem Fehlercode, von 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 für den Socket ausgeführt werden soll.
lpArgument
Ein Zeiger auf einen Parameter für lCommand
.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEINVAL
lCommand
ist kein gültiger Befehl oderlpArgument
kein zulässiger Parameter fürlCommand
, oder der Befehl gilt nicht für den typ des bereitgestellten Sockets.WSAEINPROGRESS
Ein blockierter Windows Sockets-Vorgang wird ausgeführt.WSAENOTSOCK
Der Deskriptor ist kein Socket.
Hinweise
Diese Routine kann für jeden Socket in jedem Zustand verwendet werden. Es wird verwendet, um Betriebsparameter abzurufen oder abzurufen, die dem Socket zugeordnet sind, unabhängig vom Protokoll- und Kommunikationssubsystem. Die folgenden Befehle werden unterstützt:
FIONBIO
Aktivieren oder Deaktivieren des Nichtblockingmodus im Socket. DerlpArgument
Parameter verweist auf einDWORD
, das ungleich null ist, wenn der Nichtblockierungsmodus aktiviert werden soll, und null, wenn er deaktiviert werden soll. WennAsyncSelect
für einen Socket ausgegeben wurde, schlägt jeder Versuch,IOCtl
den Socket wieder auf den Blockierungsmodus festzulegen, fehl.WSAEINVAL
Um den Socket wieder auf den Blockierungsmodus festzulegen und denWSAEINVAL
Fehler zu verhindern, muss eine Anwendung zuerst durch AufrufenAsyncSelect
deslEvent
Parameters gleich 0 deaktivierenAsyncSelect
und dann aufrufenIOCtl
.FIONREAD
Ermitteln Sie die maximale Anzahl von Bytes, die mit einemReceive
Aufruf aus diesem Socket gelesen werden können. DerlpArgument
Parameter verweist auf einDWORD
Objekt, in demIOCtl
das Ergebnis gespeichert wird. Wenn dieser Socket vom TypSOCK_STREAM
ist,FIONREAD
gibt die Gesamtmenge der Daten zurück, die in einem einzelnenReceive
gelesen werden können. Dies entspricht normalerweise der Gesamtmenge der Daten, die im Socket in die Warteschlange gestellt werden. Wenn dieser Socket vom TypSOCK_DGRAM
ist, wird die Größe des ersten Datagramms zurückgegeben,FIONREAD
das im Socket in die Warteschlange gestellt wird.SIOCATMARK
Ermitteln Sie, ob alle Out-of-Band-Daten gelesen wurden. Dies gilt nur für einen Socket vom TypSOCK_STREAM
, der für den In-Line-Empfang von Out-of-Band-Daten (SO_OOBINLINE
) konfiguriert wurde. Wenn keine Out-of-Band-Daten gelesen werden müssen, gibt der Vorgang "nonzero" zurück. Andernfalls wird "0" zurückgegeben, und die nächsteReceive
oderReceiveFrom
für den Socket ausgeführte Daten ruft einige oder alle Daten ab, die dem "Mark" vorausgehen. Die Anwendung sollte denSIOCATMARK
Vorgang verwenden, um zu bestimmen, ob Daten verbleiben. Wenn es normale Daten vor den "dringenden" (Out-of-Band)-Daten gibt, werden sie in der Reihenfolge empfangen. (Beachten Sie, dass einReceive
oderReceiveFrom
mehrere Out-of-Band-Daten und normale Daten im gleichen Anruf niemals miteinander kombiniert werden.) DerlpArgument
Parameter verweist auf einDWORD
Objekt, in demIOCtl
das Ergebnis gespeichert wird.
Diese Funktion ist eine Teilmenge der ioctl()
in Berkeley-Sockets verwendeten. Insbesondere gibt es keinen Befehl, der gleichbedeutend FIOASYNC
ist, während SIOCATMARK
es sich um den einzigen Befehl auf Socketebene handelt, der unterstützt wird.
CAsyncSocket::Listen
Rufen Sie diese Memberfunktion auf, um eingehende Verbindungsanforderungen zu überwachen.
BOOL Listen(int nConnectionBacklog = 5);
Parameter
nConnectionBacklog
Die maximale Länge, mit der die Warteschlange ausstehender Verbindungen vergrößert werden kann. Gültiger Bereich liegt zwischen 1 und 5.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEADDRINUSE
Es wurde versucht, eine verwendete Adresse zu überwachen.WSAEINPROGRESS
Ein blockierter Windows Sockets-Vorgang wird ausgeführt.WSAEINVAL
Der Socket wurde nicht 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 weist keinen Typ auf, der denListen
Vorgang unterstützt.
Hinweise
Um Verbindungen zu akzeptieren, wird der Socket zuerst mit Create
erstellt, ein Backlog für eingehende Verbindungen wird mit Listen
angegeben, und dann werden die Verbindungen akzeptiert.Accept
Listen
Gilt nur für Sockets, die Verbindungen unterstützen, d. h. solche vom Typ SOCK_STREAM
. Dieser Socket wird in den "passiven" Modus versetzt, in dem eingehende Verbindungen erkannt und vom Prozess in die Warteschlange eingereiht werden.
Diese Funktion wird in der Regel von Servern (oder anwendungen, die Verbindungen akzeptieren möchten) verwendet, die mehrere Verbindungsanforderungen gleichzeitig haben können: Wenn eine Verbindungsanforderung mit der Warteschlange voll eingeht, erhält der Client eine Fehlermeldung mit einem Hinweis auf WSAECONNREFUSED
.
Listen
versucht, weiterhin rational zu funktionieren, wenn keine verfügbaren Ports (Deskriptoren) vorhanden sind. Es akzeptiert Verbindungen, bis die Warteschlange geleert wird. Wenn Ports verfügbar sind, wird die Warteschlange nach Möglichkeit durch einen späteren Anruf an Listen
Accept
den aktuellen oder letzten "Backlog" erneut ausgefüllt und die Überwachung eingehender Verbindungen fortgesetzt.
CAsyncSocket::m_hSocket
Enthält das SOCKET
Handle für den socket, der von diesem CAsyncSocket
Objekt gekapselt wird.
SOCKET m_hSocket;
CAsyncSocket::OnAccept
Vom Framework aufgerufen, um einen Überwachungssocket zu benachrichtigen, dass es ausstehende Verbindungsanforderungen akzeptieren kann, indem die Accept
Memberfunktion aufgerufen wird.
virtual void OnAccept(int nErrorCode);
Parameter
nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnAccept
Memberfunktion:
0 Die Funktion wurde erfolgreich ausgeführt.
WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.
Hinweise
Weitere Informationen finden Sie unter Windows Sockets: Socketbenachrichtigungen.
CAsyncSocket::OnClose
Wird vom Framework aufgerufen, um diesen Socket zu benachrichtigen, dass der verbundene Socket durch seinen Prozess geschlossen wird.
virtual void OnClose(int nErrorCode);
Parameter
nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnClose
Memberfunktion:
0 Die Funktion wurde erfolgreich ausgeführt.
WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAECONNRESET
Die Verbindung wurde von der Remoteseite zurückgesetzt.WSAECONNABORTED
Die Verbindung wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.
Hinweise
Weitere Informationen finden Sie unter Windows Sockets: Socketbenachrichtigungen.
CAsyncSocket::OnConnect
Wird vom Framework aufgerufen, um diesen Verbindungssocket zu benachrichtigen, ob der Verbindungsversuch erfolgreich oder fehlerhaft ist.
virtual void OnConnect(int nErrorCode);
Parameter
nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnConnect
Memberfunktion:
0 Die Funktion wurde erfolgreich ausgeführt.
WSAEADDRINUSE
Die angegebene Adresse wird bereits verwendet.WSAEADDRNOTAVAIL
Die angegebene Adresse ist vom lokalen Computer nicht verfügbar.WSAEAFNOSUPPORT
Adressen in der angegebenen Familie können nicht mit diesem Socket verwendet werden.WSAECONNREFUSED
Der Versuch, eine Verbindung herzustellen, wurde erzwungen abgelehnt.WSAEDESTADDRREQ
Es ist eine Zieladresse erforderlich.WSAEFAULT
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 derzeit nicht von diesem Host aus erreicht werden.WSAENOBUFS
Es ist kein Pufferspeicher verfügbar. Der Socket kann nicht verbunden werden.WSAENOTCONN
Der Socket ist nicht verbunden.WSAENOTSOCK
Der Deskriptor ist eine Datei, kein Socket.WSAETIMEDOUT
Der Versuch, ein Timeout herzustellen, ohne eine Verbindung herzustellen.
Hinweise
Hinweis
In CSocket
, die OnConnect
Benachrichtigungsfunktion wird nie aufgerufen. Bei Verbindungen rufen Sie einfach auf Connect
, was bei Abschluss der Verbindung (entweder erfolgreich oder fehlerhaft) zurückgegeben wird. Wie Verbindungsbenachrichtigungen behandelt werden, ist ein MFC-Implementierungsdetails.
Weitere Informationen finden Sie unter Windows Sockets: Socketbenachrichtigungen.
Beispiel
void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
// derived from CAsyncSocket
{
if (0 != nErrorCode)
{
switch (nErrorCode)
{
case WSAEADDRINUSE:
AfxMessageBox(_T("The specified address is already in use.\n"));
break;
case WSAEADDRNOTAVAIL:
AfxMessageBox(_T("The specified address is not available from ")
_T("the local machine.\n"));
break;
case WSAEAFNOSUPPORT:
AfxMessageBox(_T("Addresses in the specified family cannot be ")
_T("used with this socket.\n"));
break;
case WSAECONNREFUSED:
AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
break;
case WSAEDESTADDRREQ:
AfxMessageBox(_T("A destination address is required.\n"));
break;
case WSAEFAULT:
AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
break;
case WSAEINVAL:
AfxMessageBox(_T("The socket is already bound to an address.\n"));
break;
case WSAEISCONN:
AfxMessageBox(_T("The socket is already connected.\n"));
break;
case WSAEMFILE:
AfxMessageBox(_T("No more file descriptors are available.\n"));
break;
case WSAENETUNREACH:
AfxMessageBox(_T("The network cannot be reached from this host ")
_T("at this time.\n"));
break;
case WSAENOBUFS:
AfxMessageBox(_T("No buffer space is available. The socket ")
_T("cannot be connected.\n"));
break;
case WSAENOTCONN:
AfxMessageBox(_T("The socket is not connected.\n"));
break;
case WSAENOTSOCK:
AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
break;
case WSAETIMEDOUT:
AfxMessageBox(_T("The attempt to connect timed out without ")
_T("establishing a connection. \n"));
break;
default:
TCHAR szError[256];
_stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
AfxMessageBox(szError);
break;
}
AfxMessageBox(_T("Please close the application"));
}
CAsyncSocket::OnConnect(nErrorCode);
}
CAsyncSocket::OnOutOfBandData
Wird vom Framework aufgerufen, um den empfangenden Socket zu benachrichtigen, dass der sendende Socket über Out-of-Band-Daten verfügt, die gesendet werden sollen.
virtual void OnOutOfBandData(int nErrorCode);
Parameter
nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnOutOfBandData
Memberfunktion:
0 Die Funktion wurde erfolgreich ausgeführt.
WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.
Hinweise
Out-of-Band-Daten sind ein logisch unabhängiger Kanal, der jedem Paar verbundener Sockets vom Typ SOCK_STREAM
zugeordnet ist. Der Kanal wird in der Regel verwendet, um dringende Daten zu senden.
MFC unterstützt Out-of-Band-Daten, benutzer der Klasse CAsyncSocket
werden jedoch davon abgeraten, sie zu verwenden. Die einfachere Möglichkeit besteht darin, einen zweiten Socket zum Übergeben solcher Daten zu erstellen. Weitere Informationen zu Out-of-Band-Daten finden Sie unter Windows Sockets: Socketbenachrichtigungen.
CAsyncSocket::OnReceive
Wird vom Framework aufgerufen, um diesen Socket zu benachrichtigen, dass daten im Puffer vorhanden sind, die durch Aufrufen der Receive
Memberfunktion abgerufen werden können.
virtual void OnReceive(int nErrorCode);
Parameter
nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnReceive
Memberfunktion:
0 Die Funktion wurde erfolgreich ausgeführt.
WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.
Hinweise
Weitere Informationen finden Sie unter Windows Sockets: Socketbenachrichtigungen.
Beispiel
void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
// derived from CAsyncSocket
{
static int i = 0;
i++;
TCHAR buff[4096];
int nRead;
nRead = Receive(buff, 4096);
switch (nRead)
{
case 0:
Close();
break;
case SOCKET_ERROR:
if (GetLastError() != WSAEWOULDBLOCK)
{
AfxMessageBox(_T("Error occurred"));
Close();
}
break;
default:
buff[nRead] = _T('\0'); //terminate the string
CString szTemp(buff);
m_strRecv += szTemp; // m_strRecv is a CString declared
// in CMyAsyncSocket
if (szTemp.CompareNoCase(_T("bye")) == 0)
{
ShutDown();
s_eventDone.SetEvent();
}
}
CAsyncSocket::OnReceive(nErrorCode);
}
CAsyncSocket::OnSend
Wird vom Framework aufgerufen, um den Socket zu benachrichtigen, dass er jetzt Daten senden kann, indem die Send
Memberfunktion aufgerufen wird.
virtual void OnSend(int nErrorCode);
Parameter
nErrorCode
Der letzte Fehler in einem Socket. Die folgenden Fehlercodes gelten für die OnSend
Memberfunktion:
0 Die Funktion wurde erfolgreich ausgeführt.
WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.
Hinweise
Weitere Informationen finden Sie unter Windows Sockets: Socketbenachrichtigungen.
Beispiel
// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
// CString m_sendBuffer; //for async send
// int m_nBytesSent;
// int m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
while (m_nBytesSent < m_nBytesBufferSize)
{
int dwBytes;
if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
{
if (GetLastError() == WSAEWOULDBLOCK)
{
break;
}
else
{
TCHAR szError[256];
_stprintf_s(szError, _T("Server Socket failed to send: %d"),
GetLastError());
Close();
AfxMessageBox(szError);
}
}
else
{
m_nBytesSent += dwBytes;
}
}
if (m_nBytesSent == m_nBytesBufferSize)
{
m_nBytesSent = m_nBytesBufferSize = 0;
m_sendBuffer = _T("");
}
CAsyncSocket::OnSend(nErrorCode);
}
CAsyncSocket::operator =
Weist einem CAsyncSocket
Objekt einen neuen Wert zu.
void operator=(const CAsyncSocket& rSrc);
Parameter
rSrc
Ein Verweis auf ein vorhandenes CAsyncSocket
Objekt.
Hinweise
Rufen Sie diese Funktion auf, um ein vorhandenes CAsyncSocket
Objekt in ein anderes CAsyncSocket
Objekt zu kopieren.
CAsyncSocket::operator SOCKET
Verwenden Sie diesen Operator, um das SOCKET
Handle des CAsyncSocket
Objekts abzurufen.
operator SOCKET() const;
Rückgabewert
Bei erfolgreicher Ausführung des Objekts; SOCKET
andernfalls NULL
.
Hinweise
Sie können das Handle verwenden, um Windows-APIs direkt aufzurufen.
CAsyncSocket::Receive
Rufen Sie diese Memberfunktion auf, um Daten aus einem Socket zu empfangen.
virtual int Receive(
void* lpBuf,
int nBufLen,
int nFlags = 0);
Parameter
lpBuf
Ein Puffer für die eingehenden Daten.
nBufLen
Die Länge in lpBuf
Byte.
nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags
Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|
) kombiniert wird:
MSG_PEEK
Werfen Sie einen Blick auf die eingehenden Daten. Die Daten werden in den Puffer kopiert, aber nicht aus der Eingabewarteschlange entfernt.MSG_OOB
Verarbeiten von Out-of-Band-Daten.
Rückgabewert
Wenn kein Fehler auftritt, Receive
wird die Anzahl der empfangenen Bytes zurückgegeben. Wenn die Verbindung geschlossen wurde, wird 0 zurückgegeben. Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR
, und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAENOTCONN
Der Socket ist nicht verbunden.WSAEINPROGRESS
Ein blockierter Windows Sockets-Vorgang wird ausgeführt.WSAENOTSOCK
Der Deskriptor ist kein Socket.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 mitnHow
"0" oder "2" aufgerufen wurde.WSAEWOULDBLOCK
Der Socket ist als Nichtblockierung gekennzeichnet, und derReceive
Vorgang würde blockieren.WSAEMSGSIZE
Das Datagramm war zu groß, um in den angegebenen Puffer zu passen und wurde abgeschnitten.WSAEINVAL
Der Socket wurde nicht anBind
.WSAECONNABORTED
Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.WSAECONNRESET
Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.
Hinweise
Diese Funktion wird für verbundene Datenstrom- oder Datagrammsockets verwendet und zum Lesen eingehender Daten verwendet.
Für Sockets vom Typ SOCK_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 weitere Out-of-Band-Daten gelesen werden müssen.
Bei Datagrammsockets werden Daten aus dem ersten enqueuierten Datagramm bis zur Größe des bereitgestellten Puffers extrahiert. Wenn das Datagramm größer als der bereitgestellte Puffer ist, wird der Puffer mit dem ersten Teil des Datagramms gefüllt, die überzähligen Daten gehen verloren und Receive
gibt einen Wert mit SOCKET_ERROR
dem Fehlercode zurück, auf den der Fehlercode festgelegt WSAEMSGSIZE
ist. Wenn keine eingehenden Daten im Socket verfügbar sind, wird ein Wert von SOCKET_ERROR
zurückgegeben, auf den der Fehlercode festgelegt WSAEWOULDBLOCK
ist. Die OnReceive
Rückruffunktion kann verwendet werden, um zu bestimmen, wann weitere Daten eintreffen.
Wenn der Socket vom Typ SOCK_STREAM
ist und die Remoteseite die Verbindung ordnungsgemäß heruntergefahren hat, wird die Receive
Verbindung sofort mit 0 Bytes empfangen. Wenn die Verbindung zurückgesetzt wurde, Receive
tritt ein Fehler WSAECONNRESET
auf.
Receive
sollte nur einmal aufgerufen werden, wenn jedes Mal CAsyncSocket::OnReceive
aufgerufen wird.
Beispiel
Ein Beispiel hierfür finden Sie unter CAsyncSocket::OnReceive
.
CAsyncSocket::ReceiveFrom
Rufen Sie diese Memberfunktion auf, um ein Datagramm 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
Byte.
rSocketAddress
Verweis auf ein CString
Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.
rSocketPort
Verweisen auf einen UINT
Port, der einen Port speichert.
lpSockAddr
Ein Zeiger auf eine SOCKADDR
Struktur, die die Quelladresse beim Zurückgeben enthält.
lpSockAddrLen
Ein Zeiger auf die Länge der Quelladresse in lpSockAddr
Byte.
nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags
Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|
) kombiniert wird:
MSG_PEEK
Werfen Sie einen Blick auf die eingehenden Daten. Die Daten werden in den Puffer kopiert, aber nicht aus der Eingabewarteschlange entfernt.MSG_OOB
Verarbeiten von Out-of-Band-Daten.
Rückgabewert
Wenn kein Fehler auftritt, ReceiveFrom
wird die Anzahl der empfangenen Bytes zurückgegeben. Wenn die Verbindung geschlossen wurde, wird 0 zurückgegeben. Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR
, und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEFAULT
DaslpSockAddrLen
Argument war ungültig: DerlpSockAddr
Puffer war zu klein, um die Peeradresse aufzunehmen.WSAEINPROGRESS
Ein blockierter Windows Sockets-Vorgang wird ausgeführt.WSAEINVAL
Der Socket wurde nicht anBind
.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 blockieren.WSAEMSGSIZE
Das Datagramm war zu groß, um in den angegebenen Puffer zu passen und wurde abgeschnitten.WSAECONNABORTED
Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.WSAECONNRESET
Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.
Hinweise
Diese Funktion wird verwendet, um eingehende Daten in einem (möglicherweise verbundenen) Socket zu lesen und die Adresse zu erfassen, von der die Daten gesendet wurden.
Verwenden Sie zum Behandeln von CAsyncSocket::ReceiveFromEx
IPv6-Adressen .
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 weitere Out-of-Band-Daten gelesen werden müssen. Die lpSockAddr
Parameter werden lpSockAddrLen
für SOCK_STREAM
Sockets ignoriert.
Bei Datagrammsockets werden Daten aus dem ersten enqueuierten Datagramm bis zur Größe des bereitgestellten Puffers extrahiert. Wenn das Datagramm größer als der bereitgestellte Puffer ist, wird der Puffer mit dem ersten Teil der Nachricht gefüllt, die überzähligen Daten gehen verloren und ReceiveFrom
gibt einen Wert mit SOCKET_ERROR
dem Fehlercode zurück, auf den der Fehlercode festgelegt WSAEMSGSIZE
ist.
Wenn lpSockAddr
es sich um einen Nichtzero 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
auf den verwiesen wird, wird auf die Größe dieser Struktur initialisiert und wird beim Zurückgeben geändert, um die tatsächliche Größe der dort gespeicherten Adresse anzugeben. Wenn keine eingehenden Daten im Socket verfügbar sind, wartet der Anruf auf die Eintreffen von ReceiveFrom
Daten, es sei denn, der Socket ist nicht blockiert. In diesem Fall wird ein Wert von SOCKET_ERROR
zurückgegeben, auf den der Fehlercode festgelegt WSAEWOULDBLOCK
ist. Der OnReceive
Rückruf kann verwendet werden, um zu bestimmen, wann weitere Daten eingehen.
Wenn der Socket vom Typ SOCK_STREAM
ist und die Remoteseite die Verbindung ordnungsgemäß heruntergefahren hat, wird die ReceiveFrom
Verbindung sofort mit 0 Bytes empfangen.
CAsyncSocket::ReceiveFromEx
Rufen Sie diese Memberfunktion auf, um ein Datagramm zu empfangen und die Quelladresse in der SOCKADDR
Struktur oder in rSocketAddress
(behandelt IPv6-Adressen) zu speichern.
int ReceiveFromEx(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0);
Parameter
lpBuf
Ein Puffer für die eingehenden Daten.
nBufLen
Die Länge in lpBuf
Byte.
rSocketAddress
Verweis auf ein CString
Objekt, das eine gepunktete Nummer-IP-Adresse empfängt.
rSocketPort
Verweisen auf einen UINT
Port, der einen Port speichert.
nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags
Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|
) kombiniert wird:
MSG_PEEK
Werfen Sie einen Blick auf die eingehenden Daten. Die Daten werden in den Puffer kopiert, aber nicht aus der Eingabewarteschlange entfernt.MSG_OOB
Verarbeiten von Out-of-Band-Daten.
Rückgabewert
Wenn kein Fehler auftritt, ReceiveFromEx
wird die Anzahl der empfangenen Bytes zurückgegeben. Wenn die Verbindung geschlossen wurde, wird 0 zurückgegeben. Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR
, und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEFAULT
DaslpSockAddrLen
Argument war ungültig: DerlpSockAddr
Puffer war zu klein, um die Peeradresse aufzunehmen.WSAEINPROGRESS
Ein blockierter Windows Sockets-Vorgang wird ausgeführt.WSAEINVAL
Der Socket wurde nicht anBind
.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 blockieren.WSAEMSGSIZE
Das Datagramm war zu groß, um in den angegebenen Puffer zu passen und wurde abgeschnitten.WSAECONNABORTED
Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.WSAECONNRESET
Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.
Hinweise
Diese Funktion wird verwendet, um eingehende Daten in einem (möglicherweise verbundenen) Socket zu lesen und die Adresse zu erfassen, von der die Daten gesendet wurden.
Diese Funktion ist identisch mit CAsyncSocket::ReceiveFrom
der Ausnahme, dass sie IPv6-Adressen sowie ältere Protokolle behandelt.
Für Sockets vom Typ SOCK_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 weitere Out-of-Band-Daten gelesen werden müssen. Die lpSockAddr
Parameter werden lpSockAddrLen
für SOCK_STREAM
Sockets ignoriert.
Bei Datagrammsockets werden Daten aus dem ersten enqueuierten Datagramm bis zur Größe des bereitgestellten Puffers extrahiert. Wenn das Datagramm größer als der bereitgestellte Puffer ist, wird der Puffer mit dem ersten Teil der Nachricht gefüllt, die überzähligen Daten gehen verloren und ReceiveFromEx
gibt einen Wert mit SOCKET_ERROR
dem Fehlercode zurück, auf den der Fehlercode festgelegt WSAEMSGSIZE
ist.
Wenn lpSockAddr
es sich um einen Nichtzero 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
auf den verwiesen wird, wird auf die Größe dieser Struktur initialisiert und wird beim Zurückgeben geändert, um die tatsächliche Größe der dort gespeicherten Adresse anzugeben. Wenn keine eingehenden Daten im Socket verfügbar sind, wartet der Anruf auf die Eintreffen von ReceiveFromEx
Daten, es sei denn, der Socket ist nicht blockiert. In diesem Fall wird ein Wert von SOCKET_ERROR
zurückgegeben, auf den der Fehlercode festgelegt WSAEWOULDBLOCK
ist. Der OnReceive
Rückruf kann verwendet werden, um zu bestimmen, wann weitere Daten eingehen.
Wenn der Socket vom Typ SOCK_STREAM
ist und die Remoteseite die Verbindung ordnungsgemäß heruntergefahren hat, wird die ReceiveFromEx
Verbindung sofort mit 0 Bytes empfangen.
CAsyncSocket::Send
Rufen Sie diese Memberfunktion auf, um Daten in einem verbundenen Socket zu senden.
virtual int Send(
const void* lpBuf,
int nBufLen,
int nFlags = 0);
Parameter
lpBuf
Ein Puffer, der die zu übertragenden Daten enthält.
nBufLen
Die Länge der Daten in lpBuf
Byte.
nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags
Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|
) kombiniert wird:
MSG_DONTROUTE
Gibt an, dass die Daten nicht dem Routing unterliegen sollen. Ein Windows Sockets-Lieferant kann diese Kennzeichnung ignorieren.MSG_OOB
Senden Sie Out-of-Band-Daten (SOCK_STREAM
nur).
Rückgabewert
Wenn kein Fehler auftritt, Send
wird die Gesamtanzahl der gesendeten Zeichen zurückgegeben. (Beachten Sie, dass dies kleiner als die zahl sein kann, die durch nBufLen
.) Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR
, und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEACCES
Die angeforderte Adresse ist eine Übertragungsadresse, aber das entsprechende Flag wurde nicht festgelegt.WSAEINPROGRESS
Ein blockierter Windows Sockets-Vorgang wird ausgeführt.WSAEFAULT
DaslpBuf
Argument befindet sich nicht in einem gültigen Teil des Benutzeradressraums.WSAENETRESET
Die Verbindung muss zurückgesetzt werden, da die Windows Sockets-Implementierung sie gelöscht hat.WSAENOBUFS
Die Implementierung von Windows Sockets meldet einen Puffer-Deadlock.WSAENOTCONN
Der Socket ist nicht verbunden.WSAENOTSOCK
Der Deskriptor ist kein Socket.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 blockieren.WSAEMSGSIZE
Der Socket ist vom TypSOCK_DGRAM
, und das Datagramm ist größer als die maximale Unterstützung durch die Windows Sockets-Implementierung.WSAEINVAL
Der Socket wurde nicht anBind
.WSAECONNABORTED
Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.WSAECONNRESET
Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.
Hinweise
Send
wird verwendet, um ausgehende Daten in verbundenen Datenstrom- oder Datagrammsockets zu schreiben. Für Datagrammsockets muss die maximale IP-Paketgröße der zugrunde liegenden Subnetze, die iMaxUdpDg
vom Element in der WSADATA
von der Struktur zurückgegebenen AfxSocketInit
Struktur angegeben wird, nicht überschritten werden. Wenn die Daten zu lang sind, um atomisch über das zugrunde liegende Protokoll zu übergeben, wird der Fehler WSAEMSGSIZE
via GetLastError
zurückgegeben, und es werden keine Daten übertragen.
Beachten Sie, dass bei einem Datagrammsocket der erfolgreiche Abschluss eines Datensockets Send
nicht darauf hinweist, dass die Daten erfolgreich übermittelt wurden.
Bei CAsyncSocket
Objekten vom Typ SOCK_STREAM
kann die Anzahl der geschriebenen Bytes zwischen 1 und der angeforderten Länge lauten, abhängig von der Pufferverfügbarkeit auf den lokalen und ausländischen Hosts.
Beispiel
Ein Beispiel hierfür finden Sie unter CAsyncSocket::OnSend
.
CAsyncSocket::SendTo
Rufen Sie diese Memberfunktion auf, um Daten an ein bestimmtes Ziel zu senden.
int SendTo(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0);
int SendTo(
const void* lpBuf,
int nBufLen,
const SOCKADDR* lpSockAddr,
int nSockAddrLen,
int nFlags = 0);
Parameter
lpBuf
Ein Puffer, der die zu übertragenden Daten enthält.
nBufLen
Die Länge der Daten in lpBuf
Byte.
nHostPort
Der Port, der die Socketanwendung identifiziert.
lpszHostAddress
Die Netzwerkadresse des Sockets, mit dem dieses Objekt verbunden ist: ein Computername wie "ftp.microsoft.com" oder eine gepunktete Zahl wie "128.56.22.8".
nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags
Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|
) kombiniert wird:
MSG_DONTROUTE
Gibt an, dass die Daten nicht dem Routing unterliegen sollen. Ein Windows Sockets-Lieferant kann diese Kennzeichnung ignorieren.MSG_OOB
Senden Sie Out-of-Band-Daten (SOCK_STREAM
nur).
lpSockAddr
Ein Zeiger auf eine SOCKADDR
Struktur, die die Adresse des Zielsockets enthält.
nSockAddrLen
Die Länge der Adresse in lpSockAddr
Byte.
Rückgabewert
Wenn kein Fehler auftritt, SendTo
wird die Gesamtanzahl der gesendeten Zeichen zurückgegeben. (Beachten Sie, dass dies kleiner als die zahl sein kann, die durch nBufLen
.) Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR
, und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEACCES
Die angeforderte Adresse ist eine Übertragungsadresse, aber das entsprechende Flag wurde nicht festgelegt.WSAEINPROGRESS
Ein blockierter Windows Sockets-Vorgang wird ausgeführt.WSAEFAULT
DielpBuf
ParameterlpSockAddr
sind nicht Teil des Benutzeradressraums, 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 gelöscht hat.WSAENOBUFS
Die Implementierung von Windows Sockets meldet einen Puffer-Deadlock.WSAENOTCONN
Der Socket ist nicht verbunden (SOCK_STREAM
nur).WSAENOTSOCK
Der Deskriptor ist kein Socket.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 blockieren.WSAEMSGSIZE
Der Socket ist vom TypSOCK_DGRAM
, und das Datagramm ist größer als die maximale Unterstützung durch die Windows Sockets-Implementierung.WSAECONNABORTED
Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.WSAECONNRESET
Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.WSAEADDRNOTAVAIL
Die angegebene Adresse ist vom lokalen Computer nicht verfügbar.WSAEAFNOSUPPORT
Adressen in der angegebenen Familie können nicht mit diesem Socket verwendet werden.WSAEDESTADDRREQ
Es ist eine Zieladresse erforderlich.WSAENETUNREACH
Das Netzwerk kann derzeit nicht von diesem Host aus erreicht werden.
Hinweise
SendTo
wird für Datagramm- oder Datenstromsockets verwendet und zum Schreiben ausgehender Daten in einem Socket verwendet. Für Datagrammsockets muss darauf geachtet werden, dass die maximale IP-Paketgröße der zugrunde liegenden Subnetze, die iMaxUdpDg
vom Element in der WSADATA
struktur ausgefüllt AfxSocketInit
wird, nicht überschritten werden. Wenn die Daten zu lang sind, um atomisch über das zugrunde liegende Protokoll zu übergeben, wird der Fehler WSAEMSGSIZE zurückgegeben, und es werden keine Daten übertragen.
Beachten Sie, dass der erfolgreiche Abschluss eines Vorgangs SendTo
nicht darauf hinweist, dass die Daten erfolgreich übermittelt wurden.
SendTo
wird nur für einen SOCK_DGRAM
Socket verwendet, um ein Datagramm an einen bestimmten Socket zu senden, der durch den lpSockAddr
Parameter identifiziert wird.
Zum Senden einer Übertragung (nur auf einer SOCK_DGRAM
Einzigen) sollte die Adresse im lpSockAddr
Parameter mit der speziellen IP-Adresse INADDR_BROADCAST
(definiert in der Headerdatei WINSOCK.H
von Windows Sockets) zusammen mit der vorgesehenen Portnummer erstellt werden. Oder, wenn der lpszHostAddress
Parameter lautet NULL
, wird der Socket für die Übertragung konfiguriert. Es ist in der Regel nicht möglich, dass ein Übertragungsdatendiagramm die Größe überschreitet, in der fragmentiert werden kann, was bedeutet, dass der Datenteil des Datagramms (ohne Header) 512 Byte nicht überschreiten sollte.
Verwenden Sie zum Behandeln von CAsyncSocket::SendToEx
IPv6-Adressen .
CAsyncSocket::SendToEx
Rufen Sie diese Memberfunktion auf, um Daten an ein bestimmtes Ziel zu senden (behandelt IPv6-Adressen).
int SendToEx(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0);
Parameter
lpBuf
Ein Puffer, der die zu übertragenden Daten enthält.
nBufLen
Die Länge der Daten in lpBuf
Byte.
nHostPort
Der Port, der die Socketanwendung identifiziert.
lpszHostAddress
Die Netzwerkadresse des Sockets, mit dem dieses Objekt verbunden ist: ein Computername wie "ftp.microsoft.com" oder eine gepunktete Zahl wie "128.56.22.8".
nFlags
Gibt die Art und Weise an, in der der Anruf getätigt wird. Die Semantik dieser Funktion wird durch die Socketoptionen und den nFlags
Parameter bestimmt. Letzteres wird erstellt, indem einer der folgenden Werte mit dem bitweisen C++-OR-Operator (|
) kombiniert wird:
MSG_DONTROUTE
Gibt an, dass die Daten nicht dem Routing unterliegen sollen. Ein Windows Sockets-Lieferant kann diese Kennzeichnung ignorieren.MSG_OOB
Senden Sie Out-of-Band-Daten (SOCK_STREAM
nur).
Rückgabewert
Wenn kein Fehler auftritt, SendToEx
wird die Gesamtanzahl der gesendeten Zeichen zurückgegeben. (Beachten Sie, dass dies kleiner als die zahl sein kann, die durch nBufLen
.) Andernfalls wird ein Wert zurückgegeben SOCKET_ERROR
, und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEACCES
Die angeforderte Adresse ist eine Übertragungsadresse, aber das entsprechende Flag wurde nicht festgelegt.WSAEINPROGRESS
Ein blockierter Windows Sockets-Vorgang wird ausgeführt.WSAEFAULT
DielpBuf
ParameterlpSockAddr
sind nicht Teil des Benutzeradressraums, 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 gelöscht hat.WSAENOBUFS
Die Implementierung von Windows Sockets meldet einen Puffer-Deadlock.WSAENOTCONN
Der Socket ist nicht verbunden (SOCK_STREAM
nur).WSAENOTSOCK
Der Deskriptor ist kein Socket.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 blockieren.WSAEMSGSIZE
Der Socket ist vom TypSOCK_DGRAM
, und das Datagramm ist größer als die maximale Unterstützung durch die Windows Sockets-Implementierung.WSAECONNABORTED
Der virtuelle Schaltkreis wurde aufgrund eines Timeouts oder eines anderen Fehlers abgebrochen.WSAECONNRESET
Der virtuelle Schaltkreis wurde von der Remoteseite zurückgesetzt.WSAEADDRNOTAVAIL
Die angegebene Adresse ist vom lokalen Computer nicht verfügbar.WSAEAFNOSUPPORT
Adressen in der angegebenen Familie können nicht mit diesem Socket verwendet werden.WSAEDESTADDRREQ
Es ist eine Zieladresse erforderlich.WSAENETUNREACH
Das Netzwerk kann derzeit nicht von diesem Host aus erreicht werden.
Hinweise
Diese Methode ist identisch mit CAsyncSocket::SendTo
der Ausnahme, dass sie IPv6-Adressen sowie ältere Protokolle behandelt.
SendToEx
wird für Datagramm- oder Datenstromsockets verwendet und zum Schreiben ausgehender Daten in einem Socket verwendet. Für Datagrammsockets muss darauf geachtet werden, dass die maximale IP-Paketgröße der zugrunde liegenden Subnetze, die iMaxUdpDg
vom Element in der WSADATA
struktur ausgefüllt AfxSocketInit
wird, nicht überschritten werden. Wenn die Daten zu lang sind, um atomisch über das zugrunde liegende Protokoll zu übergeben, wird der Fehler WSAEMSGSIZE
zurückgegeben, und es werden keine Daten übertragen.
Beachten Sie, dass der erfolgreiche Abschluss eines Vorgangs SendToEx
nicht darauf hinweist, dass die Daten erfolgreich übermittelt wurden.
SendToEx
wird nur für einen SOCK_DGRAM
Socket verwendet, um ein Datagramm an einen bestimmten Socket zu senden, der durch den lpSockAddr
Parameter identifiziert wird.
Zum Senden einer Übertragung (nur auf einer SOCK_DGRAM
Einzigen) sollte die Adresse im lpSockAddr
Parameter mit der speziellen IP-Adresse INADDR_BROADCAST
(definiert in der Headerdatei WINSOCK.H
von Windows Sockets) zusammen mit der vorgesehenen Portnummer erstellt werden. Oder, wenn der lpszHostAddress
Parameter lautet NULL
, wird der Socket für die Übertragung konfiguriert. Es ist in der Regel nicht möglich, dass ein Übertragungsdatendiagramm die Größe überschreitet, in der fragmentiert werden kann, was bedeutet, dass der Datenteil des Datagramms (ohne Header) 512 Byte nicht überschreiten sollte.
CAsyncSocket::SetSockOpt
Rufen Sie diese Memberfunktion auf, um eine Socketoption festzulegen.
BOOL SetSockOpt(
int nOptionName,
const void* lpOptionValue,
int nOptionLen,
int nLevel = SOL_SOCKET);
Parameter
nOptionName
Die Socketoption, für die der Wert festgelegt werden soll.
lpOptionValue
Ein Zeiger auf den Puffer, in dem der Wert für die angeforderte Option angegeben wird.
nOptionLen
Die Größe des Puffers lpOptionValue
in Byte.
nLevel
Die Ebene, auf der die Option definiert ist; die einzigen unterstützten Ebenen sind SOL_SOCKET
und IPPROTO_TCP
.
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem fehlgeschlagen ist.WSAEFAULT
lpOptionValue
ist nicht in einem gültigen Teil des Prozessadressraums enthalten.WSAEINPROGRESS
Ein blockierter Windows Sockets-Vorgang wird ausgeführt.WSAEINVAL
nLevel
ist ungültig, oder die Darin enthaltenenlpOptionValue
Informationen sind ungültig.WSAENETRESET
BeimSO_KEEPALIVE
Festlegen der Verbindung ist ein Timeout aufgetreten.WSAENOPROTOOPT
Die Option ist unbekannt oder nicht unterstützt. InsbesondereSO_BROADCAST
wird für Sockets vom TypSOCK_STREAM
", whileSO_KEEPALIVE
SO_DONTLINGER
" , ,SO_LINGER
, undSO_OOBINLINE
werden nicht für Sockets vom TypSOCK_DGRAM
unterstützt.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 Socket eines beliebigen Typs in einem beliebigen Zustand zugeordnet ist. Obwohl Optionen auf mehreren Protokollebenen vorhanden sein können, definiert diese Spezifikation nur Optionen, die auf der obersten Ebene "Socket" vorhanden sind. Optionen wirken sich auf Socketvorgänge aus, z. B. ob beschleunigte Daten im normalen Datenstrom empfangen werden, ob Übertragungsnachrichten im Socket gesendet werden können usw.
Es gibt zwei Arten von Socketoptionen: Boolesche Optionen, die ein Feature oder Verhalten aktivieren oder deaktivieren, und Optionen, die einen ganzzahligen Wert oder eine ganze Struktur erfordern. Um eine boolesche Option zu aktivieren, lpOptionValue
zeigt sie auf eine ganze Zahl ohne Nullzahl. Um die Option lpOptionValue
zu deaktivieren, wird eine ganze Zahl gleich Null angezeigt. nOptionLen
sollte für boolesche Optionen gleich sizeof(BOOL)
sein. Zeigt bei anderen Optionen auf die ganze Zahl oder Struktur, lpOptionValue
die den gewünschten Wert für die Option enthält, und nOptionLen
ist die Länge der ganzen Zahl oder Struktur.
SO_LINGER
steuert die Aktion, die ausgeführt wird, wenn nicht gesendete Daten auf einem Socket in die Warteschlange gestellt werden, und die Close
Funktion wird aufgerufen, um den Socket zu schließen.
Standardmäßig kann ein Socket nicht an eine lokale Adresse gebunden werden(siehe Bind
), die bereits verwendet wird. Gelegentlich kann es jedoch wünschenswert sein, eine Adresse auf diese Weise "wiederzuverwenden". Da jede Verbindung durch die Kombination lokaler und Remoteadressen eindeutig identifiziert wird, besteht kein Problem mit zwei Sockets, die an dieselbe lokale Adresse gebunden sind, solange die Remoteadressen unterschiedlich sind.
Um die Windows Sockets-Implementierung darüber zu informieren, dass ein Bind
Aufruf eines Sockets nicht zulässig sein sollte, da die gewünschte Adresse bereits von einem anderen Socket verwendet wird, sollte die Anwendung die SO_REUSEADDR
Socketoption für den Socket festlegen, bevor sie den Bind
Aufruf ausstellen. Beachten Sie, dass die Option nur zum Zeitpunkt des Bind
Anrufs interpretiert wird: Es ist daher unnötig (aber harmlos), die Option für einen Socket festzulegen, der nicht an eine vorhandene Adresse gebunden werden soll, und das Festlegen oder Zurücksetzen der Option, nachdem der Bind
Anruf keine Auswirkungen auf dieses oder einen anderen Socket hat.
Eine Anwendung kann anfordern, dass die Windows Sockets-Implementierung die Verwendung von "Keep-Alive"-Paketen für TCP-Verbindungen (Transmission Control Protocol) ermöglicht, indem die SO_KEEPALIVE
Socketoption aktiviert wird. Eine Windows Sockets-Implementierung muss die Verwendung von Keep-Alives nicht unterstützen: Wenn dies der Fall ist, sind die genauen Semantik implementierungsspezifisch, sollten jedoch Abschnitt 4.2.3.6 von RFC 1122 entsprechen: "Anforderungen für Internethosts – Kommunikationsebenen". Wenn eine Verbindung als Ergebnis von "keep-alives" verworfen wird, wird der Fehlercode WSAENETRESET
an alle Aufrufe zurückgegeben, die im Socket ausgeführt werden, und alle nachfolgenden Aufrufe schlagen mit WSAENOTCONN
.
Die TCP_NODELAY
Option deaktiviert den Nagle-Algorithmus. Der Nagle-Algorithmus wird verwendet, um die Anzahl der kleinen Pakete zu reduzieren, die von einem Host gesendet werden, indem nicht erkannte Sendedaten gepuffert werden, bis ein Paket mit voller Größe gesendet werden kann. Für einige Anwendungen kann dieser Algorithmus jedoch die Leistung beeinträchtigen und TCP_NODELAY
zum Deaktivieren verwendet werden. Anwendungsautoren sollten nur festgelegt werden TCP_NODELAY
, wenn die Auswirkungen ders gut verstanden und gewünscht sind, da die Einstellung TCP_NODELAY
erhebliche negative Auswirkungen auf die Netzwerkleistung haben kann. TCP_NODELAY
ist die einzige unterstützte Socketoption, die Ebene IPPROTO_TCP
verwendet; alle anderen Optionen verwenden Ebene SOL_SOCKET
.
Einige Implementierungen von Windows Sockets liefern Ausgabedebuginformationen, wenn die SO_DEBUG
Option von einer Anwendung festgelegt wird.
Die folgenden Optionen werden für SetSockOpt
. Der Typ identifiziert den Typ der daten adressiert von lpOptionValue
.
Wert | Typ | Bedeutung |
---|---|---|
SO_BROADCAST |
BOOL |
Übertragung von Übertragungsnachrichten im Socket zulassen. |
SO_DEBUG |
BOOL |
Zeichnet Debuginformationen auf. |
SO_DONTLINGER |
BOOL |
Warten Close Sie nicht, bis nicht gesendete Daten gesendet werden. Das Festlegen dieser Option entspricht der Einstellung SO_LINGER mit l_onoff "Null". |
SO_DONTROUTE |
BOOL |
Leiten Sie nicht weiter: Senden Sie direkt an die Schnittstelle. |
SO_KEEPALIVE |
BOOL |
Keep-Alives senden. |
SO_LINGER |
struct LINGER |
Bleiben Sie eingeschaltet Close , wenn nicht gesendete Daten vorhanden sind. |
SO_OOBINLINE |
BOOL |
Empfangen von Out-of-Band-Daten im normalen Datenstrom. |
SO_RCVBUF |
int |
Geben Sie die Puffergröße für Empfänge an. |
SO_REUSEADDR |
BOOL |
Zulassen, dass der Socket an eine adresse gebunden wird, die bereits verwendet wird. (Siehe Bind.) |
SO_SNDBUF |
int |
Geben Sie die Puffergröße für Sendedaten an. |
TCP_NODELAY |
BOOL |
Deaktiviert den Nagle-Algorithmus für Sammelsendungen. |
Die BSD-Optionen (Berkeley Software Distribution) werden nicht unterstützt für SetSockOpt
:
Wert | Typ | Bedeutung |
---|---|---|
SO_ACCEPTCONN |
BOOL |
Socket überwacht |
SO_ERROR |
int |
Abrufen des Fehlerstatus und Löschens. |
SO_RCVLOWAT |
int |
Erhalten Sie ein Wasserzeichen mit geringem Wasser. |
SO_RCVTIMEO |
int |
Timeout empfangen |
SO_SNDLOWAT |
int |
Senden Sie ein Wasserzeichen mit geringem Wasser. |
SO_SNDTIMEO |
int |
Timeout senden. |
SO_TYPE |
int |
Typ des Sockets. |
IP_OPTIONS |
Festlegen des Optionsfelds im IP-Header. |
CAsyncSocket::ShutDown
Rufen Sie diese Memberfunktion auf, um Sende-, Empfangen- oder beides im Socket zu deaktivieren.
BOOL ShutDown(int nHow = sends);
Parameter
nHow
Ein Flag, das beschreibt, welche Arten von Vorgängen nicht mehr zulässig sind, wobei die folgenden aufgezählten Werte verwendet werden:
empfängt = 0
sends = 1
beide = 2
Rückgabewert
Nonzero, wenn die Funktion erfolgreich ist; andernfalls 0 und ein bestimmter Fehlercode kann durch Aufrufen GetLastError
abgerufen werden. Die folgenden Fehler gelten für diese Memberfunktion:
WSANOTINITIALISED
Bevor Sie diese API verwenden, muss ein erfolgreicherAfxSocketInit
Vorgang ausgeführt werden.WSAENETDOWN
Die Windows Sockets-Implementierung hat festgestellt, dass das Netzwerksubsystem 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 erschöpft ist. Für das User Datagram Protocol (UDP) werden eingehende Datagramme akzeptiert und in die Warteschlange gestellt. In keinem Fall wird ein ICMP-Fehlerpaket generiert. Wenn nHow
1 ist, sind nachfolgende Senden unzulässig. Für TCP-Sockets wird eine FIN gesendet. Die Einstellung nHow
auf 2 deaktiviert sowohl Sende- als auch Empfänge wie oben beschrieben.
Beachten Sie, dass ShutDown
der Socket nicht geschlossen wird, und ressourcen, die an den Socket angefügt sind, werden erst freigegeben, wenn Close
sie aufgerufen werden. Eine Anwendung sollte sich nicht darauf verlassen, einen Socket nach dem Herunterfahren wiederzuverwenden. Insbesondere ist keine Windows Sockets-Implementierung erforderlich, um die Verwendung eines Connect
solchen Sockets zu unterstützen.
Beispiel
Ein Beispiel hierfür finden Sie unter CAsyncSocket::OnReceive
.
CASyncSocket::Socket
Weist einen Socketziehpunkt zu.
BOOL Socket(
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
int nProtocolType = 0,
int nAddressFormat = PF_INET);
Parameter
nSocketType
Gibt SOCK_STREAM
an oder SOCK_DGRAM
.
lEvent
Eine Bitmaske, die eine Kombination von Netzwerkereignissen angibt, an denen die Anwendung interessiert ist.
FD_READ
: Möchten Sie eine Benachrichtigung über die Bereitschaft zum Lesen erhalten.FD_WRITE
: Möchten Sie eine Benachrichtigung über die Bereitschaft zum Schreiben erhalten.FD_OOB
: Möchten Sie eine Benachrichtigung über die Ankunft von Out-of-Band-Daten erhalten.FD_ACCEPT
: Möchten Sie eine Benachrichtigung über eingehende Verbindungen erhalten.FD_CONNECT
: Möchten Sie eine Benachrichtigung über die abgeschlossene Verbindung erhalten.FD_CLOSE
: Möchten Sie eine Benachrichtigung über das Schließen des Sockets erhalten.
nProtocolType
Protokoll, das mit dem Socket verwendet werden soll, der für die angegebene Adressfamilie spezifisch ist.
nAddressFormat
Adressfamilienspezifikation.
Rückgabewert
Gibt TRUE
bei Erfolg bzw. FALSE
bei einem Fehler zurück.
Hinweise
Diese Methode weist ein Sockethandle zu. Es wird nicht aufgerufen CAsyncSocket::Bind
, um den Socket an eine angegebene Adresse zu binden, daher müssen Sie später aufrufen Bind
, um den Socket an eine angegebene Adresse zu binden. Sie können CAsyncSocket::SetSockOpt
die Socketoption festlegen, bevor sie gebunden ist.
Siehe auch
CObject
-Klasse
Hierarchiediagramm
CSocket
Klasse
CSocketFile
Klasse