《Python编程入门与实践(微视频版)》代码 例11-4 网络嗅探器程序示例_第1页
《Python编程入门与实践(微视频版)》代码 例11-4 网络嗅探器程序示例_第2页
《Python编程入门与实践(微视频版)》代码 例11-4 网络嗅探器程序示例_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

例11-4网络嗅探器程序示例例11-4网络嗅探器程序示例本例为网络嗅探器程序示例(以下代码将在运行60秒后,输出本机所在局域网内非本机发出的数据包,并统计来自不同主机的数据包数量。有关多线程的详细信息,请参本书相关章节的介绍)。#coding=gbkimportsocketimportthreadingimporttimeactive_degree=dict()flag=1lock=threading.Lock()#添加线程锁defmain():globalactive_degreeglobalflagHOST=socket.gethostbyname(socket.gethostname())s=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP)s.bind((HOST,0))s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)s.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)try:whileflag:c=s.recvfrom(65565)host=c[1][0]withlock:#使用线程锁保护对共享资源的访问active_degree[host]=active_degree.get(host,0)+1ifhost!='10.2.1.8':#假设的当前主机IPprint(c)finally:#确保在退出时禁用混杂模式并关闭套接字s.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)s.close()t=threading.Thread(target=main)t.start()time.sleep(60)flag=0t.join()foriteminactive_degree.items():print(item)代码解释:(1)导入模块importsocketimportthreadingimporttime导入所需的模块:socket:用于网络通信。threading:用于多线程操作。time:用于时间相关的操作。(2)定义全局变量active_degree=dict()flag=1lock=threading.Lock()active_degree:一个字典,用于存储每个源IP地址的活跃度(即捕获到的数据包数量)。flag:一个全局标志,用于控制主循环的运行状态。lock:一个线程锁,用于保护对共享资源(active_degree字典)的访问,避免多线程环境下的数据竞争问题。(3)定义主函数defmain():globalactive_degreeglobalflag定义主函数main,并声明使用全局变量active_degree和flag。(4)获取本地主机名和IP地址HOST=socket.gethostbyname(socket.gethostname())使用socket.gethostname()获取本地主机名,然后通过socket.gethostbyname()将其转换为IP地址。(5)创建原始套接字s=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP)s.bind((HOST,0))s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)s.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)创建一个原始套接字(socket.SOCK_RAW),用于捕获所有经过本地网络接口的IP数据包。将套接字绑定到本地主机的IP地址和端口0。设置套接字选项IP_HDRINCL,表示IP头包含在数据包中。使用ioctl启用混杂模式(RCVALL_ON),使套接字能够捕获所有经过网络接口的数据包。(6)数据包捕获和处理try:whileflag:c=s.recvfrom(65565)host=c[1][0]withlock:active_degree[host]=active_degree.get(host,0)+1ifhost!='10.2.1.8':#假设的当前主机IPprint(c)finally:s.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)s.close()使用try...finally结构确保在程序退出时能够正确关闭套接字并禁用混杂模式。在whileflag循环中,持续捕获数据包:使用recvfrom方法接收数据包,最大长度为65565字节。提取数据包的源IP地址(host)。使用线程锁(withlock)保护对active_degree字典的访问,避免多线程环境下的数据竞争。更新active_degree字典中对应IP地址的活跃度计数。如果源IP地址不是本地主机的IP地址(假设为10.2.1.8),则打印捕获的数据包内容。(7)创建并启动线程t=threading.Thread(target=main)t.start()time.sleep(60)flag=0t.join()创建一个线程t,目标函数为main。启动线程start()。等待60秒(time.sleep(6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论