关闭 SAN 套接字
在连接任一端的 Windows 套接字开关调用 SAN 服务提供商的 WSPCloseSocket 函数后,SAN 服务提供程序将执行以下过程来关闭 SAN 套接字:
连接两端的每个 SAN 服务提供程序都通过返回 lpErrno 参数处的相应错误代码来断开连接并完成接收请求(WSPRecv 函数调用)。 例如,SAN 服务提供程序返回 WSAECONNRESET 以指示远程对等方重置连接。
每个 SAN 服务提供程序还会指示要关闭的 SAN 套接字完成挂起的重叠操作。 SAN 服务提供程序调用 WPUCompleteOverlappedRequest 函数以指示重叠操作完成。 在此调用中,SAN 服务提供程序传递指向与重叠操作关联的 WSAOVERLAPPED 结构的指针。 SAN 服务提供程序还会传递WSA_OPERATION_ABORTED错误代码,以指定由于 SAN 套接字已关闭而取消重叠的操作。 在发出完成重叠操作的信号之前,SAN 服务提供商应释放该操作所需的任何内存。
在 SAN 服务提供程序完成对前缀为 WPU 的函数的调用-到使用通过 WPUCreateSocketHandle up-call 获取的 SAN 套接字的句柄的开关后,SAN 服务提供商必须通过调用 WPUCloseSocketHandle 函数来对交换机进行最终向上调用以关闭套接字句柄。 然后,SAN 服务提供商会清理与 SAN 套接字相关的所有内容。 向上调用是来自交换机的向上调用调度表的函数调用。 开关在调用 SAN 服务提供商的 WSPStartupEx 函数以开始使用提供程序时,提供指向此向上调用调度表的指针。
只要 SAN 服务提供商执行上述过程来关闭 SAN 套接字,交换机就会处理其他一切。
为了防止 SAN 服务提供商与启动套接字关闭的交换机之间的争用条件,在交换机调用 WSPCloseSocket 之前,SAN 服务提供商绝不应释放与 SAN 套接字相关的数据结构。