我拦截迅雷的WSARecv后,,, 迅雷就出错了,自动退出,,而且nReturn =WSARecv(返回的是-1;
怎么解决这个问题呢?
int WINAPI MyWSARecv(
SOCKET s, 
LPWSABUF lpBuffers,
    DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
    LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
    LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine 
)
{    int nReturn;
    HookOffOne(&WSARecvapi);
   nReturn =WSARecv(s, lpBuffers, dwBufferCount,lpNumberOfBytesRecvd,lpFlags,lpOverlapped,lpCompletionRoutine);
//Sleep(su);
//len1=nReturn;
    HookOnOne(&WSARecvapi);    char *tmpbuf=new char[*lpNumberOfBytesRecvd+100];
    memset(tmpbuf, 0, sizeof(tmpbuf));
    sprintf(tmpbuf, "WSASend|%d|%d|%s",
            GetCurrentProcessId(),
            lpNumberOfBytesRecvd,
            lpBuffers->buf);
   sndmsg(tmpbuf);
    delete tmpbuf;
    return(nReturn);   
}

解决方案 »

  1.   

    你想查迅雷的数据传送速度,写个socks5代理,在本机启用,直接将迅雷经过代理,让代理帮你统计还省事.
      

  2.   

     我拦截WSARecv  得到的lpNumberOfBytesRecvd 是几个亿甚至几十亿,,,该怎么办?
      

  3.   

    下面返回的是-1,,,,如何解决?nReturn =WSARecv(s, lpBuffers, dwBufferCount,lpNumberOfBytesRecvd,lpFlags,lpOverlapped,lpCompletionRoutine);
      

  4.   

    异步接收返回-1是很正常的,需要进一步用GetLastError来判断,决定下面的处理。
      

  5.   

    int WINAPI MyWSARecv(
     SOCKET s, 
     LPWSABUF lpBuffers,
     DWORD dwBufferCount,
     LPDWORD lpNumberOfBytesRecvd,
     LPDWORD lpFlags,
     LPWSAOVERLAPPED lpOverlapped,
     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine 
     )
    {

        int nReturn;
        HookOffOne(&WSARecvapi); //Sleep(su);
    nReturn =WSARecv(s, lpBuffers, dwBufferCount,
    lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine);
    if(nReturn == SOCKET_ERROR)
    {
    if(WSAGetLastError() != WSA_IO_PENDING)
    return nReturn; if(!WSAGetOverlappedResult(s, lpOverlapped, lpNumberOfBytesRecvd, TRUE, lpFlags))
    return SOCKET_ERROR;
    }

    len1=nReturn;
        HookOnOne(&WSARecvapi);

    /* char *tmpbuf=new char[*lpNumberOfBytesRecvd+100];
        memset(tmpbuf, 0, sizeof(tmpbuf));
        sprintf(tmpbuf, "WSASend|%d|%d|%s",
    GetCurrentProcessId(),
    lpNumberOfBytesRecvd,
    lpBuffers->buf);
    sndmsg(tmpbuf);
        delete tmpbuf;*/
        return(nReturn);   
    }