程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [搜片神器]之DHT網絡爬蟲的代碼實現方法

[搜片神器]之DHT網絡爬蟲的代碼實現方法

編輯:C++入門知識

 

繼續接著第一篇寫:使用C#實現DHT磁力搜索的BT種子後端管理程序+數據庫設計(開源)[搜片神器]

 謝謝園子朋友的支持,已經找到個VPS進行測試,國外的服務器: h31bt.com 大家可以給提點意見...

開源地址:https://github.com/h31h31/H31DHTMgr

程序下載:H31DHT下載

 

看大家對昨天此類文章的興趣沒有第一篇高,今天就簡單的對支持的朋友進行交流.園子裡的朋友希望授大家以漁,所以這部分代碼就先不放出來.希望大家更多的加入進來.

也希望誰有能力將C++的代碼轉換成C#的,添加到我們的搜片神器工具裡面.

昨天通過向大家介紹DHT的工作原理,相信大家大概明白怎麼回事,不明白的朋友可以繼續分享接下來的文章.

 本人借鑒的代碼是C++版本的:transmission裡面的DHT代碼,大家可以訪問網站下載:http://www.transmissionbt.com/ 

不過裡面的代碼環境是LINUX下的,需要自己轉換到相應的WIN平台上來.

有興趣使用C#來完成DHT功能的朋友可以借鑒mono-monotorrent,裡面的框架代碼比較多,不如C++的transmission裡面就三個文件來得明白.

transmission裡面只有三個文件就可以實現dht的功能: dht.c dht.h dht-example.c,並且接口很簡單,復用性很好。




dht.c dht.h代碼分成三部分:
1、路由表的插入操作。
1)如果節點已經在路由表中,則更新節點,返回。
2)如果桶沒有滿,則插入,返回。
3)如果發現失效節點,替換,返回。
4)發現可疑節點,則保存新節點到緩存中並且如果該可疑節點沒有ping,發出ping_node操作,返回。
5)現在,桶已經充滿了好的節點,如果自己的ID沒有落在這個桶中,返回。
6)將桶空間分成兩半。跳到步驟1)。

2、KAD遠程處理調用。
這部分又分成3種,
1)ping/pong操作。
所有的包的tid都使用pg\0\0
2)find_node操作。
所有的包的tid都使用fn\0\0
3)get_peers/annouce_peer操作。
對同一個HASH的一次遞歸查詢中,tid保持不變。
其中只有3)種實現bittorrent的DHT規范裡面提到的遞歸查詢操作,1)和2)僅僅用來維護路由表,並且不保存狀態。

3、定時器處理:
為了檢測路由表中節點的有效性(根據規范,路由表中應該只保存有效節點),在代碼中,在執行krpc操作時如果發現時對路由表中的節點操作,那麼則保存操作的開始時間 pinged_time,通過操作的開始時間來判斷操作是否超時。

expire_stuff_time 超時時,會執行下面的操作:
1、檢查路由表中失效的節點(根據pinged_time來判定),並將該節點刪除。
2、檢查用來保存annoounce_peer的節點是否超過30分鐘(這個不打算深入討論,故不做解析)。
3、檢查遞歸查詢操作超時。

rotate_secrets_time 定時器。
用來每隔大約15分左右就更換token(見DHT規范).

confirm_nodes_time 定時器。
查找長期沒有活動的桶,然後通過執行一個find_node的krpc操作來刷新它。

search_time定時器。
有可能出現發出的所有的get_peers操作,都沒有應答,那麼search_time定時器遇到這種情形時負責重發所有請求。(注意: get_peers操作最大未決的krpc請求數是3)

用於維持路由表的ping/pong操作:
在試圖插入節點時,發現桶已經滿,而存在可疑節點時會觸發ping_node操作。未響應的節點會有可疑最終變為失效節點,而被替換。

下面介紹我們是如何進入DHT網絡

通過上面的流程,了解DHT的工作方法後,如何增加更多的返回信息就需要下一篇的技術性問題的介紹,希望大家一起修改我們的開源程序.

大家有不明白的地方,可以一起討論.

另外求服務器進行程序測試,需要有固定IP,10G的WIN服務器空間,[email protected],謝謝.

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved