Share via


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 verbindenden Entität empfängt, wie dem Dienstanbieter bekannt ist. Das genaue Format des addr-Parameters 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-Parameters in Bytes enthält.

[in] lpfnCondition

Prozedur instance Adresse einer optionalen Bedingungsfunktion, die von Windows Sockets bereitgestellt wird. Diese Funktion wird in der Annahme- oder Ablehnungsentscheidung basierend auf den Aufruferinformationen verwendet, die als Parameter übergeben werden.

[in] dwCallbackData

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

[out] lpErrno

Zeiger 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 der Wert INVALID_SOCKET zurückgegeben, und ein bestimmter Fehlercode ist in lpErrno verfügbar.

Fehlercode Bedeutung
WSAECONNREFUSED
Die Verbindungsanforderung wurde wie im Rückgabewert der Bedingungsfunktion (CF_REJECT) angegeben, gewaltsam abgelehnt.
WSAECONNRESET
Es wurde eine eingehende Verbindung angegeben, die jedoch vor der Annahme des Anrufs vom Remotepeer beendet wurde.
WSAENETDOWN
Beim Netzwerksubsystem ist ein Fehler aufgetreten.
WSAEFAULT
Der addrlen-Parameter ist zu klein, oder der Parameter lpfnCondition ist nicht Teil des Benutzeradressraums.
WSAEINTR
Ein (blockierender) Aufruf wurde über LPWSPCancelBlockingCall abgebrochen.
WSAEINPROGRESS
Ein blockierter Windows Sockets-Aufruf wird ausgeführt.
WSAEINVAL
LPWSPListen wurde vor LPWSPAccept nicht aufgerufen, der in der Bedingungsfunktion angegebene Parameter g ist kein gültiger Wert, der Rückgabewert der Bedingungsfunktion ist kein gültiger Wert, oder in jedem Fall, in dem sich der angegebene Socket in einem ungültigen Zustand befindet.
WSAEMFILE
Die Warteschlange ist beim Einstieg in LPWSPAccept nicht leer, und es sind keine Socketdeskriptoren verfügbar.
WSAENOBUFS
Es ist kein Pufferplatz verfügbar.
WSAENOTSOCK
Der Deskriptor ist kein Socket.
WSAEOPNOTSUPP
Der Socket, auf den verwiesen wird, ist kein Typ, der den verbindungsorientierten Dienst unterstützt.
WSATRY_AGAIN
Die Annahme der Verbindungsanforderung wurde wie im Rückgabewert der Bedingungsfunktion (CF_DEFER) angegeben zurückgestellt.
WSAEWOULDBLOCK
Socket ist als nicht blockierend gekennzeichnet, und es sind keine Verbindungen vorhanden, die akzeptiert werden.
WSAEACCES
Die angebotene Verbindungsanforderung hat ein Timeout oder wurde zurückgezogen.

Hinweise

Die LPWSPAccept-Funktion extrahiert die erste Verbindung in der Warteschlange der ausstehenden Verbindungen in Sockets und überprüft sie mit der Bedingungsfunktion, sofern die Bedingungsfunktion angegeben ist (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 Sockets auf, einschließlich netzwerkrelevanter Ereignisse, die mit LPWSPAsyncSelect oder LPWSPEventSelect registriert wurden. Wie in DescriptorAllocation beschrieben, müssen IFS-Anbieter WPUModifyIFSHandle aufrufen, wenn neue Socketdeskriptoren zugewiesen werden, und Nicht-IFS-Anbieter müssen WPUCreateSocketHandle aufrufen.

Wenn die Bedingungsfunktion CF_REJECT zurückgibt, lehnt LPWSPAccept die Verbindungsanforderung ab. Wenn die Annahme-/Ablehnungsentscheidung der Anwendung nicht sofort getroffen werden kann, gibt die Bedingungsfunktion CF_DEFER zurück, um anzugeben, dass keine Entscheidung getroffen wurde. Der Dienstanbieter möchte keine Aktion für diese Verbindungsanforderung ausführen. Wenn die Anwendung bereit ist, Maßnahmen für die Verbindungsanforderung zu ergreifen, ruft sie LPWSPAccept erneut auf und gibt entweder CF_ACCEPT oder CF_REJECT als Rückgabewert von der Bedingungsfunktion zurück.

Für Sockets, die sich im (Standard-)Blockierungsmodus befinden, blockiert LPWSPAccept den Aufrufer, bis eine Verbindung vorhanden ist, wenn keine ausstehenden Verbindungen in der Warteschlange vorhanden sind. Wenn diese Funktion für Sockets im Nichtblockierungsmodus aufgerufen wird, wenn keine ausstehenden Verbindungen in der Warteschlange vorhanden sind, gibt LPWSPAccept den Fehlercode WSAEWOULDBLOCK zurü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 verbindenden Entität gefüllt wird, wie sie dem Dienstanbieter bekannt ist. Das genaue Format des Addr-Parameters wird durch die Adressfamilie bestimmt, in der die Kommunikation stattfindet. Das addrlen ist ein Wert-Ergebnis-Parameter. Sie enthält zunächst die Menge an Speicherplatz, auf die vom Addr verwiesen wird. Bei der Rückgabe muss sie die tatsächliche Länge (in Bytes) der vom Dienstanbieter zurückgegebenen Adresse enthalten. Dieser Aufruf wird für verbindungsorientierte 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 eingegeben werden, ob die Bedingungsfunktion angegeben ist oder was sie zurückgibt.

Der Prototyp der Bedingungsfunktion sieht wie folgt aus.

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
);

