python基础教程之获取本机ip数据包示例


Posted in Python onFebruary 10, 2014

这几天用到了raw socket,用python写了些demo程序,这里记录下。

首先我们看一个简单的sniffer程序:

#! /usr/bin/python
# code for linux
import socket
#s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
    print s.recvfrom(65535)

这里直接用raw socket接收数据,直接print操作。这个就几行代码,也没什么好解释的了,不懂的google下。

得到IP数据包后,接下来的工作就是对IP头进行解析,在这之前,我们先看看RFC中是怎么定义的(RFC791 : http://www.ietf.org/rfc/rfc791.txt ):

python基础教程之获取本机ip数据包示例

即对应的图:

python基础教程之获取本机ip数据包示例

从RFC和上图中可以看到IP数据包头各个字段所占的位数,我们可以根据这些定义去解析IP数据包头,然后根据相应的策略处理数据。
这里给出一段用python实现的解析IP头的代码(呵呵,是demo中的代码,只解析了前20个字节):

def decodeIpHeader(packet):
        mapRet = {}
        mapRet["version"] = (int(ord(packet[0])) & 0xF0)>>4
        mapRet["headerLen"] = (int(ord(packet[0])) & 0x0F)<<2
        mapRet["serviceType"] = hex(int(ord(packet[1])))
        mapRet["totalLen"] = (int(ord(packet[2])<<8))+(int(ord(packet[3])))
        mapRet["identification"] = (int( ord(packet[4])>>8 )) + (int( ord(packet[5])))
        mapRet["id"] = int(ord(packet[6]) & 0xE0)>>5
        mapRet["fragOff"] = int(ord(packet[6]) & 0x1F)<<8 + int(ord(packet[7]))
        mapRet["ttl"] = int(ord(packet[8]))
        mapRet["protocol"] = int(ord(packet[9]))
        mapRet["checkSum"] = int(ord(packet[10])<<8)+int(ord(packet[11]))
        mapRet["srcaddr"] = "%d.%d.%d.%d" % (int(ord(packet[12])),int(ord(packet[13])),int(ord(packet[14])), int(ord(packet[15])))
        mapRet["dstaddr"] = "%d.%d.%d.%d" % (int(ord(packet[16])),int(ord(packet[17])),int(ord(packet[18])), int(ord(packet[19])))
        return mapRet

调用代码:

proto = socket.getprotobyname('tcp') # only tcp
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, proto)
while True:
        packet = sock.recvfrom(65535)[0]
        if len(packet) == 0:
                sck.close()
        else:
                #print str(packet)
                mapIpTmp = decodeIpHeader(packet)
                for k,v in mapIpTmp.items():
                        print k,"\t:\t",v
        print ""
Python 相关文章推荐
python 合并文件的具体实例
Aug 08 Python
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
Dec 03 Python
Python 3.x 新特性及10大变化
Jun 12 Python
Python实现自动发送邮件功能
Mar 02 Python
对python 矩阵转置transpose的实例讲解
Apr 17 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
golang特有程序结构入门教程
Jun 02 Python
 python中的元类metaclass详情
May 30 Python
python基础教程之udp端口扫描
Feb 10 #Python
python网页请求urllib2模块简单封装代码
Feb 07 #Python
python解析xml模块封装代码
Feb 07 #Python
python 解析XML python模块xml.dom解析xml实例代码
Feb 07 #Python
python合并文本文件示例
Feb 07 #Python
python实现哈希表
Feb 07 #Python
python处理cookie详解
Feb 07 #Python
You might like
php adodb操作mysql数据库
2009/03/19 PHP
php事件驱动化设计详解
2016/11/10 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
可输入的下拉框
2006/06/19 Javascript
JavaScript脚本性能的优化方法
2007/02/02 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
理解javascript定时器中的setTimeout与setInterval
2016/02/23 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
python打开网页和暂停实例
2014/09/30 Python
零基础写python爬虫之神器正则表达式
2014/11/06 Python
Pyqt5自适应布局实例
2019/12/13 Python
python 类之间的参数传递方式
2019/12/20 Python
python的json包位置及用法总结
2020/06/21 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
Radley英国官网:英国莱德利小狗包
2019/03/21 全球购物
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
UNIX特点都有哪些
2016/04/05 面试题
自我评价范文分享
2014/01/04 职场文书
项目合作协议书范本
2014/04/16 职场文书
工商管理专业毕业生自我鉴定2014
2014/10/04 职场文书
速龙x4-860k处理器相当于i几
2022/04/20 数码科技
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS
Go语言怎么使用变长参数函数
2022/07/15 Golang