接收完成指示
有多个选项可用于接收完成指示,从而为应用程序提供适当的灵活性级别。 其中包括:等待 (或阻止对事件对象) 、轮询事件对象和套接字 I/O 完成例程。
阻止和等待完成指示
使用 WSAWaitForMultipleEvents 函数等待设置一个或多个事件对象时,应用程序可能会阻止。 在 Windows 实现中,进程或线程确实会阻塞。 由于 Windows 套接字 2 事件对象作为 Windows 事件实现,因此本机 Windows 函数 WaitForMultipleObjects 也可用于此目的。 如果线程需要同时等待套接字和非socket事件,这尤其有用。
轮询完成指示
不希望阻止的应用程序可以使用 WSAGetOverlappedResult 函数轮询与任何特定事件对象关联的完成状态。 此函数指示重叠操作是否已完成,如果已完成,则安排 WSAGetLastError 函数检索重叠操作的错误状态。
使用套接字 I/O 完成例程
用于启动重叠 I/O ( WSASend、 WSASendTo、 WSARecv、 WSARecvFrom) 的函数均采用 lpCompletionRoutine 作为可选输入参数。 这是指向应用程序特定的函数的指针,该函数在成功启动的重叠 I/O 操作成功完成 (或以其他方式) 后调用。 完成例程遵循 Windows 文件 I/O 完成例程规定的相同规则。 也就是说,在线程处于可警报等待状态之前,不会调用完成例程,例如在设置了 标志的情况下fAlertable
调用函数 WSAWaitForMultipleEvents 时。 对特定重叠 I/O 请求使用完成例程选项的应用程序不能对同一重叠 I/O 请求使用 WSAGetOverlappedResult 的等待选项。
传输允许应用程序从套接字 I/O 完成例程的上下文中调用发送和接收操作,并保证对于给定套接字,I/O 完成例程不会嵌套。 这允许时间敏感型数据传输完全在先发制人的上下文中进行。
重叠完成指示机制摘要
要用于给定重叠操作的特定重叠 I/O 完成指示取决于应用程序是否提供指向完成函数的指针、是否引用 WSAOVERLAPPED 结构,以及 WSAOVERLAPPED 结构中 hEvent 成员的值 ((如果提供) )。 下表总结了重叠套接字的完成语义,并显示了 lpOverlapped、 hEvent 和 lpCompletionRoutine 的各种组合:
lpOverlapped | hEvent | lpCompletionRoutine | 完成指示 |
---|---|---|---|
Null | 不适用 | 忽略 | 操作同步完成。 它的行为就像是未重叠的套接字一样。 |
!空 | Null | Null | 操作完成重叠,但没有 Windows 套接字 2 支持的完成机制。 在这种情况下可以使用) 支持时,完成端口机制 (。 否则,不会有完成通知。 |
!空 | !空 | Null | 操作完成重叠,通过向事件对象发出信号通知。 |
!空 | 忽略 | !空 | 操作完成重叠,通过计划完成例程通知。 |