为什么WSAWaitForMultipleEvents函数没有接收到数据?
主啊,救救我吧.搞了N天了,可还是不知道为什么WSAWaitForMultipleEvents参数里的事件就是没有受信啊.用sniffer抓包,发现数据已经发过来了.可为什么我的客户端程序就是没有响应.下面是我程序代码.先谢谢大家了.我帮解决这个问题吧.
DWORD WINAPI CP2PClient::RecvThreadProcFromServer(LPVOID lpParam){
CP2PClient * client = (CP2PClient*)lpParam;
while(TRUE)
{
if(client->m_bThreadServerExit)
break;
// 在所有事件对象上等待
int nIndex = ::WSAWaitForMultipleEvents(client->nEventTotal, client->eventArray, FALSE, WSA_INFINITE, FALSE);
// 对每个事件调用WSAWaitForMultipleEvents函数,以便确定它的状态
nIndex = nIndex - WSA_WAIT_EVENT_0;
for(int i=nIndex; i<client->nEventTotal; i++)
{
nIndex = ::WSAWaitForMultipleEvents(1, &client->eventArray[i], TRUE, 1000, FALSE);
if(nIndex == WSA_WAIT_FAILED || nIndex == WSA_WAIT_TIMEOUT)
{
continue;
}
else
{
// 获取到来的通知消息,WSAEnumNetworkEvents函数会自动重置受信事件
WSANETWORKEVENTS event;
::WSAEnumNetworkEvents(client->sockArray[i], client->eventArray[i], &event);
if(event.lNetworkEvents & FD_ACCEPT) // 处理FD_ACCEPT通知消息
{
if(event.iErrorCode[FD_ACCEPT_BIT] == 0)
{
if(client->nEventTotal > WSA_MAXIMUM_WAIT_EVENTS)
{
printf(" Too many connections! \n");
continue;
}
SOCKET sNew = ::accept(client->sockArray[i], NULL, NULL);
WSAEVENT event = ::WSACreateEvent();
::WSAEventSelect(sNew, event, FD_READ|FD_CLOSE|FD_WRITE);
// 添加到表中
client->eventArray[client->nEventTotal] = event;
client->sockArray[client->nEventTotal] = sNew;
client->nEventTotal++;
}
}
else if(event.lNetworkEvents & FD_READ) // 处理FD_READ通知消息
{
if(event.iErrorCode[FD_READ_BIT] == 0)
{
char szText[1024];
// CP2PMessage *pMsg;
int nRecv = ::recv(client->sockArray[i], szText, strlen(szText), 0);
// if(nRecv > 0)
{
szText[nRecv] = '\0';
// pMsg = (CP2PMessage *)szText;
client->HandleIOFromServer(szText,nRecv);
//printf("接收到数据:%s \n", szText);
}
}
}
else if(event.lNetworkEvents & FD_CLOSE) // 处理FD_CLOSE通知消息
{
if(event.iErrorCode[FD_CLOSE_BIT] == 0)
{
::closesocket(client->sockArray[i]);
for(int j=i; j<client->nEventTotal-1; j++)
{
client->sockArray[j] = client->sockArray[j+1];
client->sockArray[j] = client->sockArray[j+1];
}
client->nEventTotal--;
}
}
else if(event.lNetworkEvents & FD_WRITE) // 处理FD_WRITE通知消息
{
}
::WSAResetEvent(client->eventArray[i]);
}
}
}
return 0;
}