WSAWaitForMultipleEvents успешно возвращается, но объект WSANETWORKEVENTS пуст

Этот код компилируется и запускается. Когда клиент подключается, WSAWaitForMultipleEvents возвращается с nReturnCode = 0 (что равно WSA_WAIT_EVENT_0). Но код всегда отображает "EVENT: NOT ACCEPT" и когда я смотрю NetworkEvents в режиме отладки, он полностью заполнен нулями.

Я не ожидал, что этот код сработает, потому что я действительно не знаю, как инициализировать переменную NetworkEvents. Разве мне не нужно как-то «привязывать» его к сокету? Как структура должна знать, что она должна хранить сетевые события ListenSocket?

    WSAEVENT event = WSACreateEvent();
    WSAEventSelect(ListenSocket, event, FD_CONNECT | FD_ACCEPT | FD_READ | FD_WRITE | FD_CLOSE);
    //DWORD cEvents = MAKELONG(MAKEWORD(0, 0), MAKEWORD(0, 1));
    WSAEVENT lphEvents[1] = {event};
    //lphEvents[0] = event;
    //DWORD dwTimeout = MAKELONG(MAKEWORD(0, 0), MAKEWORD(0, 0));
    WSANETWORKEVENTS NetworkEvents = {0};
    int nReturnCode = WSAWaitForMultipleEvents(1, &lphEvents[0], false, WSA_INFINITE, false);

    if ((NetworkEvents.lNetworkEvents & FD_ACCEPT) == FD_ACCEPT) {
        std::cout << "EVENT: ACCEPT !" << std::endl;
    } else {
        std::cout << "EVENT: NOT ACCEPT !" << std::endl;
    }

person Earnie    schedule 08.10.2015    source источник


Ответы (1)


Вы устанавливаете все на 0 в WSANETWORKEVENTS NetworkEvents = {0};, и нигде больше нет кода, использующего эту переменную, поэтому при проверке этой структуры она будет равна нулю.

Вероятно, вы пропустили звонок WSAEnumNetworkEvents после WSAWaitForMultipleEvents

if (WSAEnumNetworkEvents(ListenSocket, event, &NetworkEvents) == SOCKET_ERROR) {
    printf("WSAEnumNetworkEvents() failed with error %d\n", WSAGetLastError());
}
person nos    schedule 08.10.2015
comment
Это был ответ. Благодарю вас ! - person Earnie; 08.10.2015
comment
Может ли WSANETWORKEVENTS::lNetworkEvents содержать несколько событий? - person Quest; 26.03.2016