opzione socket SO_CONDITIONAL_ACCEPT

L'opzione socket SO_CONDITIONAL_ACCEPT è progettata per consentire a un'applicazione di decidere se accettare o meno una connessione in ingresso su un socket di ascolto.

Valore dell'opzione socket

La costante che rappresenta questa opzione socket è 0x3002.

Sintassi

int setsockopt(
  (SOCKET) s,      // descriptor identifying a socket 
  (int) SOL_SOCKET,   // level
  (int) SO_CONDITIONAL_ACCEPT, // optname
  (char *) optval,         // input buffer,
  (int) optlen,       // size of input buffer
);

Parametri

s [in]

Descrittore che identifica il socket.

level [in]

Livello in cui è definita l'opzione. Usare SOL_SOCKET per questa operazione.

optname [in]

Opzione socket per cui deve essere impostato il valore. Usare SO_CONDITIONAL_ACCEPT per questa operazione.

optval [out]

Puntatore al buffer contenente il valore per l'opzione da impostare. Questo parametro deve puntare al buffer uguale o maggiore della dimensione di un valore DWORD .

Questo valore viene considerato come un valore booleano con 0 usato per indicare FALSE (disabilitato) e un valore diverso da zero per indicare TRUE (abilitato).

optlen [in, out]

Puntatore alle dimensioni, in byte, del buffer optval . Questa dimensione deve essere uguale o maggiore della dimensione di un valore DWORD .

Valore restituito

Se l'operazione viene completata correttamente, setsockopt restituisce zero.

Se l'operazione non riesce, 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.
WSAEFAULT
Uno dei parametri optval o optlen punta alla memoria che non si trova in una parte valida dello spazio indirizzi utente. Questo errore viene restituito anche se il valore a cui punta il parametro optlen è minore della dimensione di un valore DWORD .
WSAEINPROGRESS
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure il provider di servizi sta ancora elaborando una funzione di callback.
WSAEINVAL
Il parametro level è sconosciuto o non valido. Questo errore viene restituito anche se il socket era già in uno stato di ascolto.
WSAENOPROTOOPT
L'opzione è sconosciuta o non supportata dalla famiglia di protocolli indicata.
WSAENOTSOCK
Il descrittore non è un socket.

 

Commenti

La funzione setsockopt chiamata con l'opzione socket SO_CONDITIONAL_ACCEPT consente a un'applicazione di decidere se accettare o meno una connessione in ingresso su un socket di ascolto. L'opzione di accettazione condizionale per un socket è disabilitata (impostata su FALSE) per impostazione predefinita.

Quando questa opzione socket è abilitata, lo stack TCP non accetta automaticamente le connessioni. Attende che l'applicazione indichi che accetta la connessione tramite il callback di accettazione condizionale registrato con la funzione WSAAccept . Una volta ricevuta una richiesta di connessione, Winsock richiama il callback di accettazione condizionale registrato dall'applicazione. Solo quando il callback dell'accettazione condizionale restituisce CF_ACCEPT winsock notifica al trasporto di accettare completamente la connessione.

Quando l'opzione socket SO_CONDITIONAL_ACCEPT è impostata su abilitata (impostata su TRUE), questo ha diversi effetti collaterali sul socket:

  • In questo modo si disabilitano le difese di protezione degli attacchi SYN predefinite dello stack TCP, poiché l'applicazione assume ora la proprietà dell'accettazione delle connessioni.
  • In questo modo il backlog di ascolto viene disabilitato perché le connessioni non vengono accettate per conto di un socket di ascolto. Una connessione non viene mai accettata completamente finché l'applicazione non accetta completamente l'uso del meccanismo di CF_ACCEPT .
  • Ciò significa anche che l'applicazione deve essere sempre in uno stato per gestire facilmente i callback di accettazione per accettare la connessione. Se l'applicazione è occupata durante l'esecuzione di altre elaborazioni, il lato client potrebbe verificarsi un timeout prima che l'applicazione accetti effettivamente la connessione. Questo porta a un'esperienza client scarsa.

In genere, il motivo principale per cui le applicazioni usano l'accettazione condizionale consiste nell'esaminare l'indirizzo IP o la porta di origine usata dal client di connessione e quindi decidere di accettare o rifiutare la connessione. Tuttavia, è probabile che le applicazioni funzionino meglio se l'opzione SO_CONDITIONAL_ACCEPT non è abilitata e l'applicazione consente allo stack TCP e al backlog di ascolto di funzionare come previsto. Quindi, quando l'applicazione gestisce la connessione accettata, se proviene da un indirizzo IP o da una porta non corretta, l'applicazione può semplicemente chiudere il socket. Lo svantaggio di sicurezza di questo comportamento è che ora il client ha la conferma che l'applicazione è in ascolto su un indirizzo IP e una porta perché ha chiuso forzatamente la connessione accettata in precedenza. Tuttavia, gli svantaggi per abilitare SO_CONDITIONAL_ACCEPT in genere superano questa limitazione.

La funzione getsockopt chiamata con l'opzione socket SO_CONDITIONAL_ACCEPT consente a un'applicazione di recuperare lo stato corrente dell'opzione di accettazione condizionale, anche se questa funzionalità non viene usata normalmente. Se un'applicazione deve abilitare l'accettazione condizionale in un socket, chiama solo la funzione setsockopt per abilitare l'opzione.

Si noti che il file di intestazione Ws2def.h viene automaticamente incluso in Winsock2.h e non deve mai essere usato direttamente.

Requisiti

Requisito Valore
Client minimo supportato
Windows Vista [solo app desktop]
Server minimo supportato
Windows Server 2008 [solo app desktop]
Intestazione
Ws2def.h (include Winsock2.h)

Vedi anche

getsockopt

Setsockopt

WSAAccept