Partager via


Acceptation des demandes de connexion

Si une application appelle la fonction WSAAccept, accept ou AcceptEx pour accepter une demande de connexion entrante sur un socket, le commutateur Windows Sockets transfère toujours cet appel au fournisseur de services TCP/IP. Si une demande de connexion entrante arrive d’un réseau non SAN, elle transite par le chemin NDIS et le fournisseur de services TCP/IP la gère. Si une demande de connexion arrive d’un homologue distant sur un SAN, le commutateur agit en tant qu’intermédiaire entre le fournisseur de services TCP/IP et le fournisseur de services SAN pour déterminer s’il faut accepter la demande de connexion et pour terminer la fonction WSAAccept, accept ou AcceptEx de l’application.

La figure suivante montre une vue d’ensemble de l’interaction entre le commutateur Sockets Windows et le fournisseur de services SAN pour déterminer s’il faut accepter ou rejeter une demande de connexion entrante. Les séquences et sections qui suivent décrivent plus en détail la détermination de l’acceptation.

Diagramme montrant l’interaction entre le commutateur de sockets Windows et le fournisseur de services SAN lorsqu’une demande de connexion arrive.

Pour accepter ou rejeter une demande de connexion

  1. Lors de la réception d’une demande de connexion entrante d’un homologue distant, le fournisseur de services SAN signale un objet d’événement, comme décrit dans Écoute des connexions sur un SAN.

  2. Le commutateur Windows Sockets appelle la fonction WSPEnumNetworkEvents du fournisseur de services SAN pour recevoir le code d’événement FD_ACCEPT.

  3. À la réception du code d’événement FD_ACCEPT, le commutateur appelle la fonction WSPAccept du fournisseur de services SAN pour accepter ou rejeter la demande de connexion entrante.

  4. Dans l’appel du commutateur à la fonction WSPAccept du fournisseur de services SAN, le commutateur spécifie une fonction de condition. Le fournisseur de services SAN doit appeler cette fonction de condition dans le thread dans lequel la fonction WSPAccept a été appelée avant de retourner à partir de l’appel WSPAccept .

  5. Le commutateur retourne le code CF_ACCEPT ou CF_REJECT de cette fonction de condition pour indiquer qu’il accepte ou rejette la demande de connexion, respectivement.

Acceptation d’une demande de connexion et création d’un socket d’acceptation

Si une application accepte une demande de connexion entrante, le commutateur retourne le code CF_ACCEPT au fournisseur de services SAN pour effectuer la fonction d’état du commutateur. Lors de la réception de CF_ACCEPT, le fournisseur de services SAN initialise une structure de données interne dans laquelle il stocke des informations sur le socket d’acceptation. La fonction WSPAccept du fournisseur de services SAN doit ensuite appeler la fonction WPUCreateSocketHandle pour acquérir un descripteur pour le socket d’acceptation à partir du commutateur. Le fournisseur de services SAN doit stocker le descripteur du commutateur dans sa structure de données interne pour le socket d’acceptation et doit retourner son propre descripteur pour que le socket d’acceptation termine l’appel WSPAccept . Le commutateur doit fournir le descripteur interne du fournisseur de services SAN pour le socket d’acceptation lors de l’appel des fonctions du fournisseur de services SAN, tandis que le fournisseur de services SAN doit fournir le descripteur de socket du commutateur dans les appels précédents au commutateur.

Avant de terminer WSPAccept, le fournisseur de services SAN doit appeler la fonction Win32 ResetEvent pour réinitialiser l’objet d’événement. Cela permet au fournisseur de services SAN d’appeler ultérieurement la fonction Win32 SetEvent pour signaler au commutateur d’accepter la prochaine demande de connexion entrante.

Rejet d’une demande de connexion

Si une application rejette une demande de connexion entrante, le commutateur retourne le code CF_REJECT au fournisseur de services SAN pour effectuer la fonction de condition du commutateur. À la réception de CF_REJECT, le fournisseur de services SAN doit retourner le code d’erreur WSAECONNREFUSED au commutateur pour terminer l’appel WSPAccept .

