在客户端有如下程序:
  g_Event = WSACreateEvent();
 nRet = WSAEventSelect(LocalSocket,g_Event,FD_CONNECT | FD_CLOSE | FD_ACCEPT);
 g_AllEvents[unEventCount] = g_Event;
 g_Socket[unEventCount] = LocalSocket;
 unEventCount++;
 while(TRUE)
   {
      int nIndex = 0;
      nIndex = WSAWaitForMultipleEvents(unEventCount,g_AllEvents,FALSE,WSA_INFINITE,FALSE);

      switch(nIndex)
       {
case WSA_WAIT_EVENT_0:
Debug("Event0\n");
WSAEnumNetworkEvents(LocalSocket,g_AllEvents,&newEvent);
if(newEvent.lNetworkEvents & FD_ACCEPT)
{
    //accept link
    int len = sizeof(SOCKADDR);
    sockaddr_in ConnAddr;
    ConnSock = accept(LocalSocket,(SOCKADDR*)&ConnAddr,&len);

    if(ConnSock == INVALID_SOCKET )
    {
Debug(msg,"ErrorCode = %d\n",WSAGetLastError());
return 0;
    }     g_Event = WSACreateEvent();
    nRet = WSAEventSelect(ConnSock,g_Event,FD_READ | FD_CONNECT | FD_CLOSE);     g_AllEvents[unEventCount] = g_Event;
    unEventCount++;
}
break; case WSA_WAIT_EVENT_0 + 1:     WSAEnumNetworkEvents(ConnSock,g_AllEvents,&newEvent);
    if(newEvent.lNetworkEvents & FD_READ)
    {
      //receive data
      char szData[100];
      memset(szData,'\0',100);
               int nReceiveSize = recv(ConnSock,szData,100,0);
               
               bEndFlag = TRUE;
               closesocket(ConnSock);
     }
     break;
default:
   break;
    }
      然后从客户端发送数据,accept可以执行成功,但是收数据的那一块执行不到。求高手指教。

解决方案 »

  1.   

     nIndex = WSAWaitForMultipleEvents(unEventCount,g_AllEvents,FALSE,WSA_INFINITE,FALSE);
    下面的语句,看得挺别扭的
    while(TRUE)
    {
     int nIndex = WSAWaitForMultipleEvents(unEventCount, AllEvents,FALSE,WSA_INFINITE,FALSE)'
     nIndex -= WSA_WAIT_EVENT_0;
    for(int i=nIndex; i<unEventCount; i++)
    {
     nIndex = WSAWaitForSingleEvents(1, AllEvents[i], TRUE, 1000, FALSE);
    if(WSA_WAIT_FAILED == nIndex || WSA_WAIT_TIMEOUT == nIndex)
    {
     continue;
    }
    else
    {
    WSANETWORKEVENTS event;
    WSAEnumNetworkEvents(g_Socket[i], AllEvents[i], &event);
    if(event.lNetworkEvents & FD_ACCEPT)
    {
    if(0 == event.iErrorCode[FD_ACCEPT_BIT])
    {
     if(unEventCount > WSA_MAXIMUM_WAIT_EVENTS)
    {
     // Too many connections
     continue;
    }
    SOCKET sNew = accept(g_Socket[i], NULL, NULL);
    WSAEVENT evt = WSACreateEvent();
    WSAEventSelect(sNew, evt, FD_READ|FD_CLOSE|FD_WRITE);
    g_Socket[unEventCount] = sNew;
    AllEvents[unEventCount] = evt;
    unEventCount++;
    }
    }
    else if(event.lNetworkEvents & FD_READ)
    {
    if(0 == event.iErrorCode[FD_READ_BIT])
    {
     char szText[256] ={0};
     int nRecv = recv(g_Socket[i], sztext, 256, 0);
     //... 接收到数据
    }
    }
    }
    else if(event.lNetworkEvents & FD_CLOSE)
    {
    if(0 == event.iErrorCode[FD_CLOSE_BIT])
    {
     closesocket(g_Socket[i]);
    for(int j=i; j<unEventCount-1;j++)
    {
     g_Socket[j] = g_Socket[j+1];
     AllEvents[j] = AllEvents[j+1];
    }
    unEventCount--;
    }
    }
    else if(event.lNetworkEvents & FD_WRITE)
    {
     if(0 == event.lErroCode[FD_WRITE_BIT])
    {
     // 写数据
    }
    }
    }
    }