Also habe ich einige WIN32-Socket-Programmierung gemacht und ich versuche zu verstehen, warum Overlapped IO bevorzugt wird. Insbesondere frage ich mich, warum so etwas wie diesesWarum ist asynchrone IO bevorzugt
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;
über einen normalen IO Anruf bevorzugt ist wie dieser
recv(socket, dataBuf, bufLen), 0);
Von meinem Verständnis wird der erste Anruf sperren, wenn das IO-Ereignis nicht tat Bei WSAWaitForMultipleEvents wird der Aufruf beendet, während der zweite Aufruf direkt bei recv blockiert wird, bis Daten eingetroffen sind. Was ist also der eigentliche Vorteil, wenn der IO Call etwas später blockiert wird? Ist es das IF Sie hatten etwas, was Sie tun konnten, bevor Sie darauf warten, dass Sie das tun würden?
Wenn das der Fall ist Overlapped IO lohnt es/benötigt in Anwendungen, in denen Sie nichts tun können, bis Daten angekommen sind?
Können Sie ein Beispiel für etwas geben, das während des Wartens auf Daten ausgeführt werden kann? – FrozenHawk
Das kanonische Beispiel ist eine Anwendung, die mehr als einen aktiven Socket aufweist, z. B. einen Server. Sie können entweder einen Thread für jeden Client verwenden, der einfach ist, aber schlecht skaliert, oder Sie können asynchrone E/A verwenden. –
Ich hätte gedacht, dass die kanonische Anwendung überhaupt eine GUI-Anwendung ist, die auf Benutzereingaben und Neuaufruftelefonate reagieren muss, damit sie nicht mehr reagiert. –