0

I'm trying to implement Bittorrent client. But I have a hard time communicating with a tracker server. It doesn't send Bencoded dictionary as its response to my request.
It always send the following string as its response.

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

Here is substring of torrent meta file.

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

I send the following message to the tracker server, in order to get list of peers.

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

Here is my code that send request to the tracker server and then receive a awkward response.

#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 is torrent file.
Attached

inherithandle
  • 2,614
  • 4
  • 31
  • 53

1 Answers1

0

First, you are sending a http-request to a UDP-tracker that uses an entirely diffrent protocol.
See: http://www.bittorrent.org/beps/bep_0015.html

Second, your URL-encoding of the info_hash is wrong.
It looks like this:

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

and it should look like this:

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

Third, you need to add `compact=1´ to the request string.
See: Why does tracker server NOT understand my request? (Bittorrent protocol)

Try with:

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

and the tracker will answer with:

d8:completei1e10:downloadedi0e10:incompletei0e8:intervali1720e12:min intervali860e5:peers6:******e
Community
  • 1
  • 1
Encombe
  • 2,003
  • 1
  • 17
  • 26