LPWSPACCEPT-Rückruffunktion (ws2spi.h)

Die LPWSPAccept Funktion akzeptiert bedingt eine Verbindung basierend auf dem Rückgabewert einer Bedingungsfunktion.

Syntax

LPWSPACCEPT Lpwspaccept;

SOCKET Lpwspaccept(
  [in]      SOCKET s,
  [out]     sockaddr *addr,
  [in, out] LPINT addrlen,
  [in]      LPCONDITIONPROC lpfnCondition,
  [in]      DWORD_PTR dwCallbackData,
  [out]     LPINT lpErrno
)
{...}

Parameter

[in] s

Deskriptor, der einen Socket identifiziert, der nach einem LPWSPListen-auf Verbindungen lauscht.

[out] addr

Optionaler Zeiger auf einen Puffer, der die Adresse der Verbindungsentität empfängt, die dem Dienstanbieter bekannt ist. Das genaue Format des addr Parameter wird durch die Adressfamilie bestimmt, die beim Erstellen des Sockets in der sockaddr Struktur eingerichtet wurde.

[in, out] addrlen

Optionaler Zeiger auf eine ganze Zahl, die die Länge des addr Parameter in Byte enthält.

[in] lpfnCondition

Prozedurinstanzadresse einer optionalen Bedingungsfunktion, die von Windows Sockets bereitgestellt wird. Diese Funktion wird in der Annahme- oder Ablehnungsentscheidung basierend auf den als Parameter übergebenen Aufruferinformationen verwendet.

[in] dwCallbackData

Rückrufdaten, die an den Windows Socket 2-Client als Wert des dwCallbackData- Parameters der Bedingungsfunktion übergeben werden sollen. Dieser Parameter wird vom Dienstanbieter nicht interpretiert.

[out] lpErrno

Zeigen Sie auf den Fehlercode.

Rückgabewert

Wenn kein Fehler auftritt, gibt LPWSPAccept einen Wert vom Typ SOCKET zurück, der ein Deskriptor für den akzeptierten Socket ist. Andernfalls wird ein Wert von INVALID_SOCKET zurückgegeben, und ein bestimmter Fehlercode ist in lpErrnoverfügbar.

Fehlercode Bedeutung
WSAECONNREFUSED
Die Verbindungsanforderung wurde erzwungen abgelehnt, wie im Rückgabewert der Bedingungsfunktion angegeben (CF_REJECT).
WSAECONNRESET-
Es wurde eine eingehende Verbindung angegeben, aber anschließend vom Remotespeer vor der Annahme des Anrufs beendet.
WSAENETDOWN-
Fehler des Netzwerksubsystems.
WSAEFAULT-
Der addrlen Parameter ist zu klein, oder der lpfnCondition Parameter ist nicht Teil des Benutzeradressraums.
WSAEINTR-
Ein (blockierender) Aufruf wurde über LPWSPCancelBlockingCallabgebrochen.
WSAEINPROGRESS-
Ein blockierter Windows Sockets-Aufruf wird ausgeführt.
WSAEINVAL-
LPWSPListen- vor LPWSPAccept nicht aufgerufen wurde, ist parameter g in der Bedingungsfunktion angegeben ist kein gültiger Wert, der Rückgabewert der Bedingungsfunktion ist kein gültiger Wert, oder in jedem Fall, wenn sich der angegebene Socket in einem ungültigen Zustand befindet.
WSAEMFILE-
Die Warteschlange ist beim Eintrag zu LPWSPAccept nicht zu ernennen, und es sind keine Socketdeskriptoren verfügbar.
WSAENOBUFS
Es ist kein Pufferspeicher verfügbar.
WSAENOTSOCK
Der Deskriptor ist kein Socket.
WSAEOPNOTSUPP
Referenzierter Socket ist kein Typ, der den verbindungsorientierten Dienst unterstützt.
WSATRY_AGAIN
Die Annahme der Verbindungsanforderung wurde zurückgestellt, wie im Rückgabewert der Bedingungsfunktion angegeben (CF_DEFER).
WSAEWOULDBLOCK
Socket ist als nicht blockierend gekennzeichnet, und es sind keine Verbindungen vorhanden, die akzeptiert werden sollen.
WSAEACCES
Die angebotene Verbindungsanforderung hat einen Timeout oder einen Widerruf vorgenommen.

