Schließen eines SAN-Sockets
Nachdem der Windows Sockets-Switch auf beiden Seiten einer Verbindung die WSPCloseSocket-Funktion eines SAN-Dienstanbieters aufruft, führt der SAN-Dienstanbieter das folgende Verfahren aus, um einen SAN-Socket zu schließen:
Jeder SAN-Dienstanbieter auf beiden Seiten der Verbindung reißt die Verbindung ab und schließt Empfangsanforderungen ab , also WSPRecv-Funktionsaufrufe , indem er den entsprechenden Fehlercode am lpErrno-Parameter zurückgibt. Beispielsweise gibt ein SAN-Dienstanbieter WSAECONNRESET zurück, um anzugeben, dass der Remotepeer die Verbindung zurückgesetzt hat.
Jeder SAN-Dienstanbieter signalisiert außerdem den Abschluss ausstehender überlappender Vorgänge, damit der SAN-Socket geschlossen wird. Der SAN-Dienstanbieter ruft die WPUCompleteOverlappedRequest-Funktion auf, um den Abschluss eines überlappenden Vorgangs zu signalisieren. In diesem Aufruf übergibt der SAN-Dienstanbieter einen Zeiger an die WSAOVERLAPPED-Struktur , die dem überlappenden Vorgang zugeordnet ist. Der SAN-Dienstanbieter übergibt auch den WSA_OPERATION_ABORTED Fehlercode, um anzugeben, dass der überlappende Vorgang abgebrochen wurde, weil der SAN-Socket geschlossen wurde. Bevor der Abschluss eines überlappenden Vorgangs signalisiert wird, sollte der SAN-Dienstanbieter den für den Vorgang erforderlichen Arbeitsspeicher freigeben.
Nachdem der SAN-Dienstanbieter Aufrufe von Funktionen mit dem Präfix "WPU" durchführt, muss der SAN-Dienstanbieter den Switch mithilfe des Handles zum SAN-Socket verwenden, der über einen WPUCreateSocketHandle-Up-Call abgerufen wurde, einen endgültigen Up-Call für den Switch ausführen, indem er die WPUCloseSocketHandle-Funktion aufruft, um den Sockethandle zu schließen. Der SAN-Dienstanbieter bereinigt dann alles, was mit dem SAN-Socket zusammenhängt. Up-Aufrufe sind Funktionsaufrufe aus der Verteilungstabelle für den Up-Call des Switches. Der Switch stellt einen Zeiger auf diese Verteilungstabelle für den Up-Call bereit, wenn er die WSPStartupEx-Funktion des SAN-Dienstanbieters aufruft, um mit der Verwendung des Anbieters zu beginnen.
Solange ein SAN-Dienstanbieter das vorherige Verfahren zum Schließen eines SAN-Sockets ausführt, übernimmt der Switch alles andere.
Um zu verhindern, dass Racebedingungen zwischen einem SAN-Dienstanbieter und dem Switch Socketschließungen initiieren, sollte der SAN-Dienstanbieter niemals Datenstrukturen freigeben, die sich auf einen SAN-Socket beziehen, bis der Switch WSPCloseSocket aufruft.