通过抓包工具可以看到数据包已发送到pc端,通过select调用也检测到有可读套接口,并用FD_ISSET判断出套接口确实有数据,然后调用recvfrom接收数据,确实接收到了32字节,但缓冲区里的内容确是全0.从抓包工具来看,头五个字节应该statu,请高手解答,谢谢!

解决方案 »

  1.   

    如果是udp的话,就在bind成功后,readfrom 阻在哪里可以了。tcp的话,也没有理由是全0啊。
    把代码贴出来 
    www.wantsoft.com 隐形者源码交流
      

  2.   

    HRESULT WINAPI RecieveData( unsigned char FAR* buf,int len)
    {
    int rnflag=0; //函数返回标志
    SOCKADDR recvAdd;
    int addLen=sizeof(SOCKADDR);
    char textBuff[64]={0,}; fd_set readfds; 
    struct timeval timeout;
    timeout.tv_sec=2;
    timeout.tv_usec=0;
    FD_ZERO(&readfds);
    FD_SET(g_VDS,&readfds);// EnterCriticalSection(&m_cs);
    int iRet = select(g_VDS+1, &readfds, NULL, NULL, &timeout);
    if(iRet > 0)
    {
    #if !GOSCAM_MODIFY
    rnflag=recvfrom(g_VDS,(char *)buf,len,0,NULL,NULL);
    #else
    rnflag=recvfrom(g_VDS,(char *)buf,len,0,&recvAdd,&addLen);
    #endif
    /*if (rnflag <=0 )
    {
    CloseNetLink();  CreateNetLink(m_serverAddr, m_bServerPort, m_bLocalPort, m_bType);
    } */
    }
       /* else
    {
     //if (WSAGetLastError() == WSAENETDOWN)
     {
     CloseNetLink();  CreateNetLink(m_serverAddr, m_bServerPort, m_bLocalPort, m_bType);
     }
    }  */// LeaveCriticalSection(&m_cs); return rnflag;
    }
      

  3.   

    在另一个函数内g_VDS = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
    这种代码是没问题的
      

  4.   

    你的整个socket初始化代码贴出来看看
      

  5.   

    setsockopt(g_VDS,SOL_SOCKET,SO_RCVBUF,(const char *)&iMaxBufLength,sizeof(iMaxBufLength));
    就这些没有了,我这边是客户端,连接服务端,不是每次都收不到,有时候可以
      

  6.   

    检查一下这个宏GOSCAM_MODIFY是否定已定义!
    debug时加入输出语句。#if !GOSCAM_MODIFY
    rnflag=recvfrom(g_VDS,(char *)buf,len,0,NULL,NULL);
    #else
    rnflag=recvfrom(g_VDS,(char *)buf,len,0,&recvAdd,&addLen);
    #endif 
      

  7.   

    单看函数RecieveData应该没问题,你单步调试一下,在recvfrom函数后,看看buf里的数据。