Funzione closesocket (winsock2.h)

La funzione closesocket chiude un socket esistente.

Sintassi

int WSAAPI 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 struttura linger 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_onoffdella struttura linger è impostato su non zero e il membro l_linger è impostato su zero (nessun timeout) closesocket restituisce immediatamente e la connessione viene reimpostata o terminata.
  • Se il membro l_onoffdella struttura persistente è impostato su non zero e il membro l_linger è impostato su un timeout diverso da zero:: per un socket di blocco, chiudere i blocchi di blocco fino a quando non vengono inviati tutti i dati o il timeout scade.

    - Per un socket non sbloccante, closesocket restituisce immediatamente un errore.

Per altre informazioni, vedere Arresto di grazia, opzioni linger e chiusura socket per altre informazioni.

Nota Quando si emette una chiamata Winsock bloccante, ad esempio closesocket, Winsock potrebbe dover attendere un evento di rete prima che la chiamata possa completare. Winsock esegue un'attesa avvisabile in questa situazione, che può essere interrotta da una chiamata di routine asincrona pianificata nello stesso thread. L'emissione di un'altra chiamata winsock bloccata all'interno di un APC che ha interrotto una chiamata winsock in corso sullo stesso thread comporterà un comportamento non definito e non deve mai essere tentato 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 di linger standard.
  • Anche se IrDA non fornisce una chiusura graziata, IrDA rinvierà la chiusura fino a quando non vengono eliminate le code di ricezione. Pertanto, un'applicazione può inviare dati e chiamare immediatamente la funzione socket e assicurarsi che il ricevitore copia i dati prima di ricevere un messaggio di FD_CLOSE.

Note per ATM

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

  • L'uso delle funzioni closesocket o di arresto 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, è possibile che un segnale RELEASE possa raggiungere la fine remota prima dell'ultimo raggiungimento dell'ultima destinazione dei dati, 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 arresto per un socket ATM.
  • La metà di chiusura non è supportata da ATM.
  • Entrambe le disconnessioni interrotte e grazia 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 di grazia, opzioni di linger e chiusura socket .

Windows Phone 8: questa funzione è supportata per le app Windows Phone Store 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 winsock2.h (include Winsock2.h)
Libreria Ws2_32.lib
DLL Ws2_32.dll

Vedi anche

Arresto tolleranza, opzioni di linger e chiusura socket

WSAAsyncSelect

WSADuplicateSocket

WSAOVERLAPPED

Funzioni Winsock

Informazioni di riferimento su Winsock

Accettare

getsockopt

ioctlsocket

Indugiare

Setsockopt

Socket