проблема с winsock

Тема в разделе "WASM.WIN32", создана пользователем firs, 21 сен 2006.

  1. firs

    firs New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    11
    Адрес:
    Russia
    Помогите с косячком при использовании событийного апи winsock2.
    При отправке первого пакета все нормально WSAEnumNetworkEvents возвращает и FD_READ и FD_WRITE.
    После этого WSAWaitForMultipleEvents всегда таймаутится и WSAEnumNetworkEvents возвращает 0 в событиях, хотя выставлено ожидание FD_WRITE|FD_READ|FD_CLOSE.
    что может быть не так?
    Код (Text):
    1. while(1)
    2. {
    3.         i = FD_READ|FD_CLOSE;
    4.         if(wpkt_len) i |= FD_WRITE;
    5.         WSAEventSelect(s, h_sev, i)
    6.         WSAWaitForMultipleEvents(1, &h_sev, FALSE, SELECT_TIMEOUT, FALSE);
    7.         WSAEnumNetworkEvents(s, h_sev, &we);
    8.         if(we.lNetworkEvents & FD_READ)
    9.                 handle_read();
    10.         if(we.lNetworkEvents & FD_WRITE)
    11.                 handle_write();
    12. }
     
  2. firs

    firs New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    11
    Адрес:
    Russia
    Всем спасибо ответ нашелся:

    The FD_WRITE event is handled slightly differently. An FD_WRITE message is posted when a socket is first connected with connect() or accepted with accept(), and then after a send() or sendto() fails with WSAEWOULDBLOCK and buffer space becomes available. Therefore, an application can assume that sends are possible starting from the first FD_WRITE message and lasting until a send returns WSAEWOULDBLOCK. After such a failure the application will be notified that sends are again possible with an FD_WRITE message.
     
  3. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Сразу после WSAWaitForMultipleEvents юзай WSAResetEvent!!!
    Сокетные event-ы нужно вручную скидывать, иначе они остаются signaled и последующие вызовы WSAWaitForMultipleEvents или WaitForSingleObject возвращают немедленно.
    Главное после выхода из ф-ции ожидания _СРАЗУ_ сделать WSAResetEvent.
    Кстати вместо WSAWaitForMultipleEvents можно юзать просто WaitForSingleObject, AFAIK
    Я пробовал, пашет, но 100% гарантии не даю :)
     
  4. firs

    firs New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    11
    Адрес:
    Russia
    вроде WSAEnumNetworkEvents сбрасывает евент: