2011-12-24 3 views
4

у меня есть сомнения, как УДП объявить ответ обрабатываются как мотивационные в 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 

ответ

3

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

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

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

+0

Привет Гийом, я немного смущен вашим структурным форматом. Согласно спецификациям трекера UDP, не будет ли маска формата быть чем-то вроде '> LLLL ...' Что-то вроде этого? Не могли бы вы рассказать о том, что я новый для структур. Благодарю. –

+0

Mridang, я думаю, вы правы. Если посмотреть на спецификацию, формат должен быть «> LLLLL», а затем «> LHLHLH ...» для следующих N хостов. (Это то, что я имел в виду, когда я сказал «кажется, что вы не разбираете ответ анонса правильно». Я просто работал с форматом из исходного сообщения, для которого требуется строка длиной 98.) – GuillaumeDufay