LpCallerId und lpCallerData sind Wertparameter, die die Adresse der verbindenden Entitä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 Verbindungszeitaufrufdaten. Von den meisten herkömmlichen Netzwerkprotokollen kann erwartet werden, dass sie Anruferbezeichnerinformationen zum Zeitpunkt der Verbindungsanforderung unterstützen. Der buf-Teil des WSABUF , auf den lpCallerId verweist, zeigt auf einen Sockaddr. Der Sockaddr wird entsprechend seiner Adressfamilie interpretiert (in der Regel durch Umwandlung des Sockaddr in einen Typ, der für die Adressfamilie spezifisch ist).

Der lpSQOS-Parameter verweist auf die Vom Aufrufer angegebenen Datenflussspezifikationen für Sockets , eine für jede Richtung, gefolgt von allen zusätzlichen anbieterspezifischen Parametern. Die Werte des sendenden oder empfangenden Flusses werden für alle unidirektionalen Sockets ignoriert. Ein NULL-Wert für lpSQOS gibt an, dass keine vom Aufrufer bereitgestellte QoS vorhanden ist und dass keine Aushandlung möglich ist. Ein lpSQOS-Zeiger ohne NULL gibt an, dass eine QoS-Aushandlung erfolgen soll oder dass 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 von lpCalleeId verwiesen wird, zeigt auf einen Sockaddr. Der Sockaddr wird entsprechend seiner Adressfamilie interpretiert (in der Regel durch Umwandlung des Sockaddr in einen Typ, der für die Adressfamilie spezifisch ist).

LpCalleeData ist ein Ergebnisparameter, der von der Bedingungsfunktion verwendet wird, um Benutzerdaten an die verbindende Entität zurück zu geben. Der Speicher für diese Daten muss vom Dienstanbieter bereitgestellt werden. LpCalleeData-len> enthält zunächst die Länge des Puffers, der vom Dienstanbieter zugewiesen und vonlpCalleeData-buf> auf verwiesen wird. Ein Wert von null bedeutet, dass die Übergabe von Benutzerdaten an den Aufrufer nicht unterstützt wird. Die Bedingungsfunktion kopiert bis zu lpCalleeData-len> Datenbytes in lpCalleeData-buf>, und aktualisiert dannlpCalleeData-len>, um die tatsächliche Anzahl der übertragenen Bytes anzugeben. Wenn keine Benutzerdaten an den Aufrufer zurückgegeben werden sollen, legt die Bedingungsfunktion lpCalleeData-len> auf Null fest. Das Format aller Adress- und Benutzerdaten ist spezifisch für die Adressfamilie, zu der der Socket gehört.

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

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 2000 Professional [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile ws2spi.h

Weitere Informationen

LPWSPAsyncWählen

LPWSPBind

LPWSPConnect

LPWSPEventSelect

LPWSPGetSockOpt

LPWSPListen

LPWSPSelect

LPWSPSocket