Freigeben über


Initiieren einer Verbindung

Nachdem der Windows Sockets-Switch einen WSPConnect-Aufruf empfängt, der von einer Anwendung initiiert wurde, vergleicht der Switch die Zieladresse der Verbindungsanforderung mit Den Adressen in der Tabelle der IP-Subnetze des Switches, die SAN-Dienstanbieter bereitstellen. Wenn eines dieser Subnetze diese Zieladresse enthält, ruft der Switch die WSPSocket - und WSPBind-Funktionen des entsprechenden SAN-Dienstanbieters auf, um einen Socket zu erstellen und zu binden, wie unter Erstellen und Binden von SAN-Sockets beschrieben. Der Switch verarbeitet die Verbindungsanforderung der Anwendung mithilfe des SAN-Sockets. Wenn sich die Zieladresse der Verbindungsanforderung nicht in einem SAN-Subnetz befindet oder wenn der SAN-Dienstanbieter keinen Socket erstellen und binden kann, verwendet der Switch den TCP/IP-Anbieter, um die Verbindung herzustellen.

Die folgende Abbildung zeigt eine Übersicht darüber, wie der Windows Sockets-Switch eine Verbindung mit einem Remotepeer anfordert. In den folgenden Sequenzen und Abschnitten wird die Verbindungsanforderung ausführlicher beschrieben.

Diagramm: Prozess des Windows Sockets-Switches, der eine Verbindung mit einem Remotepeer anfordert.

Nach dem Erstellen und Binden des SAN-Sockets führt der Switch eine Verbindungsanforderung unter Verwendung des SAN-Sockets im Nichtblockierungsmodus aus, wie im folgenden Verfahren beschrieben.

So führen Sie eine Verbindungsanforderung aus

  1. Der Switch ruft die WSPEventSelect-Funktion des SAN-Dienstanbieters auf. In diesem Aufruf übergibt der Switch den FD_CONNECT Code und das Ereignisobjekt, das diesem Code zugeordnet werden soll. Der Aufruf von WSPEventSelect fordert eine Benachrichtigung über Verbindungsereignisse an und informiert den SAN-Dienstanbieter darüber, dass jeder nachfolgende WSPConnect-Aufruf im Nichtblockierungsmodus ausgeführt wird.

  2. Nachdem die WSPEventSelect-Funktion zurückgegeben wurde, ruft der Switch die WSPConnect-Funktion des SAN-Dienstanbieters auf. In diesem Aufruf übergibt der Switch die Zieladresse im Format einer der WSK-Adressfamilien. Der Proxytreiber des SAN-Dienstanbieters ordnet diese Zieladresse einer nativen Adresse zu und versucht, die Verbindung herzustellen.

  3. Wenn die WSPConnect-Funktion des SAN-Dienstanbieters den Verbindungsvorgang sofort abschließen oder fehlschlagen kann, gibt sie den entsprechenden Erfolgs- oder Fehlercode zurück. Wenn die WSPConnect-Funktion des SAN-Dienstanbieters eine Verbindungsanforderung nicht sofort abschließen kann, wird der Verbindungsvorgang des SAN-Dienstanbieters in einem anderen Thread asynchron fortgesetzt. Die WSPConnect-Funktion des SAN-Dienstanbieters gibt mit dem Fehler WSAEWOULDBLOCK zurück, um anzugeben, dass der Socket als nicht blockiert markiert ist und dass der Verbindungsvorgang nicht sofort abgeschlossen werden kann.

  4. Nach Abschluss des Verbindungsvorgangs ruft der SAN-Dienstanbieter die Win32 SetEvent-Funktion auf, um das Ereignisobjekt zu signalisieren, das zuvor im WSPEventSelect-Aufruf registriert wurde.

  5. Nachdem das Ereignisobjekt signalisiert wurde, ruft der Switch die WSPEnumNetworkEvents-Funktion des SAN-Dienstanbieters auf, um das Ergebnis des Verbindungsvorgangs abzurufen.

Hinweis Nachdem der Switch eine Verbindung über einen SAN-Dienstanbieter hergestellt hat, kann der Switch den TCP/IP-Anbieter nicht mehr für diese Verbindung verwenden. SAN-Dienstanbieter müssen alle Funktionen vollständig implementieren, die zum Service einer eingerichteten Verbindung erforderlich sind.

Zerstören des SAN-Sockets

Wenn die WSPConnect-Funktion des SAN-Dienstanbieters fehlschlägt, ruft der Switch die WSPCloseSocket-Funktion des SAN-Dienstanbieters auf, um den SAN-Socket zu zerstören. Der Switch ruft dann die WSPConnect-Funktion des TCP/IP-Dienstanbieters auf, um den Verbindungsvorgang an den TCP/IP-Dienstanbieter weiterzuleiten, es sei denn, der SAN-Dienstanbieter hat als Ergebnis seines Verbindungsvorgangs einen der folgenden Fehlercodes zurückgegeben:

WSAECONNRESET
Gibt an, dass keine Anwendung am angegebenen Port an der Zieladresse lauscht.

WSAECONNREFUSED
Gibt an, dass die Remoteanwendung die Verbindungsanforderung aktiv abgelehnt hat.

WSAEHOSTUNREACH
Gibt an, dass die Zieladresse nicht vorhanden ist.

Diese vorherigen Fehlercodes garantieren, dass auch ein Versuch, die Verbindung über TCP/IP herzustellen, fehlschlägt. Ein SAN-Dienstanbieter darf keinen dieser Fehlercodes zurückgeben, wenn er diese Garantie nicht übernehmen kann. Wenn beispielsweise ein Zielcomputer, der Windows Sockets Direct nicht unterstützt, im SAN vorhanden ist, aber nur über NDIS kommunizieren kann, kann der SAN-Dienstanbieter WSAEHOSTUNREACH nicht als Ergebnis einer fehlgeschlagenen SAN-Verbindungsanforderung an dieses Ziel zurückgeben, da eine Verbindungsanforderung über den TCP/IP-Anbieter möglicherweise erfolgreich ist. In diesem Fall sollte der SAN-Dienstanbieter WSAETIMEDOUT zurückgeben.

Sitzungsverhandlung

Nachdem der Switch eine Verbindung über einen SAN-Dienstanbieter hergestellt hat, ruft der Switch die WSPRegisterMemory-Erweiterungsfunktion des SAN-Dienstanbieters auf, um den Arbeitsspeicher für das Pufferarray vorzuregistrieren, das eingehende Nachrichten empfangen soll. Der Nächste Switch ruft die WSPRecv-Funktion des SAN-Dienstanbieters auf, um einen oder mehrere Puffer zu posten, um eingehende Nachrichtendaten vom Remotepeer zu empfangen. Der Switch verhandelt dann eine Sitzung mit dem Remotepeer, indem ein Nachrichtenpaar ausgetauscht wird, das anfängliche Flusssteuerungsinformationen enthält. Nachdem der Switch eine Sitzung ausgehandelt hat, schließt er den WSPConnect-Aufruf ab, den die Anwendung initiiert hat. Die Anwendung kann dann mit dem Senden und Empfangen von Daten über die Verbindung beginnen. Weitere Informationen finden Sie unter Akzeptieren von Verbindungsanforderungen.

Nachdem eine Verbindung über einen SAN-Socket hergestellt wurde, ruft der Switch die WSPConnect-Funktion des SAN-Dienstanbieters nicht auf. Der Switch verarbeitet intern Anwendungen, die einen Aufruf der WSPConnect-Funktion des Switches initiieren, um Verbindungsanforderungen abzufragen.