我正在尝试实施一些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
。我做错了什么?
答案 0 :(得分:3)
您在不仅仅是域名的字符串gethostbyname
上调用"tracker.mininova.org/announce7"
。您需要仅在域"tracker.mininova.org"
上调用它。您可以检查h_errno
值来计算出来。
但是,gethostbyname
和相关函数的使用应该替换为使用getaddrinfo
(具有相同的限制,但会提供更好的结果)。