Condividi tramite


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 un codice di errore specifico può essere recuperato chiamando WSAGetLastError.

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

Commenti

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

Tutte le operazioni di invio e ricezione in sospeso (WSASendWSASendTo/ / WSARecv/ WSARecvFrom con un socket sovrapposto) rilasciate da qualsiasi thread in questo processo vengono annullate. Qualsiasi evento, routine di completamento o azione della porta di completamento specificata per queste operazioni sovrapposte viene eseguita. 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 in un socket vengano completate quando si chiude il set di operazioni. La funzione closesocket avvierà l'annullamento delle operazioni di I/O in sospeso, ma ciò non significa che un'applicazione riceverà il completamento di 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 fa riferimento le richieste di I/O in sospeso fino al completamento delle richieste di I/O.

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

La struttura persistente gestisce 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 l_onoff membro della struttura linger determina se un socket deve rimanere aperto per un periodo di tempo specificato dopo una chiamata di funzione closesocket per abilitare l'invio dei dati in coda. Questo membro può essere modificato in due modi:

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

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

I parametri predefiniti per un socket sono il l_onoff membro della struttura di linger è zero, indicando che il socket non deve rimanere aperto. Il valore predefinito per il membro l_lingerdella 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 impostare solo il membro l_onoff della struttura persistente su zero.

Se un'applicazione chiama la funzione setockopt 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 è specificato. In questo caso, il timeout usato dipende dall'implementazione. Se è stato stabilito un timeout precedente per un socket (chiamando in precedenza la funzione setockopt con il parametro optname impostato su SO_LINGER), questo valore di timeout deve essere ripristinato dal provider di servizi.

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

l_onoff l_linger Tipo di chiusura Attendere la chiusura?
zero Non importa Chiusura graziata No
non zero zero Difficile No
non zero non zero Grazia se tutti i dati vengono inviati all'interno del valore di timeout specificato nel membro l_linger .

Impossibile inviare tutti i dati all'interno del valore di timeout specificato nel membro l_linger .

 

Se il l_onoff membro della struttura LINGER è zero in 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. Questo è anche chiamato disconnessione o chiusura grazia. In questo caso, il provider Windows Sockets non può rilasciare il socket e altre risorse per un periodo arbitrario, in modo da influire sulle applicazioni che si prevede di usare tutti i socket disponibili. Si tratta del comportamento predefinito per un socket.

Se il membro l_onoffdella struttura persistente è 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 dura 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_onoffdella struttura persistente è impostato su non zero e l_linger membro è impostato su un timeout diverso da zero su un socket di blocco, la chiamata closesocket non viene inviata o fino alla scadenza del timeout rimanente. Viene chiamato disconnessione o chiusura grazia 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 venga restituita e questa operazione viene chiamata chiusura dura o interrotta.

L'impostazione del membro l_onoffdella struttura persistente su non zero e il membro l_linger con intervallo di timeout diverso da zero su un socket non sbloccante non è consigliabile. In questo caso, la chiamata a closesocket avrà esito negativo con un errore di 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_onoffdella 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 blocca solo finché tutti i dati non vengono recapitati al peer o il timeout scade. Se la connessione viene reimpostata perché il timeout scade, il socket non verrà inserito nello 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_onoffdella struttura persistente è diverso da zero e il membro l_linger è un intervallo di timeout zero su un socket di blocco, verrà reimpostata una chiamata per chiudere la connessione. Il socket non passa 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 di linger 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 di grazia, opzioni di attesa e chiusura socket per altre informazioni). Si noti anche che un evento di rete FD_CLOSE non viene pubblicato dopo aver chiamato closesocket .
 

Ecco un riepilogo del comportamento closesocket :

  • Se il l_onoff membro della struttura LINGER è zero (l'impostazione predefinita per un socket), closesocket restituisce immediatamente e la connessione viene chiusa in modo normale 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

Requisito Valore
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 tolleranza, opzioni di linger e chiusura socket

WSAAsyncSelect

WSADuplicateSocket

WSAOVERLAPPED

Funzioni Winsock

Informazioni di riferimento su Winsock

Accettare

getsockopt

ioctlsocket

Indugiare

Setsockopt

socket