utorrent - cómo enviar la solicitud get al servidor de seguimiento de torrents
configurar utorrent para descargar mas rapido 2018 (3)
¿Comprobaste que gethostbyname devolvió una dirección válida? Creo que no debería agregar la parte de cadena de protocolo http: // o udp: // como argumento gethostbyname.
struct hostent *hp = gethostbyname("tracker.thepiratebay.org");
if(!hp)
{
herror("gethostbyname(): ");
exit(1);
}
Agregue esta línea para asegurarse de que gethostbyname funcionó correctamente.
Estoy tratando de implementar un cliente bit torrent. Obtengo mi información desde aquí: http://wiki.theory.org/BitTorrent_Tracker_Protocol .
Deseo enviar una solicitud de obtención al rastreador para obtener la lista de pares. ¿Debo configurar una conexión udp y conectarme a udp: //tracker.thepiratebay.org en el puerto 80? ¿Es este el mensaje de mi solicitud?
"udp://tracker.thepiratebay.org??info_hash=12345678901234567890
&peer_id=ABCDEFGHIJKLMNOPQRST
port=6888
&downloaded=0
&left=0
&event=started "
esta es mi parte de mi código:
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=12345678901234567890/n&peer_id=ABCDEFGHIJKLMNOPQRST/nport=6888/n&downloaded=0/n&left=0/n&event=started";
requestToSend = malloc(sizeof(temp)+1);
sprintf(requestToSend, "%s??info_hash=%s/n&peer_id=%s/nport=%s/n&downloaded=0/n&left=0/n&event=started/0","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, 0, 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, 0,
(struct sockaddr *) &fromAddr, &fromSize)) != strlen(requestToSend)){
printf("fail to recv");
return 0;
}
esto es lo que obtengo de un archivo 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 =
¸¥£öüËXþÐS®(ä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:
¸¥£öüËXþÐS®(äfn66:lengthi2222949e4:name12:Audacity.zip10:name.utf-812:Audacity.z yf3-ûBÎNrl lengthi32768e6:pieces1360:þ]úÙÉÅ''NÕæ+gd3fi6è6¶
El ejemplo dado en ese sitio web NO es para la comunicación UDP. Es para la comunicación a través de TCP, más específicamente, HTTP.
Si el rastreador usa UDP , no debe enviar una solicitud GET
, sino establecer una conexión en el puerto designado y luego hacer 4 pasos:
- Enviar una solicitud de conexión
- Confirme la solicitud de conexión leyendo la respuesta de 16 bytes y agárrese a la identificación de conexión
- Enviar un anuncio con la identificación de conexión
- Analizar la respuesta de anunciar, su tamaño depende de cuántos pares designen
La conexión UDP sobre todo toma menos paquetes para intercambiar la misma cantidad de información, pero está más involucrado en términos de implementación para un cliente :)
Este wiki entra en detalles sobre lo que se supone que los mensajes UDP deben incluir. Se asemejan a los mensajes que envía a sus pares (es decir, usan aplicaciones de big endian codificadas en una longitud fija de bytes)
o las especificaciones pueden ayudar