Share via


Funzione di callback LPWSPCANCELBLOCKINGCALL (ws2spi.h)

La funzione LPWSPCancelBlockingCall annulla una chiamata di blocco attualmente in corso.

Sintassi

LPWSPCANCELBLOCKINGCALL Lpwspcancelblockingcall;

int Lpwspcancelblockingcall(
  [out] LPINT lpErrno
)
{...}

Parametri

[out] lpErrno

Puntatore al codice di errore.

Valore restituito

Il valore restituito da LPWSPCancelBlockingCall è zero se l'operazione è stata annullata correttamente. In caso contrario, viene restituito il valore SOCKET_ERROR e in lpErrno è disponibile un codice di errore specifico.

Codice di errore Significato
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEINVAL
Indica che non è presente alcuna chiamata di blocco in sospeso.

Commenti

Questa funzione annulla tutte le operazioni di blocco in sospeso per questo thread. Viene in genere usato in due situazioni:

  • Un client SPI Windows Sockets elabora un messaggio ricevuto mentre un provider di servizi implementa pseudoblocking. In questo caso, WSAIsBlocking sarà true.
  • È in corso una chiamata di blocco e il provider di servizi Winsock ha richiamato alla funzione hook di blocco del client WINSock SPI (tramite la funzione di callback recuperata da WPUQueryBlockingCallback), che a sua volta richiama questa funzione. Tale situazione può verificarsi, ad esempio, nell'implementazione di un'opzione Annulla per un'operazione che richiede un tempo prolungato per il completamento.

In ogni caso, la chiamata di blocco originale terminerà il prima possibile con l'errore WSAEINTR. (Nella prima istanza la terminazione non verrà eseguita finché la pianificazione dei messaggi di Windows non ha causato il ripristino della routine di blocco pseudoblocca in Winsock. Nella seconda istanza la chiamata di blocco verrà terminata non appena la funzione hook di blocco viene completata.

Nel caso di un'operazione LPWSPConnect bloccante, Winsock terminerà la chiamata di blocco il prima possibile, ma non sarà possibile rilasciare le risorse del socket fino al completamento della connessione (e quindi reimpostata) o al timeout. È probabile che ciò sia evidente solo se il client SPI Winsock tenta immediatamente di aprire un nuovo socket (se non sono disponibili socket) o di connettersi allo stesso peer tramite una chiamata LPWSPConnect .

L'annullamento di una chiamata LPWSPAccept o LPWSPSelect non influisce negativamente sui socket passati a queste chiamate. Solo la chiamata specifica ha esito negativo; qualsiasi operazione legale prima dell'annullamento è legale dopo l'annullamento e lo stato del socket non è interessato in alcun modo.

L'annullamento di qualsiasi operazione diversa da LPWSPAccept e LPWSPSelect può lasciare il socket in uno stato indeterminato. Se un client WINSock SPI annulla un'operazione di blocco su un socket, l'unica operazione che il client SPI Winsock sarà in grado di eseguire sul socket è una chiamata a LPWSPCloseSocket, anche se altre operazioni possono funzionare su alcuni provider di servizi Winsock. Se un client WINSock SPI richiede la portabilità massima, è necessario prestare attenzione a non dipendere dall'esecuzione di operazioni dopo un'operazione di annullamento. Un client WINSock SPI può reimpostare la connessione impostando il timeout su SO_LINGER su zero e chiamando LPWSPCloseSocket.

Se un'operazione di annullamento ha compromesso l'integrità del flusso di dati di un SOCK_STREAM in qualsiasi modo, il provider Winsock reimposta la connessione e non riesce tutte le operazioni future diverse da LPWSPCloseSocket con WSAECONNABORTED.

È accettabile che LPWSPCancelBlockingCall restituisca correttamente se l'operazione di rete di blocco viene completata prima dell'annullamento. In questo caso, l'operazione di blocco restituirà correttamente come se LPWSPCancelBlockingCall non fosse mai stato chiamato. L'unico modo per il client SPI Winsock di confermare che un'operazione è stata effettivamente annullata consiste nel verificare la presenza di un codice restituito di WSAEINTR dalla chiamata di blocco.

Requisiti

Requisito Valore
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Intestazione ws2spi.h

Vedi anche

WPUQueryBlockingCallback

WSAIsBlocking

LPWSPAccept

LPWSPCloseSocket

LPWSPSelect

LPWSPSocket