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