2

我正在尝试实现一点洪流客户端。

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

d8:announce36:http://tracker.mininova.org/announce7:comment41:自动生成
Mininova.org 的洪流 CD13:creation
datei1212041255e4:infod5:filesld6:lengthi291e4:pathl27:分发者
Mininova.txteed6:lengthi199784e4:pathl19:cs
song.mp3.mp3eee4:name33:反恐精英歌曲版本 212:piece
lengthi1048576e6:pieces20:趬oîdÏ9`•×=ü¼e6:locale2:en5:title33:The
反恐精英歌曲版本 2e。

第二步是向跟踪器的通告 URL 发送 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。我究竟做错了什么?

4

1 回答 1

3

您正在调用gethostbyname一个不仅仅是域的字符串,"tracker.mininova.org/announce7". 您需要仅在域上调用它,"tracker.mininova.org". 您可以检查该h_errno值以解决此问题。

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

于 2012-12-04T06:39:00.653 回答