Первый вызов WSARecv происхоидт как положено, с последующим вызовом WSAWaitForMultipleEvents и WSAGetOverlappedResult. но повторный вызов WSARecv останавливает поток Код (Text): for (; (всегда); ) { //первый проход - всё нормально, //во втором проходе WSARecv оставливает поток, до тех пор пока не произодёт дисконнект if (WSARecv(pConnection->Socket, &ExchBuffer1, 1, 0, &Flags1, &SocketReadOverlp, 0) == SOCKET_ERROR) { status = WSAGetLastError(); if (status != WSA_IO_PENDING) { ...... } } do { status = WSAWaitForMultipleEvents(.....); } while ((status == WSA_WAIT_TIMEOUT) && (.......)); if (status == WSA_WAIT_EVENT_0) { if (!WSAGetOverlappedResult(pConnection->Socket, &SocketReadOverlp, &Received1, FALSE, &Flags1)) { ............ } WSAResetEvent(SocketReadOverlp.hEvent); if (!Received1) //дисконнект { status = ERROR_SUCCESS; break; } //обработка данных } } почему WSARecv() перестаёт работать асинхронно?
имеет. я в этом примере очень многое повыкидывал например если вызывать WSARecv синхронно, то она заблокирует поток, и приложение уже не закрыть в нормальном режиме, если данных в сокет не поступает. а если тупо закрыть программу, то поток не сделает многих важных вещей Код (Text): do { status = WSAWaitForMultipleEvents(.....); if (вот здесь проверка на необходимость завершения потока) {нормально завершаемся} } while ((status == WSA_WAIT_TIMEOUT) && ()); асинхронность нужна для лучшего отклика потока. В общем, асинхронность нужна, это не обсуждается