资源下载地址:https://download.csdn.net/download/sheziqiong/85651565

开发过程文档-DHT 嗅探器

运行及测试

参数设置:

# 线程数
THREAD_NUMBER = 3
# 线程持续时间SLEEP_TIME2 = 60*10

可正常运行,并生成相应 HASH.log 文件。

问题与解决

问题-1:参考的代码为数据库方式保存数据,不论是 MySQL 还是 Redis 等数据库都需要额外配置与安装,不方便。

解决:采用 log 模块,考虑到实际上长期保存 node 并不合适,同时数据库也不便于老师检阅,采用简单方便易管理的 log 更符合需求,具体实现如下:

stdger = logging.getLogger("std_log")   2. fileger = logging.getLogger("file_log")3.def initialLog():stdLogLevel = logging.DEBUGfileLogLevel = logging.DEBUGformatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')stdout_handler = logging.StreamHandler()stdout_handler.setFormatter(formatter)file_handler = logging.FileHandler("HASH.log")file_handler.setFormatter(formatter)logging.getLogger("file_log").setLevel(fileLogLevel)logging.getLogger("file_log").addHandler(file_handler)logging.getLogger("std_log").setLevel(stdLogLevel)logging.getLogger("std_log").addHandler(stdout_handler)

问 题 -2 : Becoding 编 码 的 库 选 取 from bencode import

bencode,bdecode,BTL,报错解决:采用 import bencoder

问题-3:导入 bencoder 库后,bencode 与 bdecode 仍提示报错

解决:导包时要导 pip install bencoder.pyx 下的 bencoder

问题-4:单独定义路由表

class KTable(): def __init__(self): self.nodes = deque(maxlen=MAX_NODE_QSIZE) 

在 DHT 里引用时报错

解决:将其改为 DHT 里的 self.nodes

问题-5:进程开始后,嗅探一直没有结果,尝试加减线程调整网络环境无果 解决:发现问题在于

中 time.sleep(SLEEP_TIME)处在前文参数设置中为 SLEEP_TIME = 60*10 与后面的线程持续时间重名,遂改为 SLEEP_TIME1 = 1e-5 即 0.00001 秒加以区分。

def receive_response_forever(self): self.bootstrap() while self.isWorking: try: data, address = self.udp.recvfrom(UDP_RECV_BUFFSIZE) msg = bencoder.bdecode(data) self.on_message(msg, address) time.sleep(SLEEP_TIME) except Exception: pass

