发起连接
Windows 套接字交换机收到应用程序发起的 WSPConnect 调用后,该交换机会将连接请求的目标地址与 SAN 服务提供商提供的交换机 IP 子网表中的地址进行比较。 如果其中一个子网包含此目标地址,则交换机会调用相应 SAN 服务提供商的 WSPSocket 和 WSPBind 函数来创建和绑定套接字,如 创建和绑定 SAN 套接字中所述。 交换机使用 SAN 套接字处理应用程序的连接请求。 如果连接请求的目标地址不在 SAN 子网上,或者 SAN 服务提供商无法创建和绑定套接字,则交换机将使用 TCP/IP 提供程序建立连接。
下图概述了 Windows 套接字交换机如何请求与远程对等方的连接。 以下序列和部分更详细地描述了连接请求。
创建并绑定 SAN 套接字后,交换机在 非阻止模式下使用 SAN 套接字执行连接请求,如以下过程所述。
执行连接请求
交换机调用 SAN 服务提供商的 WSPEventSelect 函数。 在此调用中,开关传递FD_CONNECT代码以及要与该代码关联的事件对象。 对 WSPEventSelect 的调用请求连接事件的通知,并通知 SAN 服务提供商任何后续 WSPConnect 调用在非阻止模式下执行。
WSPEventSelect 函数返回后,交换机将调用 SAN 服务提供商的 WSPConnect 函数。 在此调用中,交换机以 WSK 地址系列之一的格式传递目标地址。 SAN 服务提供商的代理驱动程序将此目标地址映射到本机地址,并尝试建立连接。
如果 SAN 服务提供商的 WSPConnect 函数可以立即完成或失败连接操作,它将返回相应的成功或失败代码。 如果 SAN 服务提供商的 WSPConnect 函数无法立即完成连接请求,则 SAN 服务提供商的连接操作在另一个线程中异步进行。 SAN 服务提供商的 WSPConnect 函数返回错误 WSAEWOULDBLOCK,指示套接字标记为非阻止,并且无法立即完成连接操作。
连接操作完成后,SAN 服务提供程序调用 Win32 SetEvent 函数,以向先前在 WSPEventSelect 调用中注册的事件对象发出信号。
向事件对象发出信号后,交换机调用 SAN 服务提供程序的 WSPEnumNetworkEvents 函数以获取连接操作的结果。
注意 交换机通过 SAN 服务提供程序建立连接后,该交换机不能再使用该连接的 TCP/IP 提供程序。 SAN 服务提供商必须完全实现为已建立的连接提供服务所需的所有功能。
销毁 SAN 套接字
如果 SAN 服务提供商的 WSPConnect 函数失败,交换机会调用 SAN 服务提供商的 WSPCloseSocket 函数来销毁 SAN 套接字。 然后,该交换机调用 TCP/IP 服务提供商的 WSPConnect 函数,以将连接操作转发到 TCP/IP 服务提供商,除非 SAN 服务提供商返回以下错误代码之一作为其连接操作的结果:
WSAECONNRESET
指示没有应用程序正在侦听目标地址处的指定端口
WSAECONNREFUSED
指示远程应用程序主动拒绝连接请求
上述错误代码保证尝试通过 TCP/IP 建立连接也会失败。 如果 SAN 服务提供商无法做出此保证,则不得返回这些错误代码之一。 例如,如果 SAN 上存在不支持 Windows 套接字直通的目标计算机,但只能通过 NDIS 进行通信,则 SAN 服务提供程序无法返回 WSAEHOSTUNREACH,因为此目标的 SAN 连接请求失败,因为通过 TCP/IP 提供程序的连接请求可能会成功。 在这种情况下,SAN 服务提供程序应返回 WSAETIMEDOUT。
会话协商
交换机通过 SAN 服务提供程序建立连接后,该交换机调用 SAN 服务提供商的 WSPRegisterMemory 扩展函数,以预注册要接收传入消息的缓冲区阵列的内存。 接下来,交换机调用 SAN 服务提供商的 WSPRecv 函数来发布一个或多个缓冲区,以接收来自远程对等方的传入消息数据。 然后,交换机通过交换一对包含初始流控制信息的消息来与其远程对等方协商会话。 交换机协商会话后,它将完成应用程序启动的 WSPConnect 调用。 然后,应用程序可以开始发送和接收连接上的数据。 有关详细信息,请参阅 接受连接请求。
通过 SAN 套接字建立连接后,交换机不会调用 SAN 服务提供商的 WSPConnect 函数。 交换机在内部处理应用程序,这些应用程序启动对交换机的 WSPConnect 函数的调用,以轮询连接请求。