WSARecv()是异步操作,函数返回的时候,网络数据还不在缓冲区里。操作结束的时候钩子函数又没有执行。要怎么做才能得到函数所请求的数据呢?

解决方案 »

  1.   

    2、使用WSASend或WSARecv投递相应的发送或接收请求后,始终没有收到相应的GET函数完成返回通知?
    原因:出现此问题的原因,绝大多数是因为函数参数没有进行正确的赋值。
    解决方法:在执行wsasend和wsarecv操作前,请先将overlapped结构体使用memset进行清零。一个正确的调用格式如下:
    [发送操作]
      DWORD ByteSend=0;
      DWORD Flags=0;
      int tmpResult=0;
         ......
     PPerHandleData tmpData;
     ......
     memset(&(tmpData->Overlapped), '\0', sizeof(OVERLAPPED));//将overlapped结构清空
     tmpData->Statu = ssSend;
        tmpResult = WSASend(tmpData->socket, &(tmpData->WSASendBuffer), 1,
       &ByteSend,
       Flags,
       &(tmpData->Overlapped),
       NULL);[接收操作]
      DWORD byteRecv=0;
      DWORD Flags=0;
      int tmpResult=0;
      ......
      PPerHandleData myHandlData; 
      ...... 
      memset(&(myHandlData->Overlapped), '\0', sizeof(OVERLAPPED));
      memset(myHandlData->RecvBuffer, '\0', CLIENT_BUFFER_SIZE);
      myHandlData->WSARecvBuffer.buf = myHandlData->RecvBuffer;
      myHandlData->WSARecvBuffer.len = CLIENT_BUFFER_SIZE;
      myHandlData->socket = myClient->m_ClientSocket;
      myHandlData->Statu = ssRecv;  tmpResult = WSARecv(myHandlData->socket, &(myHandlData->WSARecvBuffer), 1, (LPDWORD)&byteRecv, (LPDWORD)&Flags, (LPWSAOVERLAPPED)&(myHandlData->Overlapped), 0);
    3、当投递了一个WSARecv或WSASend请求后,总是返回“ERROR_IO_PENDING”错误?
    原因:“ERROR_IO_PENDING”,表示的是WSARecv或WSASend操作正在执行中,还没有执行完毕。
    解决方法:此错误可以直接忽略,如果参数设置正确,当操作完成时,系统会通过GET函数返回执行的形式来通知发送或接收操作已经完成。
      

  2.   

    jixingzhong(瞌睡虫) 
    我的意思不是使用这个函数,而是怎么正确地hook这个函数。
      

  3.   

    这不需要钩子,你只需要调用WaitForMultipleObjects或GetQueuedCompletionStatus,那么当某个发送或接收操作完成时,系统会通知你。
      

  4.   

    你先用全局钩子得到winsock.dll里面的对应函数,然后替换就可以了。。
      

  5.   

    帮你顶!你的问题解决的了吗。我也遇到同样的问题了。,SARecv函数返回WSAWOULDBLOCK错误,对吧?给个联系方式吧?咱们交流一下