LPFN_DISCONNECTEX funzione di callback (mswsock.h)

La funzione DisconnectEx chiude una connessione su un socket e consente di riutilizzare l'handle del socket.

Nota

Questa funzione è un'estensione specifica di Microsoft per la specifica Windows Sockets.

Sintassi

LPFN_DISCONNECTEX LpfnDisconnectex;

BOOL LpfnDisconnectex(
  SOCKET s,
  LPOVERLAPPED lpOverlapped,
  DWORD dwFlags,
  DWORD dwReserved
)
{...}

Parametri

s

Handle a un socket connesso e orientato alla connessione.

lpOverlapped

Puntatore a una struttura OVERLAPPED . Se l'handle socket è stato aperto come sovrapposto, specificando questo parametro viene generato un'operazione di I/O sovrapposta (asincrona).

dwFlags

Set di flag che personalizza l'elaborazione della chiamata alla funzione. Quando questo parametro è impostato su zero, non vengono impostati flag. Il parametro dwFlags può avere il valore seguente.

Contrassegno Significato
TF_REUSE_SOCKET Prepara l'handle socket da riutilizzare. Al termine della richiesta DisconnectEx , l'handle del socket può essere passato alla funzione AcceptEx o ConnectEx .
Nota: La disconnessione a livello di socket è soggetta al comportamento del trasporto sottostante. Ad esempio, un socket TCP può essere soggetto allo stato tcp TIME_WAIT, causando il ritardo della chiamata DisconnectEx .

dwReserved

Riservato. Deve essere zero. Se non viene restituito alcun valore zero, viene restituito WSAEINVAL .

Valore restituito

In caso di esito positivo, la funzione DisconnectEx restituisce TRUE. In caso di errore, la funzione restituisce FALSE. Usare la funzione WSAGetLastError per ottenere informazioni di errore estese. Se una chiamata alla funzione WSAGetLastError restituisce ERROR_IO_PENDING, l'operazione è stata avviata correttamente ed è in corso. In tali circostanze, la chiamata potrebbe comunque non riuscire al termine dell'operazione.

Codice di errore Descrizione
WSAEFAULT Il sistema ha rilevato un indirizzo puntatore non valido nel tentativo di usare un argomento puntatore. Questo errore viene restituito se un valore del puntatore non valido è stato passato nel parametro lpOverlapped .
WSAEINVAL Il parametro non valido è stato passato. Questo errore viene restituito se il parametro dwFlags è stato specificato con un valore zero diverso da TF_REUSE_SOCKET.
WSAENOTCONN Il socket non è connesso. Questo errore viene restituito se il parametro del socket non era in uno stato connesso. Questo errore può essere restituito anche se il socket era nello stato di chiusura della trasmissione da una richiesta precedente e il parametro dwFlags non è stato impostato su TF_REUSE_SOCKET per richiedere un riutilizzo del socket.

Commenti

La funzione DisconnectEx non supporta i socket di datagram. Pertanto, il socket specificato da hSocket deve essere orientato alla connessione, ad esempio un SOCK_STREAM, SOCK_SEQPACKET o SOCK_RDM socket.

Nota

Il puntatore della funzione per la funzione DisconnectEx deve essere ottenuto in fase di esecuzione eseguendo una chiamata alla funzione WSAIoctl con il codice opcode SIO_GET_EXTENSION_FUNCTION_POINTER specificato. Il buffer di input passato alla funzione WSAIoctl deve contenere WSAID_DISCONNECTEX, un identificatore univoco globale (GUID) il cui valore identifica la funzione di estensione DisconnectEx . In caso di esito positivo, l'output restituito dalla funzione WSAIoctl contiene un puntatore alla funzione DisconnectEx . Il GUID WSAID_DISCONNECTEX è definito nel file di intestazione Mswsock.h .

Quando lpOverlapped non è NULL, l'I/O sovrapposto potrebbe non terminare prima che DisconnectEx restituisca la funzione DisconnectEx, che restituisce FALSE e una chiamata alla funzione WSAGetLastError che restituisce ERROR_IO_PENDING. Questa progettazione consente al chiamante di continuare l'elaborazione durante il completamento dell'operazione di disconnessione. Al termine della richiesta, Windows imposta l'evento specificato dal membro hEvent della struttura OVERLAPPED o il socket specificato da hSocket allo stato segnalato.

Nota

Tutti gli I/O avviati da un determinato thread vengono annullati quando il thread viene chiuso. Per i socket sovrapposti, le operazioni asincrone in sospeso possono non riuscire se il thread viene chiuso prima del completamento delle operazioni. Per altre informazioni, vedere ExitThread .

Lo stato TIME_WAIT determina il tempo necessario prima che TCP possa rilasciare una connessione chiusa e riutilizzarne le risorse. Questo intervallo tra chiusura e rilascio è noto come stato TIME_WAIT o 2MSL. Durante questo periodo, la connessione può essere riaperta a costi molto inferiori al client e al server rispetto alla creazione di una nuova connessione. Il comportamento TIME_WAIT viene specificato in RFC 793 che richiede che TCP mantiene una connessione chiusa per un intervallo almeno uguale a due volte la durata massima del segmento (MSL) della rete. Quando viene rilasciata una connessione, è possibile usare la coppia di socket e le risorse interne usate per il socket per supportare un'altra connessione.

Windows TCP ripristina lo stato di TIME_WAIT successiva alla chiusura di una connessione. Mentre nello stato TIME_WAIT, non è possibile usare nuovamente una coppia di socket. Il periodo di TIME_WAIT è configurabile modificando l'impostazione del Registro di sistema DWORD seguente che rappresenta il periodo di TIME_WAIT in secondi.

HKEY_LOCAL_MACHINE\Sistema\Currentcontrolset\Servizi\TCPIP\Parametri\TcpTimedWaitDelay

Per impostazione predefinita, msl è definito come 120 secondi. L'impostazione predefinita del Registro di sistema TcpTimedWaitDelay viene impostata su un valore pari a 240 secondi, che rappresenta 2 volte la durata massima del segmento di 120 secondi o 4 minuti. È tuttavia possibile usare questa voce per personalizzare l'intervallo. La riduzione del valore di questa voce consente a TCP di rilasciare connessioni chiuse più velocemente, fornendo più risorse per le nuove connessioni. Tuttavia, se il valore è troppo basso, TCP potrebbe rilasciare le risorse di connessione prima del completamento della connessione, richiedendo al server di usare risorse aggiuntive per stabilire nuovamente la connessione. Questa impostazione del Registro di sistema può essere impostata da 0 a 300 secondi.

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
Intestazione mswsock.h