result = recv(pinfo->sockethandle, get_data_buf, RECVDATABUFLEN, 0);
可是result的值却同我用sniffer抓取到的数据长度不相符合 不如说result = 2561 而sniffer抓取返回的数据长度却是1024 所有的result值都要比sniffer抓取的值大很多,接收到的数据包前面部分的数据也是对的,请问这是什么原因我用同样的代码 但有时result返回的值 就同sniffer抓取的值完全一致,

解决方案 »

  1.   

    sniffer获取的是全部TCP/IP报文和报头, recv只过滤出报文...
      

  2.   

    我去掉了sniffer的抱头了,我算的是有效数据
      

  3.   

    recv是TCP,流式的,你可以设置一次只收10byte,也可以收1024,都没关系,设个while,全收齐就行了。估计sniffer也是这么干的。如果想接收纯数据,应该自己写一个recv,替换掉系统的再来测试一下。用驱动或hook来实现。争取在sniffer之前就能读到数据
      

  4.   

    你这个缓冲区RECVDATABUFLEN长度有多大?sniffer一般是真个tcp包抓取的,一次可抓最大的tcp包64k,如果你的RECVDATABUFLEN这个长度小于64k,当然没有sniffer抓的大了,你可以把RECVDATABUFLEN定义的超过64k,就没有这个问题了
      

  5.   

    我的buff是32k
        
      

  6.   

     那就是你的缓冲太小,你要至少2次recv才能收完tcp的一个包,但对于sniffer这样的软件是一个完整的包收的,对于上面那些说sniffer使用多次小缓冲的接受数据,其实大错特错的,哪个sniffer程序是这样写的,要知道你是监听,既然是监听就是旁观者,旁观者,就不能打断正常的tcp包,事想如果sniffer用小缓冲接,他又不能打断tcp流,他能监听到完整的数据吗?