Re[7]: CancelIoEx вешает программу
От: remark Россия http://www.1024cores.net/
Дата: 30.07.13 10:36
Оценка:
Здравствуйте, 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 случаем не установлен?

1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.