Delen via


Verbindingsaanvragen accepteren

Als een toepassing de functie WSAAccept, accept, of AcceptEx aanroept om een binnenkomende verbindingsaanvraag op een socket te accepteren, stuurt de Windows Sockets-switch deze aanroep altijd door naar de TCP/IP-serviceprovider. Als een binnenkomende verbindingsaanvraag binnenkomt vanuit een niet-SAN-netwerk, loopt deze via het NDIS-pad en verwerkt de TCP/IP-serviceprovider deze. Als er een verbindingsaanvraag binnenkomt van een externe peer op een SAN, fungeert de switch als intermediair tussen de TCP/IP-serviceprovider en de SAN-serviceprovider om te bepalen of de verbindingsaanvraag zal worden geaccepteerd, en om de functie WSAAccept, accept, of AcceptEx van de applicatie te voltooien.

In de volgende afbeelding ziet u een overzicht van de interactie tussen de Windows Sockets-switch en de SAN-serviceprovider bij het bepalen of een binnenkomende verbindingsaanvraag moet worden geaccepteerd of geweigerd. De reeksen en secties die volgen beschrijven acceptatiebepaling in meer detail.

diagram waarin de interactie tussen de Windows Sockets-switch en de SAN-serviceprovider wordt weergegeven wanneer een verbindingsaanvraag binnenkomt.

Een verbindingsaanvraag accepteren of weigeren

  1. Bij het ontvangen van een binnenkomende verbindingsaanvraag van een externe peer geeft de SAN-serviceprovider een gebeurtenisobject aan, zoals beschreven in Luisteren naar verbindingen op een SAN-.

  2. De Windows Sockets-switch roept de WSPEnumNetworkEvents-functie van de SAN-serviceprovider aan om de FD_ACCEPT gebeurteniscode te ontvangen.

  3. Bij ontvangst van de FD_ACCEPT evenementcode roept de switch de WSPAccept functie van de SAN-serviceprovider aan om de binnenkomende verbindingsaanvraag te accepteren of te weigeren.

  4. In de aanroep van de switch naar de WSPAccept-functie van de SAN-serviceprovider, geeft de switch een voorwaardefunctie op. De SAN-serviceprovider moet deze voorwaardefunctie aanroepen in dezelfde thread waarin de WSPAccept-functie is aangeroepen, voordat van de WSPAccept-aanroep wordt teruggekeerd.

  5. De schakeloptie retourneert de CF_ACCEPT of CF_REJECT code van deze voorwaardefunctie om aan te geven dat deze respectievelijk de verbindingsaanvraag accepteert of weigert.

Een verbindingsaanvraag accepteren en een accepting socket maken

Als een toepassing een binnenkomende verbindingsaanvraag accepteert, retourneert de switch de CF_ACCEPT code naar de SAN-serviceprovider om de voorwaardefunctie van de switch te voltooien. Bij ontvangst van CF_ACCEPT initialiseert de SAN-serviceprovider een interne gegevensstructuur waarin informatie over de accepterende socket wordt opgeslagen. De functie WSPAccept van de SAN-serviceprovider moet vervolgens de functie WPUCreateSocketHandle aanroepen om een descriptor te verkrijgen voor de accepterende socket van de switch. De SAN-serviceprovider moet de descriptor van de switch opslaan in de interne gegevensstructuur voor de accepterende socket en moet een eigen descriptor retourneren voor de accepterende socket om de WSPAccept aanroep te voltooien. De switch moet de interne descriptor van de SAN-serviceprovider leveren voor de socket die accepteert bij het aanroepen van de functies van de SAN-serviceprovider, terwijl de SAN-serviceprovider de socketdescriptor van de switch moet leveren in oproepen naar de switch.

Voordat de WSPAcceptsuccesvol is voltooid, moet de SAN-serviceprovider de Win32-functie ResetEvent aanroepen om het gebeurtenisobject opnieuw in te stellen. Hierdoor kan de SAN-serviceprovider later de functie Win32 SetEvent- aanroepen om de switch aan te geven om de volgende binnenkomende verbindingsaanvraag te accepteren.

Een verbindingsaanvraag weigeren

Als een toepassing een binnenkomende verbindingsaanvraag weigert, retourneert de switch de CF_REJECT code naar de SAN-serviceprovider om de voorwaardefunctie van de switch te voltooien. Bij ontvangst van CF_REJECT moet de SAN-serviceprovider de WSAECONNREFUSED-foutcode retourneren naar de switch om de WSPAccept- aanroep te voltooien.