Indication de l’acceptation ou du refus d’une demande de connexion à un homologue distant

Avant qu’un fournisseur de services SAN puisse indiquer à un homologue distant qu’il accepte ou refuse la demande de connexion de l’homologue distant, le fournisseur de services SAN doit appeler la fonction de condition du commutateur. En fonction de la valeur retournée par la fonction de condition du commutateur, le fournisseur de services SAN doit fournir l’une des indications suivantes à l’homologue distant :

Si la fonction de condition du commutateur retourne CF_ACCEPT, le fournisseur de services SAN doit indiquer qu’il accepte la demande de connexion de l’homologue distant. Le fournisseur de services SAN sur l’homologue distant peut ensuite terminer son opération de connexion lancée par un appel WSPConnect .

Si la fonction de condition du commutateur retourne CF_REJECT, le fournisseur de services SAN doit indiquer qu’il refuse la demande de connexion de l’homologue distant. Le fournisseur de services SAN sur l’homologue distant doit échouer son opération de connexion initiée par un appel WSPConnect avec le code d’erreur WSAECONNREFUSED.

Négociation de session

Une fois que le commutateur a utilisé un fournisseur de services SAN pour accepter une demande de connexion provenant d’un homologue distant, le commutateur négocie une session avec cet homologue.

Pour négocier une session

  1. Le commutateur de l’homologue distant appelle la fonction WSPRecv du fournisseur de services SAN pour publier un ensemble de mémoires tampons de réception.

  2. Le commutateur de l’homologue distant appelle la fonction WSPSend du fournisseur de services SAN pour envoyer un message de négociation de session au commutateur au niveau du point de terminaison d’acceptation local. Ce message inclut le nombre de mémoires tampons de réception que le commutateur au niveau de l’homologue distant a publié.

  3. Le commutateur au niveau du point de terminaison d’acceptation local appelle la fonction WSPRecv du fournisseur de services SAN local pour publier ses propres mémoires tampons de réception, mais il peut ne pas être en mesure de le faire à temps pour recevoir le message de négociation de session. Si le commutateur local ne publie pas de mémoire tampon de réception dans le temps et si la carte réseau sous-jacente ne prend pas en charge le contrôle de flux, le fournisseur de services SAN au niveau du point de terminaison d’acceptation local doit mettre en mémoire tampon le message de négociation de session du commutateur distant dans ses propres mémoires tampons de réception privées. Lorsque le commutateur publie des mémoires tampons de réception, le fournisseur de services SAN copie les données de ses mémoires tampons de réception privées vers les mémoires tampons de commutateur sur une base un-à-un jusqu’à ce que toutes les données soient copiées des mémoires tampons privées vers les mémoires tampons de commutateur.

    Le fournisseur de services SAN effectue un traitement de réception normal sur les mémoires tampons de commutateur suivantes, c’est-à-dire qu’il publie tous ces tampons de commutateur dans la file d’attente de réception sur la carte réseau.

    Notez qu’un fournisseur de services SAN ne doit pas supprimer une connexion simplement parce que le commutateur n’a pas affiché de mémoire tampon de réception avant l’arrivée du message de négociation de session. La longueur maximale d’un message de négociation de session est de 256 octets.

  4. Le commutateur au niveau du point de terminaison d’acceptation local publie ses mémoires tampons de réception avant de répondre au message de négociation de session. Le commutateur local appelle la fonction WSPSend du fournisseur de services SAN local pour répondre au message de négociation de session. La réponse du commutateur local inclut le nombre de mémoires tampons de réception que le commutateur local a publiées. À partir de ce stade, le commutateur local garantit que l’ensemble publié de mémoires tampons de réception est de taille suffisante pour recevoir tout message qui arrive sur la connexion.

  5. Si une application spécifie une mémoire tampon de réception initiale dans son appel AcceptEx , le commutateur attend jusqu’à ce qu’il reçoive le premier message de données de son homologue distant avant de terminer l’appel AcceptEx de l’application.

  6. Si l’application annule son propre appel d’acceptation , le commutateur appelle la fonction WSPCloseSocket du fournisseur de services SAN approprié pour fermer le socket SAN acceptant.