Funzione closesocket (winsock.h)

La funzione closesocket chiude un socket esistente.

Sintassi

int closesocket(
  [in] SOCKET s
);

Parametri

[in] s

Descrittore che identifica il socket da chiudere.

Valore restituito

Se non si verifica alcun errore, closesocket restituisce zero. In caso contrario, viene restituito un valore di SOCKET_ERROR e è possibile recuperare un codice di errore specifico chiamando WSAGetLastError.

Codice di errore Significato
WSANOTINITIALISED
Prima di usare questa funzione, è necessario che venga eseguita una chiamata WSAStartup riuscita.
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAENOTSOCK
Il descrittore non è un socket.
WSAEINPROGRESS
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure il provider di servizi sta ancora elaborando una funzione di callback.
WSAEINTR
La chiamata di Windows Socket 1.1 (blocco) è stata annullata tramite WSACancelBlockingCall.
WSAEWOULDBLOCK
Il socket è contrassegnato come non bloccante, ma il membro l_onoff della struttura di linger è impostato su diverso da zero e il membro l_linger della struttura di linger viene impostato su un valore di timeout diverso da zero.

Commenti

La funzione closesocket chiude un socket. Usarlo per rilasciare il descrittore del socket passato nel parametro s . Si noti che il descrittore socket passato nel parametro s può essere riutilizzato immediatamente dal sistema non appena viene eseguita la funzione closesocket . Di conseguenza, non è affidabile aspettarsi ulteriori riferimenti al descrittore di socket passato nel parametro s per avere esito negativo con l'errore WSAENOTSOCK. Un client Winsock non deve mai emettere closesocket contemporaneamente a un'altra chiamata di funzione Winsock.

Tutte le operazioni di invio e ricezione sovrapposte in sospeso ( WSASend/ WSASendTo/ WSARecv/ WSARecvFrom con un socket sovrapposto) rilasciate da qualsiasi thread in questo processo vengono annullate. Viene eseguita qualsiasi azione di evento, routine di completamento o porta di completamento specificata per queste operazioni sovrapposte. Le operazioni sovrapposte in sospeso hanno esito negativo con lo stato di errore WSA_OPERATION_ABORTED.

Un'applicazione non deve presupporre che tutte le operazioni di I/O in sospeso su un socket vengano completate al termine quando viene restituito closesocket . La funzione closesocket avvierà l'annullamento nelle operazioni di I/O in sospeso, ma ciò non significa che un'applicazione riceverà il completamento di I/O per queste operazioni di I/O entro il momento in cui la funzione closesocket restituisce . Pertanto, un'applicazione non deve pulire alcuna risorsa (strutture WSAOVERLAPPED , ad esempio) a cui fanno riferimento le richieste di I/O in sospeso fino al completamento delle richieste di I/O.

Un'applicazione deve sempre avere una chiamata corrispondente a closesocket per ogni chiamata riuscita al socket per restituire tutte le risorse socket al sistema.

La strutturalinger mantiene informazioni su un socket specifico che specifica il comportamento del socket quando i dati vengono accodati per l'invio e la funzione closesocket viene chiamata sul socket.

Il membro l_onoff della struttura persistente determina se un socket deve rimanere aperto per un periodo di tempo specificato dopo una chiamata di funzione closesocket per consentire l'invio dei dati in coda. Questo membro può essere modificato in due modi:

  • Chiamare la funzione setsockopt con il parametro optname impostato su SO_DONTLINGER. Il parametro optval determina la modalità di modifica del membro l_onoff .
  • Chiamare la funzione setsockopt con il parametro optname impostato su SO_LINGER. Il parametro optval specifica come vengono modificati sia i membri l_onoff che i membri l_linger .

Il l_linger membro della struttura del ritardo determina la quantità di tempo, in secondi, deve rimanere aperta un socket. Questo membro è applicabile solo se il membro l_onoff della struttura persistente è diverso da zero.

I parametri predefiniti per un socket sono il membro l_onoff della struttura persistente è zero, a indicare che il socket non deve rimanere aperto. Il valore predefinito per il membro l_linger della struttura linger è zero, ma questo valore viene ignorato quando il membro l_onoff è impostato su zero.

Per consentire a un socket di rimanere aperto, un'applicazione deve impostare il membro l_onoff su un valore diverso da zero e impostare il membro l_linger sul timeout desiderato in secondi. Per disabilitare un socket dall'apertura rimanente, un'applicazione deve solo impostare il membro l_onoff della struttura persistente su zero.

