Pergunta

Eu tenho um par de perguntas sobre Peer Bittorrent Wire Protocol. Eu estou tentando implementá-lo em Java usando esta especificação .

Em pares seção Wire Protocol diz que todos os inteiros são quatro bytes valores endian grandes. AFAIK java usa big endian. Que dizer dizer, se eu quiser enviar uma mensagem de estrangulamento

choke:

Eu só escrever para o sokcet 1 seguido por 0?

Quanto à minha segunda pergunta. Ao solicitar uma peça que eu acho vários arquivos em um único arquivo contínuo grande? ou pensar em arquivos individuais? porque comprimento da peça não vai alinhar com arquivos assim que um índice pode tanto conter final de um arquivo e começo de outro?

Quanto à minha última pergunta quando eu abrir uma conexão com o peer e enviar o meu aperto de mão, posso apenas manter solicitando peças ou solicitar depois esperar por um tempo para ver se ele vai solicitar algo de nós? como é que a conversa ocorreu? Tenho feito principalmente http programação tipo de rede onde eu pedir para esperar algo para uma resposta. mas se eu continuar solicitando peças Como vou para enviar pedaços?

Foi útil?

Solução

Pergunta 1

Furar a métodos simples, se você estiver usando fluxo baseada em I / O, em seguida, usar DataInputStream e DataOutputStream ao escrever tipos primitivas (por exemplo, byte , int , longa , etc.):

Socket s; // assume this is already connected
DataOutputStream out = new DataOutputStream( s.getOutputStream );
out.writeByte( 1 );
out.writeInt( 0 );
out.flush(); // optional

Se você estiver usando non-blocking I / O (por exemplo, as classes do pacote java.nio), em seguida, usar ByteBuffer s:

Socket s; // assume this is already connected
SocketChannel = s.getChannel();
ByteBuffer buf = ByteBuffer.allocate(8); // two 4-byte integers
buf.put( 1 ).putInt( 0 );
buf.flip();
c.write( buf ); // assuming channel is writable :)

Cada um desses métodos vai cuidar de questões byte de ordenação em seu nome.

Pergunta 2

(Note-se que, geralmente, você está transferindo blocos , que são fragmentos de peças, sobre o fio. Eu vou passar por cima que aqui :))

Ao enviar / peças que recebem, é melhor pensar dos arquivos (ou arquivo) como contínua, como você disse. O arquivo .torrent contém informações sobre limites de arquivo, na informação dicionário. No caso multi-arquivo , cada arquivo tem caminho e um comprimento; caso único arquivo tem um nome e comprimento opcional. Desde que você sabe o tamanho peça, número de peças e tamanho do conteúdo total de (todos do arquivo .torrent), você pode colocar peças "no lugar certo", como você recebê-los.

Uma coisa simples a fazer é criar um único arquivo igual ao tamanho do torrent. Quando você recebe uma peça, escrevê-lo para o byte deslocamento correto dentro deste único arquivo (por vezes chamado de ".downloading" arquivo). Por exemplo, considere uma torrente que consiste em dois arquivos:

a/b/file1.txt [100 bytes]
a/b/file2.txt [200 bytes]

piece size (pz) = 50 bytes
total size (tz) = 100+200 = 300 bytes
number pieces (np) = 300/50 = 6
file = my_torrent.downloading

Suponha que pedaços de número e offsets de bytes começando com zero. Digamos que você receber todos pedaço 1. Em que (início) deslocamento de byte ela vai em my_torrent.downloading? Ele vai em (1 * pz) = (1 * 50) = 50 . Onde faz parte 0 go? Em (0 * pz) = (0 * 50) = 0 . E assim por diante ...

Eu aposto que agora você pode descobrir como você transformar este arquivo .downloading no conteúdo "real" dentro do seu torrent.

Pergunta 3

Ao participar de um enxame BitTorrent, você upload e download de peças de e para vários pares simultaneamente . Pense sobre isso por um segundo. Ao mesmo tempo que você está pedindo um pedaço de alguns pares, outro par pode estar fazendo o mesmo de você. Bastante diferente da semântica da HTTP como você já apontou. Assim, para falar diretamente à sua pergunta, outros pares irá pedir os dados que eles estão interessados. :)

Apenas para se certificar, antes de solicitar um pedaço de um de um make pares certeza de que pares tem a peça que deseja (consulte a rel bitfield e ter mensagens ) e você respeitado o bom asfixia / interessado comportamento. Dado que, o que você normalmente quer fazer é solicitar dados da sua lista de pares conhecidos (que o tracker ou DHT lhe disse sobre) em mais raro primeira ordem. As negociações de especificação sobre este e há uma série de otimizações e considerações polidez aqui. (Tit-for-tat comportamento, por exemplo.) Você pode notar que a especificação não especifica um muito isso. Isso porque uma grande parte do molho secreto de BitTorrent clientes mentiras nesta parte da implementação. :)

Espero que isso ajude você alguns!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top