Помогите с косячком при использовании событийного апи winsock2. При отправке первого пакета все нормально WSAEnumNetworkEvents возвращает и FD_READ и FD_WRITE. После этого WSAWaitForMultipleEvents всегда таймаутится и WSAEnumNetworkEvents возвращает 0 в событиях, хотя выставлено ожидание FD_WRITE|FD_READ|FD_CLOSE. что может быть не так? Код (Text): while(1) { i = FD_READ|FD_CLOSE; if(wpkt_len) i |= FD_WRITE; WSAEventSelect(s, h_sev, i) WSAWaitForMultipleEvents(1, &h_sev, FALSE, SELECT_TIMEOUT, FALSE); WSAEnumNetworkEvents(s, h_sev, &we); if(we.lNetworkEvents & FD_READ) handle_read(); if(we.lNetworkEvents & FD_WRITE) handle_write(); }
Всем спасибо ответ нашелся: 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.
Сразу после WSAWaitForMultipleEvents юзай WSAResetEvent!!! Сокетные event-ы нужно вручную скидывать, иначе они остаются signaled и последующие вызовы WSAWaitForMultipleEvents или WaitForSingleObject возвращают немедленно. Главное после выхода из ф-ции ожидания _СРАЗУ_ сделать WSAResetEvent. Кстати вместо WSAWaitForMultipleEvents можно юзать просто WaitForSingleObject, AFAIK Я пробовал, пашет, но 100% гарантии не даю