Se un'applicazione chiama la funzione setsockopt con il parametro optname impostato su SO_DONTLINGER per impostare il membro l_onoff su un valore diverso da zero, il valore per il membro l_linger non viene specificato. In questo caso, il timeout usato dipende dall'implementazione. Se è stato stabilito un timeout precedente per un socket (chiamando in precedenza la funzione setsockopt con il parametro optname impostato su SO_LINGER), questo valore di timeout deve essere ripristinato dal provider di servizi.

La semantica della funzione closesocket è influenzata dalle opzioni del socket che impostano i membri della struttura persistente .

l_onoff l_linger Tipo di chiusura Aspettate la chiusura?
zero Non importa Chiusura normale No
diverso da zero zero Difficile No
diverso da zero diverso da zero Normale se tutti i dati vengono inviati entro il valore di timeout specificato nel membro l_linger .

Hard se non è stato possibile inviare tutti i dati entro il valore di timeout specificato nel membro l_linger .

 

Se il membro l_onoff della struttura LINGER è zero su un socket di flusso, la chiamata closesocket restituirà immediatamente e non riceve WSAEWOULDBLOCK se il socket blocca o non blocca. Tuttavia, tutti i dati accodati per la trasmissione verranno inviati, se possibile, prima che il socket sottostante venga chiuso. Si tratta anche di una disconnessione normale o di chiusura. In questo caso, il provider Windows Sockets non può rilasciare il socket e altre risorse per un periodo arbitrario, influenzando così le applicazioni che prevedono di usare tutti i socket disponibili. Questo è il comportamento predefinito per un socket.

Se il membro l_onoff della struttura linger è diverso da zero e l_linger membro è zero, closesocket non viene bloccato anche se i dati in coda non sono ancora stati inviati o riconosciuti. Si tratta di una chiusura difficile o interrotta, perché il circuito virtuale del socket viene reimpostato immediatamente e tutti i dati non inviati vengono persi. In Windows qualsiasi chiamata recv sul lato remoto del circuito avrà esito negativo con WSAECONNRESET.

Se il membro l_onoff della struttura di attesa è impostato su diverso da zero e l_linger membro è impostato su un timeout diverso da zero su un socket di blocco, la chiamata closesocket si blocca fino a quando i dati rimanenti non sono stati inviati o fino alla scadenza del timeout. Questa operazione viene chiamata disconnessione normale o chiusura se tutti i dati vengono inviati entro il valore di timeout specificato nel membro l_linger . Se il timeout scade prima dell'invio di tutti i dati, l'implementazione di Windows Sockets termina la connessione prima che closesocket restituisca un risultato e viene chiamato chiusura rigida o interrotta.

Non è consigliabile impostare il membro l_onoff della struttura persistente su diverso da zero e il membro l_linger con un intervallo di timeout diverso da zero in un socket non bloccante. In questo caso, la chiamata a closesocket avrà esito negativo con un errore WSAEWOULDBLOCK se l'operazione di chiusura non può essere completata immediatamente. Se closesocket ha esito negativo con WSAEWOULDBLOCK , l'handle del socket è ancora valido e non viene avviata una disconnessione. L'applicazione deve chiamare di nuovo closesocket per chiudere il socket.

Se il membro l_onoff della struttura linger è diverso da zero e il membro l_linger è un intervallo di timeout diverso da zero su un socket di blocco, il risultato della funzione closesocket non può essere usato per determinare se tutti i dati sono stati inviati al peer. Se i dati vengono inviati prima del timeout specificato nel membro l_linger scade o se la connessione è stata interrotta, la funzione closesocket non restituirà un codice di errore (il valore restituito dalla funzione closesocket è zero).

La chiamata closesocket verrà bloccata solo fino a quando tutti i dati non vengono recapitati al peer o il timeout scade. Se la connessione viene reimpostata perché il timeout scade, il socket non passerà allo stato TIME_WAIT. Se tutti i dati vengono inviati entro il periodo di timeout, il socket può passare allo stato TIME_WAIT.

Se il membro l_onoff della struttura persistente è diverso da zero e il membro l_linger è un intervallo di timeout zero su un socket di blocco, una chiamata a closesocket reimposta la connessione. Il socket non passerà allo stato TIME_WAIT.

