protected virtual void HandleHandshakeMessage(PeerId id, HandshakeMessage message) { if (!message.ProtocolString.Equals(VersionInfo.ProtocolStringV100)) { Logger.Log(id.Connection, "HandShake.Handle - Invalid protocol in handshake: {0}", message.ProtocolString); throw new ProtocolException("Invalid protocol string"); } // If we got the peer as a "compact" peer, then the peerid will be empty. In this case // we just copy the one that is in the handshake. if (string.IsNullOrEmpty(id.Peer.PeerId)) { id.Peer.PeerId = message.PeerId; } // If the infohash doesn't match, dump the connection if (message.InfoHash != id.TorrentManager.InfoHash) { Logger.Log(id.Connection, "HandShake.Handle - Invalid infohash"); throw new TorrentException("Invalid infohash. Not tracking this torrent"); } // If the peer id's don't match, dump the connection. This is due to peers faking usually if (id.Peer.PeerId != message.PeerId) { Logger.Log(id.Connection, "HandShake.Handle - Invalid peerid"); throw new TorrentException("Supplied PeerID didn't match the one the tracker gave us"); } // Attempt to parse the application that the peer is using id.ClientApp = new Software(message.PeerId); id.SupportsFastPeer = message.SupportsFastPeer; id.SupportsLTMessages = message.SupportsExtendedMessaging; // If they support fast peers, create their list of allowed pieces that they can request off me if (id.SupportsFastPeer && id.TorrentManager != null && id.TorrentManager.HasMetadata) { id.AmAllowedFastPieces = AllowedFastAlgorithm.Calculate(id.AddressBytes, id.TorrentManager.InfoHash, (uint)id.TorrentManager.Torrent.Pieces.Count); } }