Condividi tramite


Funzione di callback LPWSPCLOSESOCKET (ws2spi.h)

La funzione LPWSPCloseSocket chiude un socket.

Sintassi

LPWSPCLOSESOCKET Lpwspclosesocket;

int Lpwspclosesocket(
  [in]  SOCKET s,
  [out] LPINT lpErrno
)
{...}

Parametri

[in] s

Descrittore che identifica un socket.

[out] lpErrno

Puntatore al codice di errore.

Valore restituito

Se non si verifica alcun errore, LPWSPCloseSocket restituisce zero. In caso contrario, viene restituito un valore di SOCKET_ERROR e un codice di errore specifico è disponibile in lpErrno.

Codice di errore Significato
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEINPROGRESS
Il blocco della chiamata a Windows Sockets è in corso oppure il provider di servizi sta ancora elaborando una funzione di callback.
WSAENOTSOCK
Il descrittore non è un socket.
WSAEWOULDBLOCK
Il socket è contrassegnato come non bloccante e SO_LINGER è impostato su un valore di timeout diverso da zero.

Commenti

Questa funzione chiude un socket. Più precisamente , rilascia il descrittore di socket, quindi altri riferimenti a s devono non riuscire con l'errore WSAENOTSOCK. Se si tratta dell'ultimo riferimento a un socket sottostante, le informazioni di denominazione associate e i dati in coda vengono eliminati. Tutte le chiamate di blocco o asincrone in sospeso sul socket (rilasciate da qualsiasi thread in questo processo) vengono annullate senza pubblicare messaggi di notifica. Tutte le operazioni sovrapposte in sospeso rilasciate da qualsiasi thread in questo processo vengono annullate. Qualsiasi azione di completamento specificata per queste operazioni sovrapposte viene eseguita (ad esempio, evento, routine di completamento o porta di completamento). In questo caso, le operazioni sovrapposte in sospeso hanno esito negativo con lo stato di errore WSA_OPERATION_ABORTED . FD_CLOSE non verrà pubblicato dopo che viene chiamato LPWSPCloseSocket .

Il comportamento di LPWSPCloseSocket viene riepilogato come segue:

  • Se SO_DONTLINGER è abilitata (impostazione predefinita), LPWSPCloseSocket restituisce immediatamente e la connessione viene chiusa in modo normale in background.

  • Se SO_LINGER è abilitato con un timeout zero, LPWSPCloseSocket restituisce immediatamente e la connessione viene reimpostata/terminata.

    oppure

  • Se SO_LINGER è abilitato con un timeout diverso da zero con un socket di blocco, LPWSPCloseSocket blocca finché non vengono inviati tutti i dati o scade il timeout.

  • Se SO_LINGER è abilitato con un timeout diverso da zero con un socket non sbloccante, LPWSPCloseSocket restituisce immediatamente, in modo da indicare l'errore.

La semantica di LPWSPCloseSocket è interessata dalle opzioni del socket SO_LINGER e SO_DONTLINGER come indicato di seguito.

Opzione Interval Tipo di chiusura Attendere la chiusura?
SO_DONTLINGER Non importa Normale No
SO_LINGER Zero Difficile No
SO_LINGER Non zero Normale

 

 

Se SO_LINGER è impostato (ovvero, il membro l_onoff della struttura persistente è diverso da zero) e l'intervallo di timeout, l_linger, è zero, LPWSPCloseSocket non viene bloccato anche se i dati in coda non sono ancora stati inviati o riconosciuti. Si tratta di una chiusura dura o interrotta, perché il circuito virtuale del socket viene reimpostato immediatamente e tutti i dati non inviati vengono persi. Qualsiasi chiamata LPWSPRecv sul lato remoto del circuito avrà esito negativo con WSAECONNRESET.

Se SO_LINGER è impostato con un intervallo di timeout diverso da zero su un socket di blocco, i blocchi di chiamata LPWSPCloseSocket in un socket di blocco fino a quando i dati rimanenti non vengono inviati o fino alla scadenza del timeout. Questo è chiamato disconnessione graziata. Se il timeout scade prima dell'invio di tutti i dati, il provider di servizi deve terminare la connessione prima che LPWSPCloseSocket restituisca.

L'abilitazione di SO_LINGER con un intervallo di timeout diverso da zero in un socket non sbloccante non è consigliabile. In questo caso, la chiamata a LPWSPCloseSocket avrà esito negativo con un errore di WSAEWOULDBLOCK se l'operazione di chiusura non può essere completata immediatamente. Se LPWSPCloseSocket ha esito negativo con WSAEWOULDBLOCK, l'handle del socket è ancora valido e non viene avviata una disconnessione.

Il client WINSock SPI deve chiamare di nuovo LPWSPCloseSocket per chiudere il socket, anche se LPWSPCloseSocket può continuare a non riuscire a meno che il client Winsock SPI non esegue una delle operazioni seguenti:

  • Disabilita SO_DONTLINGER.
  • Abilita SO_LINGER con un timeout zero.
  • Chiama LPWSPShutdown per avviare la chiusura.

Se SO_DONTLINGER è impostato su un socket di flusso, ovvero il membro l_onoff della struttura persistente è zero), la chiamata LPWSPCloseSocket restituirà immediatamente e non riceverà WSAEWOULDBLOCK, indipendentemente dal blocco o dal blocco del socket. Tuttavia, tutti i dati accodati per la trasmissione verranno inviati se possibile prima della chiusura del socket sottostante. Si tratta di una disconnessione graziata ed è il comportamento predefinito.

Si noti che in questo caso il provider Winsock può conservare tutte le risorse associate al socket fino a quando non è stata completata la disconnessione graziata o il provider termina la connessione a causa di un'incapacità di completare l'operazione in un periodo di tempo determinato dal provider. Ciò può influire sui client Winsock che si prevede di usare tutti i socket disponibili. Si tratta del comportamento predefinito; SO_DONTLINGER è impostato per impostazione predefinita.

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

LPWSPAccept

LPWSPIoctl

WSPSetSockOpt

LPWSPSocket