private static byte[] GetPeerHandshakeMessage(ExtendedTorrent torrent, string peerId) { byte[] handshake = new byte[49 + BitTorrentProtocol.ProtocolNameLength]; handshake[0] = Convert.ToByte(BitTorrentProtocol.ProtocolNameLength); Array.Copy(BitTorrentProtocol.ProtocolNameBytes, 0, handshake, 1, BitTorrentProtocol.ProtocolNameLength); Array.Copy(BitConverter.GetBytes((long)0), 0, handshake, BitTorrentProtocol.ProtocolNameLength + 1, 8); //reserved Array.Copy(torrent.GetInfoHashBytes(), 0, handshake, BitTorrentProtocol.ProtocolNameLength + 9, 20); Array.Copy(Encoding.ASCII.GetBytes(peerId), 0, handshake, BitTorrentProtocol.ProtocolNameLength + 29, 20); return(handshake); }
/*TBC * public static byte[] GetAnnounceRequestPacket(byte[] connectionId, byte[] transactionId, Torrent torrent, int localPort) * { * byte[] announcePacket = new byte[98]; * Array.Copy(connectionId, 0, announcePacket, 0, 8); * Array.Copy(BitConverter.GetBytes(1).Reverse().ToArray(), 0, announcePacket, 8, 4);//action * Array.Copy(transactionId, 0, announcePacket, 12, 4); * Array.Copy(torrent.GetInfoHashBytes(), 0, announcePacket, 16, 20); * Array.Copy(Encoding.ASCII.GetBytes(GeneratePeerId()), 0, announcePacket, 36, 20); * Array.Copy(BitConverter.GetBytes(torrent).Reverse().ToArray(), 0, announcePacket, 56, 8);//downloaded * Array.Copy(BitConverter.GetBytes(torrent.Left).Reverse().ToArray(), 0, announcePacket, 64, 8);//left * Array.Copy(BitConverter.GetBytes(torrent.Uploaded).Reverse().ToArray(), 0, announcePacket, 72, 8);//uploaded * * //4bytes: event (0) + 4bytes: ip addr (0) * Array.Copy(BitConverter.GetBytes((long)0), 0, announcePacket, 80, 8); * byte[] key = BitConverter.GetBytes(new Random().Next(0, int.MaxValue)).Reverse().ToArray(); * Array.Copy(key, 0, announcePacket, 88, 4); * Array.Copy(BitConverter.GetBytes(-1).Reverse().ToArray(), 0, announcePacket, 92, 4); * Array.Copy(BitConverter.GetBytes((ushort)localPort).Reverse().ToArray(), 0, announcePacket, 96, 2); * return announcePacket; * }*/ private static byte[] GetAnnounceRequestPacketZero(byte[] connectionId, byte[] transactionId, ExtendedTorrent torrent, int localPort, string peerId) { byte[] announcePacket = new byte[98]; Array.Copy(connectionId, 0, announcePacket, 0, 8); Array.Copy(BitConverter.GetBytes(1).Reverse().ToArray(), 0, announcePacket, 8, 4);//action 1 - announce Array.Copy(transactionId, 0, announcePacket, 12, 4); Array.Copy(torrent.GetInfoHashBytes(), 0, announcePacket, 16, 20); Array.Copy(Encoding.ASCII.GetBytes(peerId), 0, announcePacket, 36, 20); Array.Copy(BitConverter.GetBytes((long)0), 0, announcePacket, 56, 8); //downloaded Array.Copy(BitConverter.GetBytes(torrent.TotalSize).Reverse().ToArray(), 0, announcePacket, 64, 8); //left Array.Copy(BitConverter.GetBytes((long)0), 0, announcePacket, 72, 8); //event 0-none //4bytes: event (0) + 4bytes: ip addr (0) Array.Copy(BitConverter.GetBytes((long)0), 0, announcePacket, 80, 8); byte[] key = BitConverter.GetBytes(new Random().Next(0, int.MaxValue)).Reverse().ToArray(); Array.Copy(key, 0, announcePacket, 88, 4); Array.Copy(BitConverter.GetBytes(-1), 0, announcePacket, 92, 4);//default Array.Copy(BitConverter.GetBytes((ushort)localPort).Reverse().ToArray(), 0, announcePacket, 96, 2); return(announcePacket); }
private static int ValidatePeerHandshake(byte[] response, int responseLength, ExtendedTorrent torrent) { int peerPstrLength = Convert.ToInt32(response[0]); if (responseLength < peerPstrLength + 49) { return(1); //possible keep alive message } if (peerPstrLength != BitTorrentProtocol.ProtocolNameLength) { return(2); } byte[] peerProtocolNamebytes = response.SubArray(1, peerPstrLength); if (!peerProtocolNamebytes.SequenceEqual(BitTorrentProtocol.ProtocolNameBytes)) { return(2); //not BitTorrentProtocol } byte[] receivedInfoHash = response.SubArray(peerPstrLength + 9, 20); if (!receivedInfoHash.SequenceEqual(torrent.GetInfoHashBytes())) { return(3); //bad info hash } return(0); //handshake correct }