如何向torrent tracker服务器发送get请求
发布时间:2020-12-16 07:33:56 所属栏目:百科 来源:网络整理
导读:我想要实现一点洪流客户端.我从这里得到我的信息: http://wiki.theory.org/BitTorrent_Tracker_Protocol. 我想向跟踪器发送获取请求以获取对等列表.我应该建立一个udp连接并在端口80连接到udp://tracker.thepiratebay.org吗?这是我的请求消息应该是什么样
我想要实现一点洪流客户端.我从这里得到我的信息:
http://wiki.theory.org/BitTorrent_Tracker_Protocol.
我想向跟踪器发送获取请求以获取对等列表.我应该建立一个udp连接并在端口80连接到udp://tracker.thepiratebay.org吗?这是我的请求消息应该是什么样的? "udp://tracker.thepiratebay.org??info_hash=12345678901234567890 &peer_id=ABCDEFGHIJKLMNOPQRST port=6888 &downloaded=0 &left=0 &event=started " 这是我的代码的一部分: char *requestToSend; int sock; struct sockaddr_in servAddr; struct sockaddr_in fromAddr; int fromSize; int respStringLen; int portNum =80; char data_recv[ECHOMAX]; char *hash="12345678901234567890"; char *id="ABCDEFGHIJKLMNOPQRST"; char *temp ="udp://tracker.thepiratebay.org??info_hash=12345678901234567890n&peer_id=ABCDEFGHIJKLMNOPQRSTnport=6888n&downloaded=0n&left=0n&event=started"; requestToSend = malloc(sizeof(temp)+1); sprintf(requestToSend,"%s??info_hash=%sn&peer_id=%snport=%sn&downloaded=0n&left=0n&event=started ","udp://tracker.thepiratebay.org",hash,id,"6888"); printf("%s to send n",requestToSend); /* Create a datagram/UDP socket */ if ((sock = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0){ printf("fail create socket"); return 0; } /* Construct the server address structure */ struct hostent *hp = gethostbyname("udp://tracker.thepiratebay.org"); memset(&servAddr,sizeof(servAddr)); /* Zero out structure */ servAddr.sin_family = AF_INET; /* Internet addr family */ memcpy( (char *) &servAddr.sin_addr.s_addr,hp->h_addr,hp->h_length ); servAddr.sin_port = htons(portNum); /* Server port */ //send request to tracker server if (send(sock,requestToSend,strlen(requestToSend),0) != strlen(requestToSend)){ printf("fail send"); return 0; } /* Recv a response */ fromSize = sizeof(fromAddr); if ((respStringLen = recvfrom(sock,data_recv,ECHOMAX,(struct sockaddr *) &fromAddr,&fromSize)) != strlen(requestToSend)){ printf("fail to recv"); return 0; } 这是我从torrent文件中获取的内容 dict { announce => str = http://tracker.thepiratebay.org/announce (len = 40) announce-list => list [ list [ str = http://tracker.thepiratebay.org/announce (len = 40) ] list [ str = udp://tracker.thepiratebay.org:80/announce (len = 42) ] list [ str = http://tracker.openbittorrent.com/announce (len = 42) ] list [ str = udp://tracker.openbittorrent.com:80/announce (len = 44) ] ] creation date => int = 1174816388 encoding => str = UTF-8 (len = 5) info => dict { filehash => str = ?¥£?ü?XtDS?(?fn6 (len = 20) length => int = 2222949 name => str = Audacity.zip (len = 12) name.utf-8 => str = Audacity.zip (len = 12) piece length => int = 32768 pieces => str = (null) (len = 0) } } d8:announce40:http://tracker.thepiratebay.org/announce13:announce-listll40:http: //tracker.thepiratebay.org/announceel42:udp://tracker.thepiratebay.org:80/announ ceel42:http://tracker.openbittorrent.com/announceel44:udp://tracker.openbittorre nt.com:80/announceee13:creation datei1174816388e8:encoding5:UTF-84:infod8:fileha sh20: ?¥£?ü?XtDS?(?fn66:lengthi2222949e4:name12:Audacity.zip10:name.utf-812:Audacity.z yf3-?B?Nrl lengthi32768e6:pieces1360:t]úùé?'N??+gd3fi6è6? 解决方法
你检查gethostbyname确实返回了一个有效的地址吗?
我认为你不应该将http://或udp://协议字符串部分添加为gethostbyname参数. struct hostent *hp = gethostbyname("tracker.thepiratebay.org"); if(!hp) { herror("gethostbyname(): "); exit(1); } 添加此行以确保gethostbyname确实正常工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |