Я пытаюсь преобразовать код PHP в Python.
Все значения отправляются в сетевом порядке байтов (с прямым порядком байтов).
По сути, ЗАПРОС в спецификации протокола -
, а ответ -
. Соответствующий код PHP ( соответствующий DOC ):
$transaction_id = mt_rand(0,65535);
$current_connid = "\x00\x00\x04\x17\x27\x10\x19\x80";
$fp = fsockopen($tracker, $port, $errno, $errstr);
$packet = $current_connid . pack("N", 0) . pack("N", $transaction_id);
fwrite($fp,$packet);
Я пытаюсь найти соответствующий код ( для документа ) в python:
transaction_id = random.randrange(1,65535)
packet = "\x00\x00\x04\x17\x27\x10\x19\x80"
packet = packet + struct.pack("i", 0) + struct.pack("i", transaction_id)
clisocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
clisocket.sendto(packet, ("tracker.istole.it", 80))
В ответ я должен получить тот же идентификатор транзакции, который я отправил в запросе, которого я не получаю.Итак, я предполагаю, что я упаковываю не в правильном формате.
Кроме того, документация Python не так ясна, как документация PHP. Протокол определяет использование формата Big-Endian, а в документации PHP четко указано, какие именно форматы для Big-Endian.
К сожалению, я не мог понять, какой формат использовать в Python. Пожалуйста, помогите мне выбрать формат коррента.
РЕДАКТИРОВАТЬ: Не получаю никаких ответов, поэтому я хотел бы сказать больше.
import struct
import socket
import random
clisocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
packet = "\x00\x00\x04\x17\x27\x10\x19\x80"
transaction_id = random.randrange(1,65535)
print transaction_id
packet = packet+struct.pack(">i", 0)
packet = packet+struct.pack(">i", transaction_id)
clisocket.sendto(packet, ("tracker.istole.it", 80))
res = clisocket.recv(16)
print struct.unpack(">i", res[12:16])
Согласно спецификации протокола, мне должен быть возвращен такой же INTEGER.