WSAWaitForMultipleEvents returns 成功,但 WSANETWORKEVENTS 对象为空
WSAWaitForMultipleEvents returns successfully, but WSANETWORKEVENTS object is empty
此代码编译并运行。当客户端连接时,WSAWaitForMultipleEvents returns 和 nReturnCode = 0(等于 WSA_WAIT_EVENT_0)。但是代码总是显示 "EVENT: NOT ACCEPT" 并且当我在调试模式下查看 NetworkEvents 时,它完全被零填充。
我没想到这段代码会起作用,因为我真的不知道如何初始化变量 NetworkEvents。难道我不必以某种方式 "bind" 它到套接字吗?该结构应该如何知道它应该存储 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;
}
您在 WSANETWORKEVENTS NetworkEvents = {0};
处将所有内容设置为 0,并且其他地方没有使用该变量的代码,因此当您检查该结构时它将为零。
您可能在 WSAWaitForMultipleEvents
之后错过了对 WSAEnumNetworkEvents
的呼叫
if (WSAEnumNetworkEvents(ListenSocket, event, &NetworkEvents) == SOCKET_ERROR) {
printf("WSAEnumNetworkEvents() failed with error %d\n", WSAGetLastError());
}
此代码编译并运行。当客户端连接时,WSAWaitForMultipleEvents returns 和 nReturnCode = 0(等于 WSA_WAIT_EVENT_0)。但是代码总是显示 "EVENT: NOT ACCEPT" 并且当我在调试模式下查看 NetworkEvents 时,它完全被零填充。
我没想到这段代码会起作用,因为我真的不知道如何初始化变量 NetworkEvents。难道我不必以某种方式 "bind" 它到套接字吗?该结构应该如何知道它应该存储 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;
}
您在 WSANETWORKEVENTS NetworkEvents = {0};
处将所有内容设置为 0,并且其他地方没有使用该变量的代码,因此当您检查该结构时它将为零。
您可能在 WSAWaitForMultipleEvents
WSAEnumNetworkEvents
的呼叫
if (WSAEnumNetworkEvents(ListenSocket, event, &NetworkEvents) == SOCKET_ERROR) {
printf("WSAEnumNetworkEvents() failed with error %d\n", WSAGetLastError());
}