繼續接著第一篇寫:使用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],謝謝.