Windows 套接字 2 支持重叠 I/O,所有传输提供程序都支持此功能。 重叠的 I/O 遵循在 Windows 中建立的模型,可以在使用 套接字 函数创建的套接字上执行,也可以对使用 WSASocket 函数创建的套接字执行,该函数具有在 dwFlags 参数中设置的 WSA_FLAG_OVERLAPPED 标志。
注意
创建具有重叠属性的套接字不会影响套接字当前处于阻塞模式还是非阻止模式。 使用重叠属性创建的套接字可用于执行重叠的 I/O,这样做不会更改套接字的阻塞模式。 由于重叠的 I/O作不会阻止,因此套接字的阻塞模式与这些作无关。
对于接收,应用程序使用 WSARecv 或 WSARecvFrom 函数来提供要接收数据的缓冲区。 如果在网络收到数据之前发布一个或多个缓冲区,则该数据可以在到达时立即放置在用户的缓冲区中。 因此,它可以避免在调用 recv 或 recvfrom 函数时发生的复制作。 如果在发布接收缓冲区时已存在数据,则会立即将其复制到用户的缓冲区中。
如果应用程序未发布接收缓冲区时数据到达,则网络会采用熟悉的同步作样式。 也就是说,传入数据在内部缓冲,直到应用程序发出接收调用,从而提供可将数据复制到其中的缓冲区。 例外情况是,当应用程序使用 setsockopt 将接收缓冲区的大小设置为零时。 在此实例中,可靠协议仅允许在发布应用程序缓冲区时接收数据,并且不可靠的协议上的数据将丢失。
在发送端,应用程序使用 WSASend 或 WSASendTo 来提供指向填充缓冲区的指针,然后同意在网络使用缓冲区的内容之前绝不干扰缓冲区。
重叠的发送和接收呼叫会立即返回。 返回值为零表示 I/O作已立即完成,并且已出现相应的完成指示。 也就是说,关联的事件对象已发出信号,或者已完成例程已排队,并在调用线程进入可警报等待状态时执行。
返回值SOCKET_ERROR加上错误代码 WSA_IO_PENDING 指示已成功启动重叠作,并在使用发送缓冲区或完成接收作时提供后续指示。 但是,对于字节流样式的套接字,无论缓冲区是否已满,只要传入数据耗尽,就会发生完成指示。 任何其他错误代码都指示重叠的作未成功启动,并且不会发出任何完成指示。
发送和接收作可以重叠。 可以多次调用接收函数来发布接收缓冲区,以准备传入数据,并且可以多次调用发送函数,以将多个缓冲区排入队列以发送。 虽然应用程序可以依赖一系列重叠的发送缓冲区以提供的顺序发送,但相应的完成指示可能以不同的顺序发生。 同样,在接收端,可以按提供缓冲区的顺序填充缓冲区,但完成指示可能按不同的顺序发生。
在许多情况下,使用 AcceptEx、ConnectEx、WSASend、WSARecv、TransmitFile等函数的 Winsock 重叠作可取消。 但是,对于已取消未完成作的套接字的继续使用,未定义行为。 取消重叠作后,应调用 closesocket 函数。 因此,为了获得最佳结果,应调用 closesocket 函数来关闭套接字,最终将停止所有挂起的作,而不是直接取消 I/O。
重叠 I/O 的延迟完成功能也可用于 WSAIoctl,这是 ioctlsocket的增强版本。