如何向bit torrent tracker发送get请求

时间:2012-12-04 06:32:53

标签: c get bittorrent

我正在尝试实施一些torrent客户端。

第一步是解码torrent文件,我做了,结果是:

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.

第二步是向跟踪器发送HTTP GET请求 用“?”宣布网址和以下参数(如上编码) 追加。这是我所感动的部分。我一直在研究如何 在C中发送HTTP GET;看起来你需要先设置一个TCP套接字和 首先连接到跟踪服务器。我一直这样做:

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);

但是,gethostbyname会继续null。我做错了什么?

1 个答案:

答案 0 :(得分:3)

您在不仅仅是域名的字符串gethostbyname上调用"tracker.mininova.org/announce7"。您需要仅在域"tracker.mininova.org"上调用它。您可以检查h_errno值来计算出来。

但是,gethostbyname和相关函数的使用应该替换为使用getaddrinfo(具有相同的限制,但会提供更好的结果)。