Итак, я занимаюсь программированием сокетов WIN32, и я пытаюсь понять, почему предпочтительным является Overlapped IO. В частности, я задаюсь вопросом, почему что-то вроде этогоПочему предпочтительный асинхронный IO
if (WSARecv(
socket,
dataBuf,
1,
NULL,
&flags,
&ov,
NULL)
== SOCKET_ERROR) {
if (WSAGetLastError() == WSA_IO_PENDING)
{
if (WSAWaitForMultipleEvents(1, &ov.hEvent, FALSE, INFINITE, FALSE) == WAIT_TIMEOUT)
{
return FALSE;
}
} else {
return FALSE;
}
}
// ... more code here
return TRUE;
предпочтительнее обычный IO вызов как этот
recv(socket, dataBuf, bufLen), 0);
Из моего понимания, первый вызов будет блокировать, если событие IO не в WSAWaitForMultipleEvents, тогда как второй вызов блокируется непосредственно на recv до тех пор, пока данные не будут получены. Итак, какова фактическая польза от того, что блок вызова IO немного позже? Разве что IF у вас было что-то, что вы могли бы сделать, прежде чем ждать, что вы это сделаете?
Если это так, то значение Overlapped IO стоит/необходимо в приложениях, в которых вы ничего не можете сделать, пока не поступят данные?
Не могли бы вы привести пример того, что можно сделать в ожидании данных? – FrozenHawk
Канонический пример - это приложение, которое имеет более одного активного сокета, например сервера. У вас может быть один поток для каждого клиента, который прост, но плохо масштабируется, или вы можете использовать асинхронный ввод-вывод. –
Я бы подумал, что каноническое приложение - это любое приложение графического интерфейса, которое должно отвечать на запросы пользователя и переадресации системы, чтобы оно не стало ... невосприимчивым. –