Funzione di callback LPWSPACCEPT (ws2spi.h)
La LPWSPAccept funzione accetta in modo condizionale una connessione in base al valore restituito di una funzione condizione.
Sintassi
LPWSPACCEPT Lpwspaccept;
SOCKET Lpwspaccept(
[in] SOCKET s,
[out] sockaddr *addr,
[in, out] LPINT addrlen,
[in] LPCONDITIONPROC lpfnCondition,
[in] DWORD_PTR dwCallbackData,
[out] LPINT lpErrno
)
{...}
Parametri
[in] s
Descrittore che identifica un socket in ascolto delle connessioni dopo un LPWSPListen.
[out] addr
Puntatore facoltativo a un buffer che riceve l'indirizzo dell'entità di connessione, noto come provider di servizi. Il formato esatto del parametro addr
[in, out] addrlen
Puntatore facoltativo a un numero intero contenente la lunghezza del parametro addr
[in] lpfnCondition
Indirizzo dell'istanza di routine di una funzione di condizione facoltativa fornita da Windows Sockets. Questa funzione viene usata nella decisione accept o reject in base alle informazioni del chiamante passate come parametri.
[in] dwCallbackData
I dati di callback da passare al client Windows Socket 2 come valore del parametro dwCallbackData della funzione condition. Questo parametro non viene interpretato dal provider di servizi.
[out] lpErrno
Puntatore al codice di errore.
Valore restituito
Se non si verifica alcun errore, LPWSPAccept restituisce un valore di tipo SOCKET che è un descrittore per il socket accettato. In caso contrario, viene restituito un valore di INVALID_SOCKET e un codice di errore specifico è disponibile in lpErrno.
Codice errore | Significato |
---|---|
|
La richiesta di connessione è stata rifiutata forzatamente come indicato nel valore restituito della funzione condizione (CF_REJECT). |
È stata indicata una connessione in ingresso, ma successivamente è stata terminata dal peer remoto prima di accettare la chiamata. | |
Il sottosistema di rete non è riuscito. | |
Il parametro addrlen |
|
Una chiamata (blocco) è stata annullata tramite LPWSPCancelBlockingCall. | |
È in corso una chiamata di Windows Sockets bloccante. | |
LPWSPListen non è stato richiamato prima di LPWSPAccept, il parametro g specificato nella funzione della condizione non è un valore valido, il valore restituito della funzione della condizione non è valido o qualsiasi caso in cui il socket specificato non sia in uno stato non valido. | |
La coda non viene annullata all'ingresso in LPWSPAccept e non sono disponibili descrittori socket. | |
Non è disponibile alcuno spazio nel buffer. | |
Il descrittore non è un socket. | |
Socket a cui si fa riferimento non è un tipo che supporta il servizio orientato alla connessione. | |
L'accettazione della richiesta di connessione è stata posticipata come indicato nel valore restituito della funzione condizione (CF_DEFER). | |
Il socket è contrassegnato come non bloccante e non sono presenti connessioni da accettare. | |
La richiesta di connessione offerta è scaduta o ritirata. |
Osservazioni
La funzione LPWSPAccept
I socket appena creati hanno le stesse proprietà del socket , inclusi gli eventi di rete registrati con LPWSPAsyncSelect o con LPWSPEventSelect. Come descritto in DescriptorAllocation, quando vengono allocati nuovi descrittori socket, i provider IFS devono chiamare WPUModifyIFSHandle e provider non IFS devono chiamare WPUCreateSocketHandle.
Se la funzione condizione restituisce CF_REJECT, LPWSPAccept rifiuta la richiesta di connessione. Se non è possibile prendere immediatamente la decisione di accettazione/rifiuto dell'applicazione, la funzione condizione restituirà CF_DEFER per indicare che non è stata presa alcuna decisione. Nessuna azione su questa richiesta di connessione deve essere eseguita dal provider di servizi. Quando l'applicazione è pronta per intervenire sulla richiesta di connessione, richiama LPWSPAccept e restituisce CF_ACCEPT o CF_REJECT come valore restituito dalla funzione condizione.
Per i socket in modalità di blocco (impostazione predefinita), se nella coda non sono presenti connessioni in sospeso, LPWSPAccept blocca il chiamante fino a quando non è presente una connessione. Per i socket in modalità non bloccante, se questa funzione viene chiamata quando non sono presenti connessioni in sospeso nella coda, LPWSPAccept restituisce il codice di errore WSAEWOULDBLOCK. Il socket accettato non può essere utilizzato per accettare più connessioni. Il socket originale rimane aperto.
Il parametro addr è un parametro di risultato compilato con l'indirizzo dell'entità di connessione, noto come provider di servizi. Il formato esatto del parametro di addr è determinato dalla famiglia di indirizzi in cui si sta verificando la comunicazione. Il addrlen è un parametro value-result; inizialmente conterrà la quantità di spazio a cui punta addr. In caso di restituzione, deve contenere la lunghezza effettiva (in byte) dell'indirizzo restituito dal provider di servizi. Questa chiamata viene usata con tipi socket orientati alla connessione, ad esempio SOCK_STREAM. Se addr e/o addrlen sono uguali a Null, non viene restituita alcuna informazione sull'indirizzo remoto del socket accettato. In caso contrario, questi due parametri devono essere compilati indipendentemente dal fatto che la funzione della condizione venga specificata o restituita.
Il prototipo della funzione della condizione è il seguente.
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
);
Il lpCallerId e lpCallerData sono parametri di valore che devono contenere l'indirizzo dell'entità di connessione e tutti i dati utente inviati insieme alla richiesta di connessione. Se non è disponibile alcun identificatore del chiamante o dati del chiamante, il parametro corrispondente sarà Null. Molti protocolli di rete non supportano i dati del chiamante in fase di connessione. La maggior parte dei protocolli di rete convenzionali può essere prevista per supportare le informazioni sull'identificatore del chiamante in fase di richiesta di connessione. La parte buf
Il parametro lpSQOS fa riferimento alle specifiche del flusso per il socket specificato dal chiamante, uno per ogni direzione, seguito da eventuali parametri aggiuntivi specifici del provider. I valori di specifica del flusso di invio o ricezione verranno ignorati in base alle esigenze di qualsiasi socket unidirezionale. Un valore Null per lpSQOS indica che non è disponibile alcun QoS fornito dal chiamante e che non è possibile negoziare. Un puntatore NULL non
Il lpCalleeId è un parametro di valore che contiene l'indirizzo locale dell'entità connessa. La buf parte della WSABUF a cui punta lpCalleeId punta a un sockaddr. Il sockaddr viene interpretato in base alla famiglia di indirizzi (in genere eseguendo il cast del sockaddr a un tipo specifico della famiglia di indirizzi).
Il
Il valore del parametro
Fabbisogno
Requisito | Valore |
---|---|
client minimo supportato | Windows 2000 Professional [solo app desktop] |
server minimo supportato | Windows 2000 Server [solo app desktop] |
piattaforma di destinazione | Finestre |
intestazione |
ws2spi.h |