2015-10-08 36 views
0

此代码编译并运行。当客户端连接时,WSAWaitForMultipleEvents返回nReturnCode = 0(相当于WSA_WAIT_EVENT_0)。但是代码总是显示“EVENT:NOT ACCEPT”,当我在调试模式下查看NetworkEvents时,它完全填充了零。WSAWaitForMultipleEvents成功返回,但WSANETWORKEVENTS对象为空

我没想到这段代码能够工作,因为我不知道如何初始化变量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; 
    } 

回答

0

您在WSANETWORKEVENTS NetworkEvents = {0};一切设置为0,而且也没有其他地方的代码,使用的是可变的,所以这将是零,当你检查结构。

你以后WSAWaitForMultipleEvents

if (WSAEnumNetworkEvents(ListenSocket, event, &NetworkEvents) == SOCKET_ERROR) { 
    printf("WSAEnumNetworkEvents() failed with error %d\n", WSAGetLastError()); 
} 
+0

这就是答案可能缺少WSAEnumNetworkEvents通话。谢谢 ! – Earnie

+0

WSANETWORKEVENTS :: lNetworkEvents可以包含多个事件吗? – Quest