事实上
WSA_WAIT_EVENT_0
定义为0是
无关的
(它只是
WAIT_OBJECT_0
从
WaitFor(Single|Multiple)Object(s)()
API,也定义为0-
WSAWaitForMultipleEvents()
它本身就是
WaitForMultipleObjectsEx()
不过,微软保留在不破坏现有用户代码的情况下更改实现的权利)。
wsawaitformultipleevents()
可以一次操作多个事件,其返回值将是以下可能性之一:
WSA_WAIT_EVENT_0 .. (WSA_WAIT_EVENT_0 + cEvents - 1)
已发出特定事件对象的信号。
WSA_WAIT_IO_COMPLETION
执行了一个或多个可报警的I/O完成例程。
WSA_WAIT_TIMEOUT
发生超时。
WSA_WAIT_FAILED
函数失败。
通常,代码应该查看返回值并相应地执行操作,例如:
DWORD ReturnValue = WSAWaitForMultipleEvents(...);
if ((ReturnValue >= WSA_WAIT_EVENT_0) && (ReturnValue < (WSA_WAIT_EVENT_0 + EventTotal))
{
DWORD Index = ReturnValue - WSA_WAIT_EVENT_0;
// handle event at Index as needed...
}
else if (ReturnValue == WSA_WAIT_IO_COMPLETION)
{
// handle I/O as needed...
}
else if (RetunValue == WSA_WAIT_TIMEOUT)
{
// handle timeout as needed...
}
else
{
// handle error as needed...
}
因为事实上
bAlertable
是
FALSE
(不能调用任何I/O例程)和
dwTimeout
是
WSA_INFINITE
(无法超时),因此只有两种可能的结果-事件已发出信号或发生错误:
DWORD ReturnValue = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE);
if (ReturnValue != WSA_WAIT_FAILED)
{
DWORD Index = ReturnValue - WSA_WAIT_EVENT_0;
WSAResetEvent(EventArray[Index]);
}
else
{
// handle error as needed...
}