Bemerkungen

Die LPWSPAccept Funktion extrahiert die erste Verbindung in der Warteschlange ausstehender Verbindungen sund überprüft sie anhand der Bedingungsfunktion, vorausgesetzt, die Bedingungsfunktion wird angegeben (d. h. nicht NULL). Die Bedingungsfunktion muss im selben Thread wie diese Routine ausgeführt werden. Wenn die Bedingungsfunktion CF_ACCEPT zurückgibt, erstellt LPWSPAccept einen neuen Socket.

Neu erstellte Sockets weisen die gleichen Eigenschaften wie die socket sauf, einschließlich netzwerkereignissen, die mit LPWSPAsyncSelect oder mit LPWSPEventSelectregistriert sind. Wie in DescriptorAllocationbeschrieben, müssen IFS-Anbieter WPUModifyIFSHandle- und Nicht-IFS-Anbieter WPUCreateSocketHandle-aufrufen.

Wenn die Bedingungsfunktion CF_REJECT zurückgibt, weist LPWSPAccept die Verbindungsanforderung zurück. Wenn die Annahme-/Ablehnungsentscheidung des Antrags nicht sofort getroffen werden kann, gibt die Bedingungsfunktion CF_DEFER zurück, um anzugeben, dass keine Entscheidung getroffen wurde. Es ist keine Aktion zu dieser Verbindungsanforderung vom Dienstanbieter zu ergreifen. Wenn die Anwendung bereit ist, eine Aktion für die Verbindungsanforderung auszuführen, ruft sie LPWSPAccept erneut auf und gibt entweder CF_ACCEPT oder CF_REJECT als Rückgabewert aus der Bedingungsfunktion zurück.

Wenn keine ausstehenden Verbindungen in der Warteschlange vorhanden sind, blockiert LPWSPAccept den Aufrufer für Sockets, die sich im (Standardeinstellungsmodus) befinden, bis eine Verbindung vorhanden ist. Wenn diese Funktion aufgerufen wird, wenn keine ausstehenden Verbindungen in der Warteschlange vorhanden sind, gibt LPWSPAccept den Fehlercode WSAEWOULDBLOCKzurück. Der akzeptierte Socket kann nicht verwendet werden, um weitere Verbindungen zu akzeptieren. Der ursprüngliche Socket bleibt geöffnet.

Der Parameter addr ist ein Ergebnisparameter, der mit der Adresse der Verbindungsentität gefüllt ist, die dem Dienstanbieter bekannt ist. Das genaue Format des addr Parameter wird durch die Adressfamilie bestimmt, in der die Kommunikation erfolgt. Die addrlen ist ein Wertergebnisparameter; sie enthält zunächst die Menge an Leerzeichen, auf die durch Addrverwiesen wird. Bei der Rückgabe muss sie die tatsächliche Länge (in Byte) der vom Dienstanbieter zurückgegebenen Adresse enthalten. Dieser Aufruf wird mit verbindungsorientierten Sockettypen wie SOCK_STREAM verwendet. Wenn addr und/oder addrlen gleich NULL sind, werden keine Informationen zur Remoteadresse des akzeptierten Sockets zurückgegeben. Andernfalls müssen diese beiden Parameter unabhängig davon ausgefüllt werden, ob die Bedingungsfunktion angegeben oder zurückgegeben wird.

Der Prototyp der Bedingungsfunktion lautet wie folgt.

int CALLBACK 
ConditionFunc( 
  IN     LPWSABUF    lpCallerId, 
  IN     LPWSABUF    lpCallerData, 
  IN OUT LPQOS       lpSQOS, 
  IN OUT LPQOS       lpGQOS,
  IN     LPWSABUF    lpCalleeId, 
  IN     LPWSABUF    lpCalleeData, 
  OUT    GROUP FAR * g, 	
  IN     DWORD_PTR   dwCallbackData
);