Acceptatie of weigering van een verbindingsaanvraag aan een externe peer aangeven

Voordat een SAN-serviceprovider kan aangeven dat een externe peer de verbindingsaanvraag van de externe peer accepteert of weigert, moet de SAN-serviceprovider de voorwaardefunctie van de switch aanroepen. Afhankelijk van de waarde die de voorwaardefunctie van de switch retourneert, moet de SAN-serviceprovider een van de volgende aanwijzingen maken voor de externe peer:

Als de voorwaardefunctie van de switch CF_ACCEPT retourneert, moet de SAN-serviceprovider aangeven dat deze de verbindingsaanvraag van de externe peer accepteert. De SAN-serviceprovider op de externe peer kan vervolgens de verbindingsbewerking voltooien die is gestart door een WSPConnect aanroep.

Als de voorwaardefunctie van de switch CF_REJECT retourneert, moet de SAN-serviceprovider aangeven dat deze de verbindingsaanvraag van de externe peer weigert. De SAN-serviceprovider op de externe peer moet de verbindingsbewerking mislukken die is geïnitieerd door een WSPConnect aanroep met de WSAECONNREFUSED-foutcode.

Sessieonderhandeling

Nadat de switch een SAN-serviceprovider heeft gebruikt om een verbindingsaanvraag van een externe peer te accepteren, onderhandelt de switch over een sessie met die peer.

Onderhandelen over een sessie

  1. De switch op de externe peer roept de WSPRecv--functie van de SAN-serviceprovider aan om een set ontvangstbuffers te plaatsen.

  2. De switch op de externe peer roept de WSPSend--functie van de SAN-serviceprovider aan om een sessieonderhandelingsbericht te verzenden naar de switch op het lokale accepterende eindpunt. Dit bericht bevat het aantal ontvangstbuffers dat de switch op de externe peer heeft geplaatst.

  3. De schakeloptie op het lokale accepterende eindpunt roept de WSPRecv--functie van de lokale SAN-serviceprovider aan om een eigen ontvangstbuffer te plaatsen, maar dit kan mogelijk niet op tijd om het bericht over de sessieonderhandeling te ontvangen. Als de lokale switch geen ontvangstbuffer op tijd plaatst en de onderliggende NIC geen ondersteuning biedt voor stroombeheer, moet de SAN-serviceprovider op het lokale accepterende eindpunt de sessieonderhandelingsbericht van de externe switch in een eigen privé-ontvangstbuffer buffer bufferen. Wanneer de switch-posts buffers ontvangen, kopieert de SAN-serviceprovider gegevens van de privé-ontvangstbuffers op een-op-een basis naar de switchbuffers, totdat alle gegevens van de privébuffers naar de switchbuffers zijn gekopieerd.

    De SAN-serviceprovider voert normale ontvangstverwerking uit op volgende switchbuffers, dat wil gezegd, het plaatst al deze switchbuffers op de ontvangstwachtrij op de NIC.

    Houd er rekening mee dat een SAN-serviceprovider geen verbinding mag verwijderen omdat de switch geen ontvangstbuffer heeft geplaatst voordat het sessieonderhandelingsbericht werd ontvangen. De maximale lengte van een sessieonderhandelingsbericht is 256 bytes.

  4. De switch op het lokale accepterende eindpunt plaatst de ontvangstbuffers voordat deze reageert op het sessieonderhandelingsbericht. De lokale switch roept de WSPSend--functie van de lokale SAN-serviceprovider aan om te reageren op het bericht over sessieonderhandeling. Het antwoord van de lokale switch bevat het aantal ontvangstbuffers dat de lokale switch heeft geplaatst. Vanaf dit moment garandeert de lokale switch dat de geplaatste set ontvangstbuffers voldoende groot is om elk bericht te ontvangen dat op de verbinding aankomt.

  5. Als een toepassing een eerste ontvangstbuffer opgeeft in de AcceptEx-aanroep, wacht de switch totdat het eerste gegevensbericht van de externe peer wordt ontvangen voordat de AcceptEx--aanroep van de toepassing wordt voltooid.

  6. Als de toepassing een eigen accepteert aanroep, roept de switch de WSPCloseSocket--functie van de juiste SAN-serviceprovider aan om de accepterende SAN-socket te sluiten.