Search code examples
cgetbittorrent

how to send a get request to bit torrent tracker


I am trying to implement a bit torrent client.

The first step is decode the torrent file, which I did and here is result:

d8:announce36:http://tracker.mininova.org/announce7:comment41:Auto-generated
torrent by Mininova.org CD13:creation
datei1212041255e4:infod5:filesld6:lengthi291e4:pathl27:Distributed by
Mininova.txteed6:lengthi199784e4:pathl19:the cs
song.mp3.mp3eee4:name33:The Counter Strike Song version 212:piece
lengthi1048576e6:pieces20:趬oîdÏ9`•×=ü¼e6:locale2:en5:title33:The
Counter Strike Song version 2e.

The second step is sending a HTTP GET request to the tracker's announce URL with "?" and the following parameters (encoded as above) appended. This is the part I am struck on. I have been researching how to send HTTP GET in C; it seem you need first set up a TCP socket and connect to the tracker server first. I have been doing this:

if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
    printf("fail create socket");
    return 0;
}
char *path = “tracker.mininova.org/announce7”;
struct hostent *hp = gethostbyname(path);
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
&servAddr.sin_addr.s_addr = ((struct sockaddr_in*)(res->ai_addr))->sin_addr.s_addr;
servAddr.sin_port   = htons(portNum);

However, gethostbyname keep returning null. What am I doing wrong?


Solution

  • You are calling gethostbyname on a string that's not just a domain, "tracker.mininova.org/announce7". You need to be calling it on just the domain, "tracker.mininova.org". You could check the h_errno value to figure this out.

    However, the use of gethostbyname and related functions should be replaced by use of getaddrinfo anyway (which has the same limitations, but will provide better results).