WSARecv, повторный вызов не происходит асинхронно

Тема в разделе "WASM.NETWORKS", создана пользователем rpy3uH, 30 янв 2012.

  1. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    Первый вызов WSARecv происхоидт как положено, с последующим вызовом WSAWaitForMultipleEvents и WSAGetOverlappedResult. но повторный вызов WSARecv останавливает поток

    Код (Text):
    1. for (; (всегда); )
    2. {
    3.     //первый проход - всё нормально,
    4.     //во втором проходе WSARecv оставливает поток, до тех пор пока не произодёт дисконнект
    5.     if (WSARecv(pConnection->Socket, &ExchBuffer1, 1, 0, &Flags1, &SocketReadOverlp, 0) == SOCKET_ERROR)
    6.     {
    7.         status = WSAGetLastError();
    8.         if (status != WSA_IO_PENDING)
    9.         {
    10.                 ......
    11.         }
    12.     }
    13.     do {
    14.         status = WSAWaitForMultipleEvents(.....);
    15.     } while ((status == WSA_WAIT_TIMEOUT) && (.......));
    16.  
    17.     if (status == WSA_WAIT_EVENT_0)
    18.     {  
    19.         if (!WSAGetOverlappedResult(pConnection->Socket, &SocketReadOverlp, &Received1, FALSE, &Flags1))
    20.         {
    21.                 ............
    22.         }
    23.         WSAResetEvent(SocketReadOverlp.hEvent);
    24.         if (!Received1) //дисконнект
    25.         {
    26.             status = ERROR_SUCCESS;
    27.             break;
    28.         }
    29.  
    30.         //обработка данных      
    31.     }
    32. }
    почему WSARecv() перестаёт работать асинхронно?
     
  2. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    А какой смысл имеет асинхронность в данном примере ?
     
  3. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    имеет. я в этом примере очень многое повыкидывал
    например если вызывать WSARecv синхронно, то она заблокирует поток, и приложение уже не закрыть в нормальном режиме, если данных в сокет не поступает. а если тупо закрыть программу, то поток не сделает многих важных вещей
    Код (Text):
    1. do {
    2.      status = WSAWaitForMultipleEvents(.....);
    3.     if (вот здесь проверка на необходимость завершения потока) {нормально завершаемся}
    4. } while ((status == WSA_WAIT_TIMEOUT) && ());
    асинхронность нужна для лучшего отклика потока.

    В общем, асинхронность нужна, это не обсуждается