2013-06-27 22 views
0

我正在嘗試實現Bittorrent客戶端。但是我很難與跟蹤服務器通信。它不會發送Bencoded字典作爲對我的請求的迴應。
它始終發送以下字符串作爲其響應。爲什麼跟蹤器服務器發送「 x03 0 0 0r.opConnection ID mismatch」。作爲迴應消息? (Bittorrent協議)

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

這裏是洪流元文件的子串。

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; 

} 

附件爲torrent文件。
Attached

+0

大量文獻都在這裏:http://stackoverflow.com/q/990677/ 694576 – alk

回答

0

首先,您正在向使用完全不同協議的UDP-tracker發送http請求。
請參閱:http://www.bittorrent.org/beps/bep_0015.html

其次,您的info_hash的URL編碼是錯誤的。
它看起來像這樣:

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 
相關問題