下面代码是重叠IO中的一个数据的处理线程:DWORD WINAPI ProcessIO(LPVOID lpParameter)
{
   DWORD Index;
   DWORD Flags;
   LPSOCKET_INFORMATION SI;
   DWORD BytesTransferred;
   DWORD i;
   DWORD RecvBytes, SendBytes;   // Process asynchronous WSASend, WSARecv requests
   while(TRUE)
   {
      if ((Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE,  WSA_INFINITE, FALSE)) == WSA_WAIT_FAILED)
      {
         printf("WSAWaitForMultipleEvents() failed %d\n", WSAGetLastError());
         return 0;
      }
      else
         printf("WSAWaitForMultipleEvents() is OK!\n");      if ((Index - WSA_WAIT_EVENT_0) == 0)
      {
         WSAResetEvent(EventArray[0]);
         continue;
      }      SI = SocketArray[Index - WSA_WAIT_EVENT_0];
      WSAResetEvent(EventArray[Index - WSA_WAIT_EVENT_0]);
      if (WSAGetOverlappedResult(SI->Socket, &(SI->Overlapped), &BytesTransferred, FALSE, &Flags) == FALSE || BytesTransferred == 0)
      {
         printf("Closing socket %d\n", SI->Socket);
         if (closesocket(SI->Socket) == SOCKET_ERROR)
         {
            printf("closesocket() failed with error %d\n", WSAGetLastError());
         }
         else
            printf("closesocket() is OK!\n");         GlobalFree(SI);
         WSACloseEvent(EventArray[Index - WSA_WAIT_EVENT_0]);
         EnterCriticalSection(&CriticalSection);
         if ((Index - WSA_WAIT_EVENT_0) + 1 != EventTotal)
            for (i = Index - WSA_WAIT_EVENT_0; i < EventTotal; i++)
            {
               EventArray[i] = EventArray[i + 1];
               SocketArray[i] = SocketArray[i + 1];
            }
         EventTotal--;
         LeaveCriticalSection(&CriticalSection);
         continue;
      }      if (SI->BytesRECV == 0)
      {
         SI->BytesRECV = BytesTransferred;
         SI->BytesSEND = 0;
      }
      else
      {
         SI->BytesSEND += BytesTransferred;
      }      if (SI->BytesRECV > SI->BytesSEND)
      {
         ZeroMemory(&(SI->Overlapped), sizeof(WSAOVERLAPPED));
         SI->Overlapped.hEvent = EventArray[Index - WSA_WAIT_EVENT_0];         SI->DataBuf.buf = SI->Buffer + SI->BytesSEND;
         SI->DataBuf.len = SI->BytesRECV - SI->BytesSEND;
         if (WSASend(SI->Socket, &(SI->DataBuf), 1, &SendBytes, 0, &(SI->Overlapped), NULL) == SOCKET_ERROR)
         {
            if (WSAGetLastError() != ERROR_IO_PENDING)
            {
               printf("WSASend() failed with error %d\n", WSAGetLastError());
               return 0;
            }
         }
         else
              printf("WSASend() is OK!\n");
      }
      else
      {
         SI->BytesRECV = 0;
         // Now that there are no more bytes to send post another WSARecv() request
         Flags = 0;
         ZeroMemory(&(SI->Overlapped), sizeof(WSAOVERLAPPED));
         SI->Overlapped.hEvent = EventArray[Index - WSA_WAIT_EVENT_0];
         SI->DataBuf.len = DATA_BUFSIZE;
         SI->DataBuf.buf = SI->Buffer;
         if (WSARecv(SI->Socket, &(SI->DataBuf), 1, &RecvBytes, &Flags, &(SI->Overlapped), NULL) == SOCKET_ERROR)
         {
            if (WSAGetLastError() != ERROR_IO_PENDING)
            {
               printf("WSARecv() failed with error %d\n", WSAGetLastError());
               return 0;
            }
         }
         else
             printf("WSARecv() is OK!\n");
      }
   }}其中这段代码的if条件想不明白:
 if ((Index - WSA_WAIT_EVENT_0) + 1 != EventTotal)
            for (i = Index - WSA_WAIT_EVENT_0; i < EventTotal; i++)
            {
               EventArray[i] = EventArray[i + 1];
               SocketArray[i] = SocketArray[i + 1];
            }
         EventTotal--;
为什么要Index - WSA_WAIT_EVENT_0) + 1 与累计连接量EventTotal进行判断呢? 
其中(Index - WSA_WAIT_EVENT_0) + 1 返回的可是在数组中的索引,怎么能和累计量EventTotal做比较?

解决方案 »

  1.   

    if ((Index - WSA_WAIT_EVENT_0) + 1 != EventTotal)应该是判断是不是数组的最后一个元素,即数组的最大下标。
      

  2.   

    就是说如果不是最后一个元素,就需要执行下的for循环了,将后面的部分元素前移。
    否者就不需要做前移部分元素的操作,直接到下一句EventTotal--;
      

  3.   

    例如数组有5个元素,假如每次都是第二,第三元素返回来数值;那么都会执行:if ((Index - WSA_WAIT_EVENT_0) + 1 != EventTotal)
    这又怎么解释?
      

  4.   

    我解释的还不够清楚?
    这个if语句就是为了保护下面的for语句中的
    EventArray[i] = EventArray[i + 1];
    SocketArray[i] = SocketArray[i + 1];
    这两句的数组下标不越界,明白?
    你想想一下如果i+1 == EventTotal会是怎样。你可以这样想一下,5个元素,数组有效范围是[0--4];如果第一次就是最后一个元素为signal状态
    那么这个if语句存在时有必要的,那么Index - WSA_WAIT_EVENT_0就是4,如果没有这个if语句,那么下面的for语句你就知道有什么问题?这个if语句就是为了保证后面的for语句中的下标操作不越界
    if ((Index - WSA_WAIT_EVENT_0) + 1 != EventTotal)
                for (i = Index - WSA_WAIT_EVENT_0; i < EventTotal; i++)
                {
                   EventArray[i] = EventArray[i + 1];
                   SocketArray[i] = SocketArray[i + 1];
                }