D>Попробовал воспроизвести у себя — не получилось (10 минут на Win7 SP1 + all updates).
Наврал! Воспроизводится в 100% случаев.
Если переписать код с правильным разбором ошибок (как написано в MSDN), то уже не воспроизводится:
for(;;) {
WSABUF b;
b.buf = (char*)buf;
b.len = recvbuf;
DWORD recv = 0, flags = 0;
int res = WSARecv(c, &b, 1, &recv, &flags, &ol, 0);
if (res == 0)
break;
if (res != SOCKET_ERROR)
panic("WSARecv return NAN");
DWORD dwErr = WSAGetLastError();
if (dwErr != WSA_IO_PENDING)
panic("WSARecv not PENDING");
BOOL ret = WSAGetOverlappedResult(c, &ol, &recv, TRUE, &flags);
if (!ret) {
if(GetLastError() == WSA_OPERATION_ABORTED)
break;
panic("WSAGetOverlappedResult");
}
}