接受连接请求

如果应用程序调用 WSAAcceptacceptAcceptEx 函数来接受套接字上的传入连接请求,则 Windows 套接字开关始终将此调用转发到 TCP/IP 服务提供程序。 如果传入连接请求从非 SAN 网络到达,它将流经 NDIS 路径,由 TCP/IP 服务提供程序处理。 如果连接请求从 SAN 上的远程对等方到达,则交换机将充当 TCP/IP 服务提供商和 SAN 服务提供商之间的中介,以确定是接受连接请求,还是完成应用程序的 WSAAcceptacceptAcceptEx 函数。

下图概述了 Windows 套接字交换机与 SAN 服务提供程序在确定是接受还是拒绝传入连接请求时之间的交互。 下面的序列和部分更详细地描述了验收决定。

显示连接请求到达时 Windows 套接字交换机与 SAN 服务提供程序之间的交互的关系图。

接受或拒绝连接请求

  1. 从远程对等方接收传入连接请求时,SAN 服务提供商向事件对象发出信号,如 侦听 SAN 上的连接中所述。

  2. Windows 套接字开关调用 SAN 服务提供程序的 WSPEnumNetworkEvents 函数来接收FD_ACCEPT事件代码。

  3. 在收到FD_ACCEPT事件代码时,交换机会调用 SAN 服务提供商的 WSPAccept 函数来接受或拒绝传入的连接请求。

  4. 在交换机对 SAN 服务提供商的 WSPAccept 函数的调用中,开关指定一个条件函数。 SAN 服务提供程序必须在从 WSPAccept 调用返回之前调用 WSPAccept 函数的同一 线程中调用 此条件函数。

  5. 开关从此条件函数返回CF_ACCEPT或CF_REJECT代码,以指示它分别接受或拒绝连接请求。

接受连接请求并创建接受套接字

如果应用程序接受传入连接请求,则交换机会将CF_ACCEPT代码返回给 SAN 服务提供商,以完成交换机的条件功能。 接收CF_ACCEPT时,SAN 服务提供程序会初始化一个内部数据结构,在该结构中存储有关接受套接字的信息。 SAN 服务提供商的 WSPAccept 函数接下来必须调用 WPUCreateSocketHandle 函数,以便从交换机获取接受套接字的描述符。 SAN 服务提供程序必须将交换机的描述符存储在接受套接字的内部数据结构中,并且必须为接受套接字返回自己的描述符才能完成 WSPAccept 调用。 调用 SAN 服务提供商的函数时,交换机必须为接受套接字提供 SAN 服务提供商的内部描述符,而 SAN 服务提供商必须在对交换机的调用中提供交换机的套接字描述符。

在成功完成 WSPAccept 之前,SAN 服务提供商应调用 Win32 ResetEvent 函数来重置事件对象。 这样,SAN 服务提供程序就可以稍后调用 Win32 SetEvent 函数,以向开关发出信号以接受下一个传入连接请求。

拒绝连接请求

如果应用程序拒绝传入连接请求,则交换机会将CF_REJECT代码返回给 SAN 服务提供商,以完成交换机的条件功能。 接收CF_REJECT时,SAN 服务提供商应将 WSAECONNREFUSED 错误代码返回到交换机以完成 WSPAccept 调用。

指示接受或拒绝对远程对等方的连接请求

在 SAN 服务提供商可以向远程对等方指示接受或拒绝远程对等方的连接请求之前,SAN 服务提供商必须调用交换机的条件函数。 根据交换机的条件函数返回的值,SAN 服务提供商应向远程对等方发出以下指示之一:

如果交换机的条件函数返回CF_ACCEPT,则 SAN 服务提供商应指示它接受远程对等方的连接请求。 然后,远程对等方上的 SAN 服务提供程序可以成功完成由 WSPConnect 调用启动的连接操作。

如果交换机的条件函数返回CF_REJECT,则 SAN 服务提供商应指示它拒绝远程对等方的连接请求。 远程对等方上的 SAN 服务提供程序必须失败,该连接操作由 WSPConnect 调用启动,错误代码为 WSAECONNREFUSED。

会话协商

交换机成功使用 SAN 服务提供商接受来自远程对等方的连接请求后,交换机会与该对等方协商会话。

协商会话

  1. 远程对等方上的交换机调用 SAN 服务提供商的 WSPRecv 函数来发布一组接收缓冲区。

  2. 远程对等方上的交换机调用 SAN 服务提供商的 WSPSend 函数,以将会话协商消息发送到位于本地接受终结点的交换机。 此消息包括远程对等方处的交换机发布的接收缓冲区数。

  3. 本地接受终结点上的开关调用本地 SAN 服务提供程序的 WSPRecv 函数发布其自己的接收缓冲区,但它可能无法及时接收会话协商消息。 如果本地交换机未及时发布接收缓冲区,并且基础 NIC 不支持流控制,则本地接受终结点上的 SAN 服务提供程序必须在其自己的专用接收缓冲区中缓冲远程交换机的会话协商消息。 当交换机发布接收缓冲区时,SAN 服务提供程序会一对一地将数据从其专用接收缓冲区复制到交换机缓冲区,直到所有数据已从专用缓冲区复制到交换机缓冲区。

    SAN 服务提供程序在后续的交换机缓冲区上执行正常的接收处理,即将所有此类开关缓冲区发布到 NIC 上的接收队列。

    请注意,SAN 服务提供程序不得仅仅因为交换机在会话协商消息到达之前未发布接收缓冲区而断开连接。 会话协商消息的最大长度为 256 字节。

  4. 本地接受终结点上的开关在响应会话协商消息之前发布其接收缓冲区。 本地交换机调用本地 SAN 服务提供程序的 WSPSend 函数来响应会话协商消息。 本地交换机的响应包括本地交换机发布的接收缓冲区数。 从此以后,本地交换机将保证发布的接收缓冲区集的大小足以接收到达连接的任何消息。

  5. 如果应用程序在其 AcceptEx 调用中指定初始接收缓冲区,则开关将等待,直到它从远程对等方收到第一条数据消息,然后才能完成应用程序的 AcceptEx 调用。

  6. 如果应用程序取消其自己的 接受 调用,则开关会调用相应的 SAN 服务提供商的 WSPCloseSocket 函数来关闭接受的 SAN 套接字。