0

ここで説明されているように、UDPトラッカープロトコルを実装するCでトレントクライアントを作成しています:

http://www.libtorrent.org/udp_tracker_protocol.html

私のプロジェクトはここにあります: https://github.com/unovongalixor/uvgTorrent

接続要求を正常に送信し、接続 ID を受信して​​います。

次のコードを使用して、UDP 経由でトラッカーに送信されるパックされた構造体ですべてのデータを準備します。興味深いことに、htonll() をラップして接続 ID を壊すと、プロトコルで説明されているエラーが発生します。つまり、アクション == 3 で、エラー メッセージは「接続 ID の不一致」を示していました。

ただし、受信した接続 ID を送信すると、ガベージ応答が返されます。action == 16777216. トランザクション ID は私が提供したものと一致しましたが、他の予想される情報はありません。

似たような経験をした人はいますか?これが私のコードです。

this->generate_transID(this);

/* set up the packet to send to server */
int32_t transID = *this->last_transaction_id;

struct tracker_announce_request conn_request;
conn_request.connection_id = *this->connection_id;
conn_request.action = htonl(1);
conn_request.transaction_id = transID;

/* extract info hash */
Linkedlist * info_hash_list = string_utils.split(torrent->hash, ':');
const char * info_hash = (char *) info_hash_list->get(info_hash_list, 2);
// convert 50 character info_hash stringlocated in magnet_uri to 20 byte array
string_utils.hex_to_int8_t(info_hash, conn_request.info_hash, 40); // need to verify that tracker is receiving the correct value here

// generate peer id
for(int i = 0; i<=19; i++){
    conn_request.peer_id[i] = rand_utils.nrand8_t(rand() % 10);
}

conn_request.downloaded = htonll((uint64_t)0);
conn_request.left = htonll((uint64_t)0);
conn_request.uploaded = htonll((uint64_t)0);
conn_request.event = 0;
conn_request.ip = htonl(0);
conn_request.key = htonl(rand_utils.nrand32(rand() % 10));
conn_request.num_want = htonl(-1);
conn_request.port = htonl(5050);
conn_request.extensions = htonl(0);
// send packet
this->tracker_socket->send(this->tracker_socket, &conn_request, sizeof(struct tracker_announce_request));
4

0 に答える 0