2013-06-27 2 views
0

Я пытаюсь реализовать клиент Bittorrent. Но мне сложно общаться с трекер-сервером. Он не отправляет словарь Bencoded в качестве ответа на мой запрос.
Он всегда посылает следующую строку в качестве ответа.Почему сервер трекера отправляет « x03 0 0 0r.opConnection ID missmatch». как ответное сообщение? (Протокол Bittorrent)

"\x03\0\0\0r.opConnection ID missmatch." 

Здесь находится подстрока метафайла torrent.

d8:announce38:udp://tracker.publicbt.com:80/announce13:announce- 
listll38:udp://tracker.publicbt.com:80/announceel 
44:udp://tracker.openbittorrent.com:80/announceel 
43:udp://fr33domtracker.h33t.com:3310/announceel 
35:udp://tracker.istole.it:80/announceel 
37:http://fr33dom.h33t.com:3310/announceel 
36:udp://fr33dom.h33t.com:3310/announceee 
7:comment61:Torrent downloaded from torrent cache at http://torcache.net/ 
10:created by13:uTorrent/330013:creation datei1372123476e8:encoding 
5:UTF-8 
4:infod13:file-durationli207ee10:file-mediali0ee6:lengthi59625855e4:name 
7:Owl.mp412:piece lengthi65536e 

Я отправляю на сервер слежения следующее сообщение, чтобы получить список сверстников.

udp://tracker.openbittorrent.com:80/announce?info_hash=%%73%%78%%b1%%df%%32%%7c%%78%%0f%%d2%%90%%59%%b8%%0c%%03%%bd%%62%%0f%%45%%af%%26 
&left=0 
&uploaded=0 
&port=6882 
&event=started 

Вот мой код, который отправляет запрос на сервер трекера, а затем получает неудобный ответ.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <netdb.h> 
#include <arpa/inet.h> 
#include <stdlib.h> 
#include <errno.h> 

#define BUFSIZE 1024 

int main(int argc, char** argv) 
{ 
    int sockfd, portno, n; 
    struct sockaddr_in serveraddr; 
    struct hostent *server; 
    char buf[BUFSIZE]; 

    portno  = 80; 

    /* socket: create the socket */ 
    sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
    if (sockfd < 0) 
    { 
     fprintf(stderr, "socket error\n"); 
     exit(0); 
    } 

    server = gethostbyname("tracker.openbittorrent.com"); 
    printf("%s\n", inet_ntoa(*(struct in_addr*)server->h_addr_list[0])); 
    /* build the server's Internet address */ 
    bzero((char *) &serveraddr, sizeof(serveraddr)); 
    serveraddr.sin_family   = AF_INET; 
    serveraddr.sin_addr.s_addr  = inet_addr(inet_ntoa(*(struct in_addr*)server->h_addr_list[0])); 
    serveraddr.sin_port    = htons(portno); 

    /* connect: create a connection with the server */ 
    if (connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) 
    { 
     printf("error : %d\n", errno); 
     fprintf(stderr, "connect error\n"); 
     exit(0); 
    } 

    /* generate request message into buffer pointed by buf. */ 
    sprintf(buf, "udp://tracker.openbittorrent.com:80/announce" 
        "?info_hash=%%73%%78%%b1%%df%%32%%7c%%78%%0f%%d2%%90%%59%%b8%%0c%%03%%bd%%62%%0f%%45%%af%%26" 
        "&left=0" 
        "&uploaded=0" 
        "&ip=0" 
        "&key=0" 
        "&port=6882" 
        "&event=started" 
        ); 

    /* write: send the request to the tracker server */ 
    n = write(sockfd, buf, strlen(buf)); 
    if (n < 0) 
    { 
     fprintf(stderr, "fail to send your request.\n"); 
     exit(0); 
    } 
    memset(buf, 0x00, sizeof(buf)); 
    n = read(sockfd, buf, BUFSIZE); 

    printf("%s\n", buf + 4); 
    close(sockfd); 
    return 0; 

} 

Прилагается торрент-файл.
Attached

+0

Много ссылок здесь: http://stackoverflow.com/q/990677/ 694576 – alk

ответ

0

Во-первых, вы отправляете http-запрос в UDP-трекер, который использует совершенно другой протокол.
См.: http://www.bittorrent.org/beps/bep_0015.html

Во-вторых, ваша URL-кодировка info_hash неверна.
Это выглядит следующим образом:

info_hash=%%73%%78%%b1%%df%%32%%7c%%78%%0f%%d2%%90%%59%%b8%%0c%%03%%bd%%62%%0f%%45%%af%%26 

и он должен выглядеть следующим образом:

info_hash=%0C%7Dr%CAQvQf%10%80%CBB%07%3DT_%24%3C%F8%2C 

В-третьих, вам нужно добавить `компактные = 1'в строке запроса.
См: Why does tracker server NOT understand my request? (Bittorrent protocol)

Попробуйте с:

http://exodus.desync.com:6969/announce?info_hash=%0C%7Dr%CAQvQf%10%80%CBB%07%3DT_%24%3C%F8%2C&left=0&uploaded=0&port=6882&event=started&compact=1 

и трекер ответит:

d8:completei1e10:downloadedi0e10:incompletei0e8:intervali1720e12:min intervali860e5:peers6:******e