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