问题-6:当线程持续时间 SLEEP_TIME2 = 20,无结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05FZ5wgQ-1655290816148)(https://www.writebug.com/myres/static/uploads/2022/6/9/0181b1326d61dfced3ce6e5dd1ba6a04.writebug)]

解决:线程持续时间太短,经尝试 1min 以上可以保证获取 infohash。

问题-7:如何保证速度,是否可以提升速度? 解决:采用了多线程的方式,更快更高效,具体实现如下

class DHT(Thread):
def __init__(self, bind_ip, bind_port, process_id, master):
Thread.__init__(self)
self.isWorking = True
self.sfnf_thread = Thread(target=self.send_find_node_forever)
self.rrf_thread = Thread(target=self.receive_response_forever)
self.bst_thread = Thread(target=self.bs_timer)
self.master = master
def start(self): self.sfnf_thread.start() self.rrf_thread.start() self.bst_thread.start() Thread.start(self) return self def stop(self): self.isWorking = False if __name__ == "__main__": initialLog() threads = [] for i in range(THREAD_NUMBER): port = i + SERVER_PORT stdger.debug("start thread %d with port %d" % (i, port)) dht=DHT(SERVER_HOST, port, "thread-%d" % i, Master()) dht.start() threads.append(dht) sleep(1) sleep(SLEEP_TIME2) k = 0 for i in threads: stdger.debug("stop thread %d" % k) i.stop() i.join() k=k+1 

其他-2:在优化上有没有更好的思路?

答:如果说最原始的嗅探器是单线程的,那么多线程与异步可以对其进行优化。异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。在我的作业中我采用了多线程并成功实现了提速,但可惜的是在尝试使用异步时出现了错误,完全仿照他人的代码也无法正常获取 infohash。对于 Python 来说不像 JS 天然带有异步,需要额外的模块辅助,如 asyncio、Twisted、Gevent。在 https://github.com/whtsky/maga 采 用 的 就 是 asyncio , 在

https://github.com/wuzhenda/simDHT 则采用了 twisted。但是,由于 Twisted、

Gevent 实际上是 Python 2 时代的产物,且太重回调太多,基于的协程的 asyncio 在 Python 3.4 被引入到标准库后已经不太适用 Python3 时代了。在我的个人尝试中可能也是由于 Python3 与 Gevent 和 Twisted 不兼容所导致的失败。

其他-3:获取的 infohash 并非是可用的,原因? 答:在说明文档中提到,get_peers 和 announce_peer 请求包含了所需的 infohash 信息,我们也是通过 get_peers 和 announce_peer 来获取 infohash。但是, get_peers 中包含的 infohash 对应的种子可能已经失效或者难连接上,事实上此时对方也是在查找对应 infohash 的种子文件,这里获取的 infohash 质量较差。当收到 announce_peer 消息时,这里携带的 infohash 的质量更高,因为它表示控制该节点的下载者开始下载资源了,当前对方正在指定端口下载该种子文件的 metadata 信息。

其他-4:如何利用 infohash 真正意义上的下载资源?

答:只要找到一个种子的下载者(peer)就可以使用 BEP-9: Extension for Peers to

Send Metadata Files 拓展协议从该下载者(peer)处下载种子元信息(info),同样可以使用元信息(metadata)的 infohash 来验证该信息的真实性,当然也可以从它那下载资源。
质量较差。当收到 announce_peer 消息时,这里携带的 infohash 的质量更高,因为它表示控制该节点的下载者开始下载资源了,当前对方正在指定端口下载该种子文件的 metadata 信息。

其他-4:如何利用 infohash 真正意义上的下载资源?

答:只要找到一个种子的下载者(peer)就可以使用 BEP-9: Extension for Peers to

Send Metadata Files 拓展协议从该下载者(peer)处下载种子元信息(info),同样可以使用元信息(metadata)的 infohash 来验证该信息的真实性,当然也可以从它那下载资源。

资源下载地址:https://download.csdn.net/download/sheziqiong/85651565

基于Python实现的DHT嗅探器相关推荐

  1. 基于Python实现的网络嗅探器【100010784】

    基于C语言的网络嗅探器 一.引言 1.1 编写目的 通过编写网络嗅探器,可以提高编程能力,加深对网络协议的理解,培养团队协作能力,完成课程项目 二.功能概述 2.1 节 功能模块命名原则 使用英文进行 ...

  2. python调用libpcap_libPcap(基于C)接受基于Python的Socket程序 - python

    亲爱的大家: 我使用基于python的套接字客户端发送字符串数据(即日志数据). 另一方面,我使用libpcap嗅探服务器端的字符串数据. 但是,当我第二次将字符串数据发送到服务器端时,在客户端出现了 ...

  3. 【CV】OpenCV(基于Python)学习笔记

    以下内容中的页码均来自<OpenCV 4详解 : 基于Python> 目录 第2章 载入.显示与保存数据 2.2 图像的读取与显示 2.2.1 图像读取函数 cv.imread() 2.2 ...

  4. 基于Python的人工智能美颜系统

    基于Python的人工智能美颜系统使用PyQt5模块搭建可视化界面,使用Dlib模型(shape_predictor_68_face_landmarks.dat)实现人脸关键点检测和定位,人脸美颜(美 ...

  5. python深度神经网络量化_基于Python建立深度神经网络!你学会了嘛?

    原标题:基于Python建立深度神经网络!你学会了嘛? 图1 神经网络构造的例子(符号说明:上标[l]表示与第l层:上标(i)表示第i个例子:下标i表示矢量第i项) 单层神经网络 图2 单层神经网络示 ...

  6. python selenium脚本_怎样开始写第一个基于python的selenium脚本

    1.下载并安装python(http://www.python.org/geti/). 2.安装selenium(http://pypi.python.org/pypi/selenium)下载并解压缩 ...

  7. 【组队学习】【31期】基于Python的办公自动化

    基于Python的办公自动化 航路开辟者:牧小熊.刘雯静.张晓东.吴争光.隆军 领航员:六一 航海士:牧小熊.李显.刘羽中.王晓亮 基本信息 开源内容:https://github.com/dataw ...

  8. 【组队学习】曹志宾:基于Python的会员数据化运营

    分享人:曹志宾,Datawhale成员,香港科技大学硕士在读 分享内容: 案例描述与分析 前期准备与数据预处理 RFM模型使用与操作 Excel中的RFM分析 组队学习: 红星:基于Python的会员 ...

  9. 【组队学习】孙健坤:基于Python的会员数据化运营

    分享人:孙健坤,哈尔滨工业大学 分享内容: 什么是会员制? 什么是会员数据化运营? 如何进行会员数据化运营 组队学习: 基于Python的会员数据化运营 开源内容: https://github.co ...

  10. 【组队学习】【28期】基于Python的会员数据化运营

    基于Python的会员数据化运营 论坛版块: http://datawhale.club/c/team-learning/37-category/37 开源内容: https://github.com ...

最新文章

  1. cookie关键字_我遇过的最难的Cookie问题
  2. 【CentOS Linux 7】实验5【Samba服务器管理】
  3. 百老汇原版音乐剧《摇滚学校》2月开启中国巡演
  4. 网络知识:秒懂你家的网络连接方式
  5. detectron2训练自己的数据集_keras版MaskRCNN来训练自己的目标检测数据集
  6. Linux 命令之 env -- 显示系统的环境变量,定义执行命令时的环境变量
  7. layout_gravity 和 gravity
  8. 时尚电商新赛道:揭秘 FashionAI 技术
  9. 第三章 垃圾回收的一些概念
  10. 【EJB学习笔记】——EJB开发环境搭建(Eclipse集成JBoss)
  11. ARM920T及其MMU,Cache学习杂记(一)
  12. 【对比Java学Kotlin】类型别名
  13. 手机QQ怎么使用群签到
  14. MiniGUI 特性说明
  15. 小学生获奖作品html,小学生优秀绘画作品图片展示
  16. oracle数据库课程描述,《ORACLE数据库简介》课件.ppt
  17. 坚果nuts 加速 官网_5G坚果旗舰手机R2发布售价4499元起 搭载全新Smartisan OS 8.0操作系统...
  18. ZYNQ-AX7020学习笔记
  19. “200+语种,11种文档格式”,百度文档翻译API,真的很好用
  20. 中国幼儿教育市场运营模式与未来发展方向分析报告2022版

热门文章

  1. phpexcel 日期 时分秒_PHPExcel对于Excel中日期和时间类型的处理
  2. acer软件保护卡怎么解除_外观精致性能强,配置丰富重量轻、宏碁(Acer)墨舞EX214轻薄笔记本 深度评测...
  3. Https如何做到通信安全
  4. 【系列三之CentOS系列】CentOS命令操作(1)
  5. iOS:懒加载符号绑定流程
  6. sem_timedwait的用法
  7. WPF换肤之三:WPF中的WndProc
  8. 业务逻辑配置化的可选技术方案
  9. 文件压缩——哈夫曼树编码2.0
  10. 贴一篇以前写的产品推广旧文