以前在写吵吵登陆器的时候仔细的研究过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
如无特别说明,本博客文章皆为原创。转载请说明,来自吵吵博客。
原文链接:http://chaochaoblog.com/archives/655
吵吵微信朋友圈,请付款实名加入:
看帖就要回帖
winpcap是啥?
吵吵 我看不大明白啊
没看明白
协议方面的东西不是很懂,大学学的时候就不是很懂,现在依然……
了解,不错的分享!
这个工具好像可以限制内网某台机器上网!
呵呵,精彩
有一代码族。
代码盲
老朽更看不明白,
全部看下去了,最后还是不懂
技术狂人啊!
先混个脸熟,挺别致的。
呵呵
________________________
独立博客主|群号:85303708
欢迎博主入群,一起说说博客话。