所以我一直在做一些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应用程序,需要继续响应用户输入和系统重画调用,以免它变得......没有反应。 –