La funzione getsockopt può essere chiamata con il parametro optname impostato su SO_LINGER per recuperare il valore corrente della struttura persistente associata a un socket.

Nota Per garantire che tutti i dati vengano inviati e ricevuti in una connessione, un'applicazione deve chiamare l'arresto prima di chiamare closesocket (vedere Arresto normale, opzioni di attesa e chiusura del socket per altre informazioni). Si noti inoltre che un evento di rete FD_CLOSE non viene pubblicato dopo la chiamata di closesocket .
 

Ecco un riepilogo del comportamento closesocket :

  • Se il membro l_onoff della struttura LINGER è zero (impostazione predefinita per un socket), closesocket restituisce immediatamente e la connessione viene chiusa normalmente in background.
  • Se il membro l_onoff della struttura persistente è impostato su diverso da zero e il membro l_linger è impostato su zero (nessun timeout) closesocket viene restituito immediatamente e la connessione viene reimpostata o terminata.
  • Se il membro l_onoff della struttura persistente è impostato su diverso da zero e il membro l_linger è impostato su un timeout diverso da zero: per un socket di blocco, closesocket si blocca fino a quando non vengono inviati tutti i dati o la scadenza del timeout.

    : per un socket non bloccante, closesocket restituisce immediatamente un errore.

Per altre informazioni, vedere Graceful Shutdown, Linger Options e Socket Closing per altre informazioni.

Nota Quando si esegue una chiamata winsock di blocco, ad esempio closesocket, Winsock potrebbe dover attendere il completamento di un evento di rete. Winsock esegue un'attesa avvisabile in questa situazione, che può essere interrotta da una chiamata di procedura asincrona pianificata nello stesso thread. L'esecuzione di un'altra chiamata Winsock bloccante all'interno di un APC che ha interrotto una chiamata winsock in corso sullo stesso thread causerà un comportamento non definito e non deve mai essere tentata dai client Winsock.
 

Note per i socket IrDA

Tenere presente quanto segue:

  • Il file di intestazione Af_irda.h deve essere incluso in modo esplicito.
  • Sono supportate le opzioni standard di linger.
  • Anche se IrDA non fornisce una chiusura normale, IrDA rinvierà la chiusura fino a quando le code di ricezione non vengono eliminate. Un'applicazione può quindi inviare dati e chiamare immediatamente la funzione socket e assicurarsi che il ricevitore copierà i dati prima di ricevere un messaggio di FD_CLOSE.

Note per ATM

Di seguito sono riportati alcuni problemi importanti associati al disinstallazione della connessione quando si usa la modalità di trasferimento asincrono (ATM) e Windows Sockets 2:

  • L'uso delle funzioni closesocket o shutdown con SD_SEND o SD_BOTH comporta l'invio di un segnale RELEASE sul canale di controllo. A causa dell'uso di canali di segnale e dati separati da ATM, è possibile che un segnale RELEASE possa raggiungere la fine remota prima che l'ultimo dei dati raggiunga la destinazione, causando una perdita di tali dati. Una possibile soluzione è la programmazione di un ritardo sufficiente tra gli ultimi dati inviati e le chiamate di funzione closesocket o shutdown per un socket ATM.
  • La metà della chiusura non è supportata da ATM.
  • Le disconnessioni interrotte e graceful comportano l'invio di un segnale RELEASE con lo stesso campo di causa. In entrambi i casi, i dati ricevuti alla fine remota del socket vengono comunque recapitati all'applicazione. Per altre informazioni , vedere Arresto normale, opzioni Linger e Chiusura socket .

Windows Phone 8: questa funzione è supportata per le app dello Store di Windows Phone in Windows Phone 8 e versioni successive.

Windows 8.1 e Windows Server 2012 R2: questa funzione è supportata per le app di Windows Store in Windows 8.1, Windows Server 2012 R2 e versioni successive.

Requisiti

   
Client minimo supportato Windows 8.1, Windows Vista [app desktop | App UWP]
Server minimo supportato Windows Server 2003 [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione winsock.h (include Winsock2.h)
Libreria Ws2_32.lib
DLL Ws2_32.dll

Vedi anche

Arresto normale, opzioni Linger e chiusura socket

WSAAsyncSelect

WSADuplicateSocket

WSAOVERLAPPED

Funzioni Winsock

Informazioni di riferimento su Winsock

Accettare

getsockopt

ioctlsocket

Indugiare

Setsockopt

Socket