Как проанализировать IP-адрес и порт одноранговых узлов из UDP-трекера и сообщить ответ
Я использую этот код в 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
Я получаю Annouce т.е. 1
транзакция = 56347, то есть то же самое, что и сгенерированный транзакция, но вместо порта я получаю порт, который отправляю в запросе объявления, а вместо 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