所以我一直在做一些WIN32套接字編程,我想了解爲什麼重疊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調用塊的實際好處是什麼?這是否如果你有這樣做之前你可以做的事情嗎?
如果出現這種情況,那麼在數據到達之前,您所擁有的應用程序無法執行任何操作的情況下,重疊的IO是否值得?
你能否舉一個例子來說明等待數據時可以做的事情嗎? – FrozenHawk
規範示例是一個具有多個活動套接字(例如服務器)的應用程序。您可以爲每個客戶端分配一個線程,這很簡單,但可以縮放,或者可以使用異步I/O。 –
我會認爲規範應用程序是任何GUI應用程序,需要繼續響應用戶輸入和系統重畫調用,以免它變得......沒有反應。 –