public override void Announce(AnnounceParameters parameters, object state) { //LastUpdated = DateTime.Now; if (!hasConnected && amConnecting) { return; } if (!hasConnected) { amConnecting = true; try { Connect(new ConnectAnnounceState(parameters, ConnectAnnounceCallback, state)); } catch (SocketException) { DoAnnounceComplete(false, state, new List <Peer>()); return; } } else { DoAnnounce(parameters, state); } }
public void MultipleAnnounce() { int announceCount = 0; Random r = new Random(); ManualResetEvent handle = new ManualResetEvent(false); for (int i = 0; i < 20; i++) { InfoHash infoHash = new InfoHash(new byte[20]); r.NextBytes(infoHash.Hash); TrackerTier tier = new TrackerTier(new string[] { uri.ToString() }); tier.Trackers[0].AnnounceComplete += delegate { if (++announceCount == 20) { handle.Set(); } }; TrackerConnectionID id = new TrackerConnectionID(tier.Trackers[0], false, TorrentEvent.Started, new ManualResetEvent(false)); System.Net.BitTorrent.Client.Tracker.AnnounceParameters parameters; parameters = new System.Net.BitTorrent.Client.Tracker.AnnounceParameters(0, 0, 0, TorrentEvent.Started, infoHash, false, new string('1', 20), "", 1411); tier.Trackers[0].Announce(parameters, id); } Assert.IsTrue(handle.WaitOne(5000, true), "Some of the responses weren't received"); }
private void DoAnnounce(AnnounceParameters parameters, object state) { ConnectAnnounceState announceState = new ConnectAnnounceState(parameters, AnnounceCallback, state); announceState.Message = new AnnounceMessage(DateTime.Now.GetHashCode(), connectionId, parameters); try { SendAndReceive(announceState); } catch (SocketException) { DoAnnounceComplete(false, state, new List <Peer>()); } }
Uri CreateAnnounceString(AnnounceParameters parameters) { UriQueryBuilder b = new UriQueryBuilder(Uri); b.Add("info_hash", parameters.InfoHash.UrlEncode()) .Add("peer_id", parameters.PeerId) .Add("port", parameters.Port) .Add("uploaded", parameters.BytesUploaded) .Add("downloaded", parameters.BytesDownloaded) .Add("left", parameters.BytesLeft) .Add("compact", 1) .Add("numwant", 100); if (parameters.SupportsEncryption) { b.Add("supportcrypto", 1); } if (parameters.RequireEncryption) { b.Add("requirecrypto", 1); } if (!b.Contains("key")) { b.Add("key", Key); } if (!string.IsNullOrEmpty(parameters.Ipaddress)) { b.Add("ip", parameters.Ipaddress); } // If we have not successfully sent the started event to this tier, override the passed in started event // Otherwise append the event if it is not "none" //if (!parameters.Id.Tracker.Tier.SentStartedEvent) //{ // sb.Append("&event=started"); // parameters.Id.Tracker.Tier.SendingStartedEvent = true; //} if (parameters.ClientEvent != TorrentEvent.None) { b.Add("event", parameters.ClientEvent.ToString().ToLower()); } if (!string.IsNullOrEmpty(TrackerId)) { b.Add("trackerid", TrackerId); } return(b.ToUri()); }
private WaitHandle Announce(Tracker tracker, TorrentEvent clientEvent, bool trySubsequent, ManualResetEvent waitHandle) { ClientEngine engine = manager.Engine; // If the engine is null, we have been unregistered if (engine == null) { waitHandle.Set(); return(waitHandle); } this.updateSucceeded = true; this.lastUpdated = DateTime.Now; EncryptionTypes e = engine.Settings.AllowedEncryption; bool requireEncryption = !Toolbox.HasEncryption(e, EncryptionTypes.PlainText); bool supportsEncryption = Toolbox.HasEncryption(e, EncryptionTypes.RC4Full) || Toolbox.HasEncryption(e, EncryptionTypes.RC4Header); requireEncryption = requireEncryption && ClientEngine.SupportsEncryption; supportsEncryption = supportsEncryption && ClientEngine.SupportsEncryption; IPEndPoint reportedAddress = engine.Settings.ReportedAddress; string ip = reportedAddress == null ? null : reportedAddress.Address.ToString(); int port = reportedAddress == null ? engine.Listener.Endpoint.Port : reportedAddress.Port; // FIXME: In metadata mode we need to pretend we need to download data otherwise // tracker optimisations might result in no peers being sent back. long bytesLeft = 1000; if (manager.HasMetadata) { bytesLeft = (long)((1 - this.manager.Bitfield.PercentComplete / 100.0) * this.manager.Torrent.Size); } AnnounceParameters p = new AnnounceParameters(this.manager.Monitor.DataBytesDownloaded, this.manager.Monitor.DataBytesUploaded, bytesLeft, clientEvent, this.infoHash, requireEncryption, manager.Engine.PeerId, ip, port); p.SupportsEncryption = supportsEncryption; TrackerConnectionID id = new TrackerConnectionID(tracker, trySubsequent, clientEvent, waitHandle); tracker.Announce(p, id); return(waitHandle); }
public override void Announce(AnnounceParameters parameters, object state) { try { Uri announceString = CreateAnnounceString(parameters); HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(announceString); #if NETSTANDARD1_5 request.Headers["User-Agent"] = System.Net.BitTorrent.Common.VersionInfo.ClientVersion; #else request.UserAgent = System.Net.BitTorrent.Common.VersionInfo.ClientVersion; request.Proxy = new WebProxy(); // If i don't do this, i can't run the webrequest. It's wierd. #endif request.Accept = "*/*"; RaiseBeforeAnnounce(); BeginRequest(request, AnnounceReceived, new object[] { request, state }); } catch (Exception ex) { Status = TrackerState.Offline; FailureMessage = ("Could not initiate announce request: " + ex.Message); RaiseAnnounceComplete(new AnnounceResponseEventArgs(this, state, false)); } }
public abstract void Announce(AnnounceParameters parameters, object state);
public ConnectAnnounceState(AnnounceParameters parameters, AsyncCallback callback, object state) : base(callback, state) { Parameters = parameters; }