Die lpCallerId und lpCallerData- sind Wertparameter, die die Adresse der Verbindungsentität und alle Benutzerdaten enthalten müssen, die zusammen mit der Verbindungsanforderung gesendet wurden. Wenn keine Aufruferbezeichner- oder Aufruferdaten verfügbar sind, ist der entsprechende Parameter NULL. Viele Netzwerkprotokolle unterstützen keine Verbindungszeit-Anruferdaten. Die meisten herkömmlichen Netzwerkprotokolle können erwartet werden, dass Anruferbezeichnerinformationen zur Verbindungsanforderungszeit unterstützt werden. Der buf Teil des WSABUF-, auf den lpCallerId verweist auf einen Sockaddr. Die sockaddr wird gemäß ihrer Adressfamilie interpretiert (in der Regel durch Umwandlung des sockaddr in einen bestimmten Typ, der für die Adressfamilie spezifisch ist).

Der lpSQOS Parameter verweist auf die Ablaufspezifikationen für Sockets s, die vom Aufrufer angegeben werden, eine für jede Richtung, gefolgt von zusätzlichen anbieterspezifischen Parametern. Die Sende- oder Empfangsflussspezifikationswerte werden für alle unidirektionalen Sockets entsprechend ignoriert. Ein Nullwert für lpSQOS- gibt an, dass keine vom Aufrufer bereitgestellten QoS vorhanden ist und dass keine Aushandlung möglich ist. Ein nichtNULL-lpSQOS- Zeiger gibt an, dass eine QoS-Aushandlung erfolgen soll oder der Anbieter bereit ist, die QoS-Anforderung ohne Aushandlung zu akzeptieren.

Die lpCalleeId ist ein Wertparameter, der die lokale Adresse der verbundenen Entität enthält. Der buf Teil des WSABUF-, auf den lpCalleeId verweist auf einen sockaddr. Die sockaddr wird gemäß ihrer Adressfamilie interpretiert (in der Regel durch Umwandlung des sockaddr in einen bestimmten Typ, der für die Adressfamilie spezifisch ist).

Die lpCalleeData- ist ein Ergebnisparameter, der von der Bedingungsfunktion verwendet wird, um Benutzerdaten an die Verbindungsentität zurückzuliefern. Die Speicherung dieser Daten muss vom Dienstanbieter bereitgestellt werden. Die lpCalleeData-->len enthält zunächst die Länge des vom Dienstanbieter zugewiesenen Puffers und verweist auf lpCalleeData->buf. Ein Wert von Null bedeutet, dass benutzerdaten zurück an den Aufrufer übergeben werden, wird nicht unterstützt. Die Bedingungsfunktion kopiert bis zu lpCalleeData->len Byte von Daten in lpCalleeData-->buf, und aktualisieren Sie dann lpCalleeData->len, um die tatsächliche Anzahl der übertragenen Bytes anzugeben. Wenn keine Benutzerdaten an den Aufrufer übergeben werden sollen, legt die Bedingungsfunktion lpCalleeData-fest –>len auf Null. Das Format aller Adress- und Benutzerdaten ist spezifisch für die Adressfamilie, zu der der Socket gehört.

Der an die Bedingungsfunktion übergebene dwCallbackData Parameterwert ist der Wert, der als dwCallbackData Parameter im ursprünglichen LPWSPAccept Aufruf übergeben wird. Dieser Wert wird nur vom Windows Sockets 2-Client interpretiert. Auf diese Weise kann ein Client kontextbezogene Informationen von der LPWSPAccept Aufrufen der Website an die Bedingungsfunktion übergeben, die die Bedingungsfunktion mit allen zusätzlichen Informationen bereitstellt, die erforderlich sind, um zu bestimmen, ob die Verbindung akzeptiert werden soll. Eine typische Verwendung besteht darin, einen (entsprechend umwandelnden) Zeiger an eine Datenstruktur zu übergeben, die Verweise auf anwendungsdefinierte Objekte enthält, denen dieser Socket zugeordnet ist.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 2000 Professional [nur Desktop-Apps]
mindestens unterstützte Server- Windows 2000 Server [nur Desktop-Apps]
Zielplattform- Fenster
Header- ws2spi.h

Siehe auch

LPWSPAsyncSelect-

LPWSPBind-

LPWSPConnect-

LPWSPEventSelect-

LPWSPGetSockOpt-

LPWSPListen-

LPWSPSelect-

LPWSPSocket-