2014-03-27 38 views
1

我使用python中這段代碼發送連接請求,並annouce請求UDP跟蹤器,如何分析

clisocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
print clisocket 
connection_id = 0x41727101980 
transaction_id = randrange(1, 65535) 
info_hash = info_hash 
peer_id = "ABCDEFGHIJKLMNOPQRST" 
action = 0 
downloaded = 0 
left = 0 
uploaded = 0 
event = 2 
ip = 0 
key = 0 
num_want = 10 
port = 9999 

connect_pack = struct.pack(">QLL", connection_id, action, transaction_id) 
clisocket.sendto(connect_pack, ("tracker.publicbt.com", 80)) 
res = clisocket.recv(16) 
action, transaction_id, connection_id = struct.unpack(">LLQ", res) 

announce_pack = struct.pack(">QLL20s20sQQQLLLLH", connection_id, 1, transaction_id, info_hash, peer_id, downloaded, left, uploaded, event, ip, key, num_want, port) 
clisocket.sendto(announce_pack, ("tracker.publicbt.com", 80)) 
res = clisocket.recv(1024) 
action = struct.unpack("!LLLLLLH", res[:26]) 
print action 

我得到這個響應從UDP跟蹤annouce響應同行的IP和端口,

(1, 56347, 1782, 0, 1, 838084381, 9999) 

按照協議規範[鏈接]:http://www.bittorrent.org/beps/bep_0015.html

我正在 annouce即1
transaction_id ie 56347它與生成的transaction_id 相同,但代替端口我得到我發送的通知請求中的端口,代替IP我得到838084381. 這是我應該從udp追蹤器? 如何從這個解析對等的IP?

回答

1

IP地址以32位打包格式返回。你可以將其轉換爲這樣的點分四組字符串表示:

import socket, struct  
ip = socket.inet_ntoa(struct.pack('!L', 838084381))  
print ip; # prints 49.244.39.29 

Reference

+1

謝謝xobnez它有助於解析的IP地址。但我沒有從udp tracker獲取其他對等ip地址。我得到我自己的IP地址和端口。我是否在請求中做了任何錯誤的事情。 –

+0

不幸的是我對協議並不熟悉。希望別人能夠一起來幫助你。 – xbonez