如何从UDP Tracker的公告响应中解析对等体的IP和端口

1 投票
1 回答
753 浏览
提问于 2025-04-18 00:12

我在用这段Python代码向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

我得到了这个响应,

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

根据协议规范 [链接] : http://www.bittorrent.org/beps/bep_0015.html

我得到了 公告,即 1
事务ID,即 56347,这和我生成的事务ID是一样的。 但是在端口的地方,我得到了我在公告请求中发送的端口,而在IP的地方,我得到了838084381。 这是我应该从UDP跟踪器得到的响应吗? 我该如何从中解析出对等方的IP地址呢?

1 个回答

1

IP地址以32位的紧凑格式返回。你可以把它转换成点分四段的字符串格式,方法如下:

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

参考链接

撰写回答