Accettazione delle richieste di connessione
Se un'applicazione chiama la funzione WSAAccept, accetta o AcceptEx per accettare una richiesta di connessione in ingresso in un socket, windows Sockets passa sempre questa chiamata al provider di servizi TCP/IP. Se una richiesta di connessione in ingresso arriva da una rete non SAN, scorre il percorso NDIS e il provider di servizi TCP/IP lo gestisce. Se una richiesta di connessione arriva da un peer remoto su una SAN, l'opzione funge da intermediario tra il provider di servizi TCP/IP e il provider di servizi SAN per determinare se accettare la richiesta di connessione e completare la funzione WSAAccept dell'applicazione, accettare o AccettaEx .
Nella figura seguente viene illustrata una panoramica dell'interazione tra l'opzione Windows Sockets e il provider di servizi SAN per determinare se accettare o rifiutare una richiesta di connessione in ingresso. Le sequenze e le sezioni che seguono descrivono la determinazione dell'accettazione in modo più dettagliato.
Per accettare o rifiutare una richiesta di connessione
Durante la ricezione di una richiesta di connessione in ingresso da un peer remoto, il provider di servizi SAN segnala un oggetto evento come descritto in Listen for Connections in una SAN.
L'opzione Windows Sockets chiama la funzione WSPEnumNetworkEvents del provider di servizi SAN per ricevere il codice evento FD_ACCEPT.
Durante la ricezione del codice evento FD_ACCEPT, il commutatore chiama la funzione WSPAccept del provider di servizi SAN per accettare o rifiutare la richiesta di connessione in ingresso.
Nella chiamata del commutatore alla funzione WSPAccept del provider di servizi SAN, l'opzione specifica una funzione condizione. Il provider di servizi SAN deve chiamare questa funzione condizione nello stesso thread in cui è stata chiamata la funzione WSPAccept prima di restituire dalla chiamata WSPAccept .
L'opzione restituisce rispettivamente il codice CF_ACCEPT o CF_REJECT da questa funzione condizione per indicare che accetta o rifiuta la richiesta di connessione.
Accettazione di una richiesta di connessione e creazione di un socket di accettazione
Se un'applicazione accetta una richiesta di connessione in ingresso, l'opzione restituisce il codice CF_ACCEPT al provider di servizi SAN per completare la funzione condizione del commutatore. Durante la ricezione di CF_ACCEPT, il provider di servizi SAN inizializza una struttura dati interna in cui archivia informazioni sul socket di accettazione. La funzione WSPAccept del provider di servizi SAN deve chiamare successivamente la funzione WPUCreateSocketHandle per acquisire un descrittore per il socket di accettazione dal commutatore. Il provider di servizi SAN deve archiviare il descrittore del commutatore nella struttura dati interna per il socket di accettazione e deve restituire il proprio descrittore per il socket di accettazione per completare la chiamata WSPAccept . Il commutatore deve fornire il descrittore interno del provider di servizi SAN per il socket di accettazione quando si chiamano le funzioni del provider di servizi SAN, mentre il provider di servizi SAN deve fornire il descrittore del socket del commutatore nelle chiamate al commutatore.
Prima di completare correttamente WSPAccept, il provider di servizi SAN deve chiamare la funzione Win32 ResetEvent per reimpostare l'oggetto evento. In questo modo, il provider di servizi SAN può chiamare in un secondo momento la funzione SetEvent Win32 per segnalare l'opzione per accettare la richiesta di connessione in ingresso successiva.
Rifiuto di una richiesta di connessione
Se un'applicazione rifiuta una richiesta di connessione in ingresso, l'opzione restituisce il codice CF_REJECT al provider di servizi SAN per completare la funzione di condizione del commutatore. Durante la ricezione di CF_REJECT, il provider di servizi SAN deve restituire il codice di errore WSAECONNREFUSED al commutatore per completare la chiamata WSPAccept .
Indica l'accettazione o il rifiuto di una richiesta di connessione a un peer remoto
Prima che un provider di servizi SAN possa indicare a un peer remoto che accetta o rifiuta la richiesta di connessione del peer remoto, il provider di servizi SAN deve chiamare la funzione condizione del commutatore. A seconda del valore restituito dalla funzione di condizione del commutatore, il provider di servizi SAN deve effettuare una delle indicazioni seguenti al peer remoto:
Se la funzione condizione del commutatore restituisce CF_ACCEPT, il provider di servizi SAN deve indicare che accetta la richiesta di connessione del peer remoto. Il provider di servizi SAN nel peer remoto può quindi completare correttamente l'operazione di connessione avviata da una chiamata WSPConnect .
Se la funzione condizione del commutatore restituisce CF_REJECT, il provider di servizi SAN deve indicare che rifiuta la richiesta di connessione del peer remoto. Il provider di servizi SAN nel peer remoto deve non riuscire l'operazione di connessione avviata da una chiamata WSPConnect con il codice di errore WSAECONNREFUSED.
Negoziazione sessione
Dopo aver usato correttamente un provider di servizi SAN per accettare una richiesta di connessione da un peer remoto, l'opzione negozia una sessione con tale peer.
Per negoziare una sessione
L'opzione al peer remoto chiama la funzione WSPRecv del provider di servizi SAN per pubblicare un set di buffer di ricezione.
L'opzione al peer remoto chiama la funzione WSPSend del provider di servizi SAN per inviare un messaggio di negoziazione sessione al commutatore all'endpoint di accettazione locale. Questo messaggio include il numero di buffer di ricezione inviati dal peer remoto.
L'opzione all'endpoint di accettazione locale chiama la funzione WSPRecv del provider di servizi SAN locale per pubblicare i propri buffer di ricezione, ma potrebbe non essere in grado di farlo in tempo per ricevere il messaggio di negoziazione della sessione. Se l'opzione locale non pubblica un buffer di ricezione in tempo e se la scheda di interfaccia di rete sottostante non supporta il controllo del flusso, il provider di servizi SAN nell'endpoint di accettazione locale deve bufferare il messaggio di negoziazione della sessione del commutatore remoto nei propri buffer di ricezione privati. Quando i post di cambio ricevono buffer, il provider di servizi SAN copia i dati dai buffer di ricezione privati ai buffer di commutatore su base uno-a-uno fino a quando tutti i dati non vengono copiati dai buffer privati ai buffer switch.
Il provider di servizi SAN esegue l'elaborazione normale delle operazioni di ricezione nei buffer di commutatori successivi, ovvero tutti questi buffer switch vengono inviati alla coda di ricezione nella scheda di interfaccia di rete.
Si noti che un provider di servizi SAN non deve eliminare una connessione semplicemente perché l'opzione non ha pubblicato un buffer di ricezione prima dell'arrivo del messaggio di negoziazione della sessione. La lunghezza massima di un messaggio di negoziazione della sessione è di 256 byte.
L'opzione all'endpoint di accettazione locale pubblica i buffer di ricezione prima di rispondere al messaggio di negoziazione della sessione. L'opzione locale chiama la funzione WSPSend del provider di servizi SAN locale per rispondere al messaggio di negoziazione della sessione. La risposta del commutatore locale include il numero di buffer di ricezione pubblicati dal commutatore locale. Da questo punto in avanti, l'opzione locale garantisce che il set pubblicato di buffer di ricezione sia di dimensioni sufficienti per ricevere qualsiasi messaggio che arriva sulla connessione.
Se un'applicazione specifica un buffer di ricezione iniziale nella chiamata AcceptEx , l'opzione attende fino a quando non riceve il primo messaggio di dati dal peer remoto prima di completare la chiamata AcceptEx dell'applicazione.
Se l'applicazione annulla la propria chiamata di accettazione , l'opzione chiama la funzione WSPCloseSocket del provider di servizi SAN appropriata per chiudere il socket SAN di accettazione.