本帖最后由 VisualEleven 于 2011-04-26 11:36:39 编辑

解决方案 »

  1.   

    是不是 由于多次发送出现的原因啊?
    我才刚刚接触IOCP。。下面是一段IOCP的代码,英文注释你看看。。
     while (TRUE)
         {
           // 完成端口有消息来了 
            if  (GetQueuedCompletionStatus(CompletionPort,  & BytesTransferred,(LPDWORD) & PerHandleData, (LPOVERLAPPED  * )  & PerIoData, INFINITE)  ==   0 )
            {
              printf( " GetQueuedCompletionStatus failed with error %d\n " , GetLastError());
              return   0 ;

     
           // 是不是有人退出了 
     
           if  (BytesTransferred  ==   0 )
            {
             printf( " Closing socket %d\n " , PerHandleData -> Socket);          if  (closesocket(PerHandleData -> Socket)  ==  SOCKET_ERROR)
               {
                printf( " closesocket() failed with error %d\n " , WSAGetLastError());
                 return   0 ;
             } 
     
             GlobalFree(PerHandleData);
             GlobalFree(PerIoData);
              continue ;
          } 
     
           //
     
           if  (PerIoData -> BytesRECV  ==   0 )
           {
             PerIoData -> BytesRECV  =  BytesTransferred;
             PerIoData -> BytesSEND  =   0 ;
       } 
           else 
           {
             PerIoData -> BytesSEND  +=  BytesTransferred;
       } 
     
           if  (PerIoData -> BytesRECV  >  PerIoData -> BytesSEND)
           {          //  Post another WSASend() request.
              //  Since WSASend() is not gauranteed to send all of the bytes requested,
              //  continue posting WSASend() calls until all received bytes are sent. 
             ZeroMemory( & (PerIoData -> Overlapped),  sizeof (OVERLAPPED));
             PerIoData -> DataBuf.buf  =  PerIoData -> Buffer  +  PerIoData -> BytesSEND;
             PerIoData -> DataBuf.len  =  PerIoData -> BytesRECV  -  PerIoData -> BytesSEND;
              if  (WSASend(PerHandleData -> Socket,  & (PerIoData -> DataBuf),  1 ,  & SendBytes,  0 ,
                 & (PerIoData -> Overlapped), NULL)  ==  SOCKET_ERROR)
              {
                 if  (WSAGetLastError()  !=  ERROR_IO_PENDING)
                 {
                    printf( " WSASend() failed with error %d\n " , WSAGetLastError());
                    return   0 ;
     } 
      } 
       } 
           else 
            {
             PerIoData -> BytesRECV  =   0 ;          //  Now that there are no more bytes to send post another WSARecv() request. 
     
             Flags  =   0 ;
             ZeroMemory( & (PerIoData -> Overlapped),  sizeof (OVERLAPPED));         PerIoData -> DataBuf.len  =  DATA_BUFSIZE;
             PerIoData -> DataBuf.buf  =  PerIoData -> Buffer;          if  (WSARecv(PerHandleData -> Socket,  & (PerIoData -> DataBuf),  1 ,  & RecvBytes,  & Flags, & (PerIoData -> Overlapped), NULL)  ==  SOCKET_ERROR)
              {
                 if  (WSAGetLastError()  !=  ERROR_IO_PENDING)
                 {
                    printf( " WSARecv() failed with error %d\n " , WSAGetLastError());
                    return   0 ;
     } 
      } 
           } 
       } 
      

  2.   

    你的lpOverlapped关联的Overlapped关联的确定是发送,不是接收??
      

  3.   

    没有重复发送,Overlapped关联的是发送,不是接收
      

  4.   

    内存访问断点, 看谁改了m_wsabuf.len, 应该就知道怎么回事了