吵吵   2011-08-27  阅读:4,943

以前在写吵吵登陆器的时候仔细的研究过ip/tcp协议和udp协议。最近突然要用到udp协议就回去看了看,想到这部分代码比较有用,能够区分内外网的流量,并进行实时的网速统计和最终的流量统计,故拿了出来分享一下。

原先写这段代码的时候是改了多次的,区分内外网流量大概的方法如下:
1、原先我止痛剂tcp的包,认为udp的包都是内网的,但是看了腾讯之后才知道腾讯用的是没有保证的udp协议…….
2、取出ip的第一个八位出来验证是不是192和172,如此一来判断上传和下载包后还需要有两个变量的判断,相当麻烦。
3、直接先取得本机电脑的ip地址,那么只要判断数据包中有没有这个ip,不管上传还是下载,另外一个ip只需要判断是内网还是外网的了。
区分和统计内外网流量代码如下:

//start of flow
if(bBeginFlow)
{
if (pkt_data[12]==0x08 && pkt_data[13]==0x00)
{

//bof tcp

if (pkt_data[23]==0x06)
{

iLong[0]=pkt_data[17];
iLong[1]=pkt_data[16];
packLong=*(int*)iLong;

switch(pkt_data[46])
{
case 0x50:
packHeadLong=20;
break;
case 0xb0:
packHeadLong=44;
break;

}
//本机发送包

if(pkt_data[26]==ipAdrress[0] && pkt_data[27]==ipAdrress[1] && pkt_data[28]==ipAdrress[2] && pkt_data[29]==ipAdrress[3] )
{

if((pkt_data[30] == 0xc0 && pkt_data[31] == 0xa8) || (pkt_data[30] == 0xac && (pkt_data[31] >= 0x10 && pkt_data[31] <=0x1f)) || pkt_data[30] == 0x0a) { inNetByte=inNetByte+packLong-packHeadLong-20; } else { outNetByte=outNetByte+packLong-packHeadLong-20; } } //本机接收包 if(pkt_data[30]==ipAdrress[0] && pkt_data[31]==ipAdrress[1] && pkt_data[32]==ipAdrress[2] && pkt_data[33]==ipAdrress[3]) { if((pkt_data[26] == 0xc0 && pkt_data[27] == 0xa8) || (pkt_data[26] == 0xac && (pkt_data[27] >= 0x10 && pkt_data[27] <=0x1f)) || pkt_data[26] == 0x0a) { inNetByte=inNetByte+packLong-packHeadLong-20; } else { outNetByte=outNetByte+packLong-packHeadLong-20; } } } //eof tcp //bof udp if (pkt_data[23]==0x11) { iLong[0]=pkt_data[17]; iLong[1]=pkt_data[16]; packLong=*(int*)iLong; //本机发送包 if(pkt_data[26]==ipAdrress[0] && pkt_data[27]==ipAdrress[1] && pkt_data[28]==ipAdrress[2] && pkt_data[29]==ipAdrress[3] ) { if((pkt_data[30] == 0xc0 && pkt_data[31] == 0xa8) || (pkt_data[30] == 0xac && (pkt_data[31] >= 0x10 && pkt_data[31] <=0x1f)) || pkt_data[30] == 0x0a || pkt_data[30]==0xff) { inNetByte=inNetByte+packLong-28; } else { outNetByte=outNetByte+packLong-28; } } //本机接收包 if(pkt_data[30]==ipAdrress[0] && pkt_data[31]==ipAdrress[1] && pkt_data[32]==ipAdrress[2] && pkt_data[33]==ipAdrress[3]) { if((pkt_data[26] == 0xc0 && pkt_data[27] == 0xa8) || (pkt_data[26] == 0xac && (pkt_data[27] >= 0x10 && pkt_data[27] <=0x1f)) || pkt_data[26] == 0x0a || pkt_data[26]==0xff) { inNetByte=inNetByte+packLong-28; } else { outNetByte=outNetByte+packLong-28; } } if(pkt_data[30]==0xff && pkt_data[31]==0xff && pkt_data[32]==0xff && pkt_data[33]==0xff) { inNetByte=inNetByte+packLong-28; } } //eof udp } //end of flow

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

14条回应:“winpcap实现内外网流量统计”

  1. 牙齿松动说道:

    看帖就要回帖

  2. 卢松松说道:

    winpcap是啥?

  3. 混小子博客说道:

    吵吵 我看不大明白啊

  4. 一阵风说道:

    没看明白

  5. 魏星博客说道:

    协议方面的东西不是很懂,大学学的时候就不是很懂,现在依然……

  6. 七七说道:

    了解,不错的分享!

  7. 流氓兔足迹说道:

    这个工具好像可以限制内网某台机器上网!

  8. 西安seo说道:

    呵呵,精彩

  9. 郑永说道:

    有一代码族。

  10. 海棠果说道:

    代码盲

  11. 地球博客说道:

    老朽更看不明白,

  12. 东莞回收锡说道:

    全部看下去了,最后还是不懂

  13. 技术狂人啊!

  14. 第七博客说道:

    先混个脸熟,挺别致的。
    呵呵
    ________________________

    独立博客主|群号:85303708
    欢迎博主入群,一起说说博客话。

发表评论

电子邮件地址不会被公开。 必填项已用*标注