ответ udp-трекера bittorrent

я сомневаюсь, как обрабатывается ответ объявления udp, как это предлагается в спецификации протокола bep udp

import socket,struct
clisocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
connection_id=0x41727101980
transaction_id = 12345

# responses Tracker : Specification  UDP [ User Datagaram Protocol ]
info_hash  = "%1D%D4%D1%EDQn%DB%5CL%83%90%1B%2B%F8%83%A2%19%C0%7C%98"
peer_id = "-UT1234-m%09%B2%D5%99%FA%1Fj%88%AC%0D%A7"
action =1 # announce
downloaded = 0
left = 0
uploaded = 0
event =0
ip = 0
key = 0
num_want = -1
port = 9999

announce_pack = struct.pack(">QLL20s20sQQQLLLLH",connection_id,action,transaction_id,info_hash,peer_id,down  loaded,left,uploaded,event,ip,key,num_want,port)
clisocket.sendto(announce_pack, ("tracker.ccc.de", 80))
res = clisocket.recv(1024)
action=struct.unpack(">HLLLLQQQ20s20sLLQ",res)

но я получаю следующую ошибку

DeprecationWarning: struct integer overflow masking is deprecated announce_pack=struct.pack(">QLL20s20sQQQLLLLH",connection_id,action,transaction_id,info_hash,peer_id,downloaded,left,uploaded,event,ip,key,num_want,port)
Traceback (most recent call last):
action=struct.unpack(">HLLLLQQQ20s20sLLQ",res)
struct.error: unpack requires a string argument of length 98

person abhijeet    schedule 24.12.2011    source источник


Ответы (1)


Похоже, вы передаете в структуру слишком большую строку, возможно, из-за того, что вы получаете более одного пакета. Пытаться

action=struct.unpack(">HLLLLQQQ20s20sLLQ",res[:98])

Кроме того, похоже, что вы неправильно анализируете ответ на объявление. См. здесь формат пакетов отслеживания UDP.

person GuillaumeDufay    schedule 27.01.2012
comment
Привет, Гийом, меня немного смущает формат вашей структуры. Согласно спецификациям трекера UDP, не будет ли маска формата чем-то вроде >LLLL... Что-то в этом роде? Не могли бы вы уточнить, так как я новичок в структурах. Спасибо. - person Mridang Agarwalla; 28.01.2012
comment
Мриданг, я думаю, ты прав. Глядя на спецификацию, формат должен быть '›LLLLL', а затем '›LHLHLH...' для следующих N хостов. (Это то, что я имел в виду, когда сказал, что вы неправильно анализируете ответ на объявление. Я просто работал с форматом исходного сообщения, для которого потребуется строка длиной 98.) - person GuillaumeDufay; 28.01.2012