2012-12-04 54 views
2

我想實現一個BT種子客戶端。如何發送獲取請求到比特洪流跟蹤器

的第一步是解碼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。我究竟做錯了什麼?

回答

3

您打電話給gethostbyname的字符串不只是一個域,"tracker.mininova.org/announce7"。您需要在域名"tracker.mininova.org"上調用它。你可以檢查h_errno的價值來弄清楚。

但是,gethostbyname和相關功能的使用應該用getaddrinfo取代(它有相同的限制,但會提供更好的結果)。