public TrackerResponse AnnounceStart(byte[] infoHash, string peerId, ushort port, long downloaded, long uploaded, long left) { var request = new TrackerRequest(infoHash, peerId, port, uploaded, downloaded, left, true, true, EventType.Started, 100); return GetResponse(request); }
/// <summary> /// Sends a HTTP request to the tracker and returns the response. /// </summary> /// <param name="requestData">The data for the request that will be sent to the tracker.</param> /// <returns>The tracker's response.</returns> public TrackerResponse GetResponse(TrackerRequest requestData) { Contract.Requires(requestData != null); TrackerResponse response = null; if (PreferredAnnounce != null) { response = AttemptGet(requestData, PreferredAnnounce); } if (response == null) { foreach (string url in Announces) { if ((response = AttemptGet(requestData, url)) != null) { PreferredAnnounce = url; break; } } } return(response); }
private void Announce(InfoHash hash, long downloaded, long uploaded, long remaining, EventType type) { var request = new TrackerRequest(hash, Global.Instance.PeerId, Global.Instance.ListeningPort, uploaded, downloaded, remaining, true, false, type); SendRequest(request); }
public TrackerResponse AnnounceStart(byte[] infoHash, string peerId, ushort port, long downloaded, long uploaded, long left) { var request = new TrackerRequest(infoHash, peerId, port, uploaded, downloaded, left, true, true, EventType.Started, 100); return(GetResponse(request)); }
/// <summary> /// Sends a HTTP request to the tracker and returns the response. /// </summary> /// <param name="requestData">The data for the request that will be sent to the tracker.</param> /// <returns>The tracker's response.</returns> public TrackerResponse GetResponse(TrackerRequest requestData) { Contract.Requires(requestData != null); TrackerResponse response = null; if (PreferredAnnounce != null) response = AttemptGet(requestData, PreferredAnnounce); if (response == null) { foreach (string url in Announces) { if ((response = AttemptGet(requestData, url)) != null) { PreferredAnnounce = url; break; } } } return response; }
private void SendRequest(TrackerRequest request) { var response = _client.GetResponse(request); LastAnnounced = DateTime.Now; if (response == null || response.FailureReason != null) { if (request.Event == EventType.Started) { LastState = AnnounceState.StartFailure; } else { LastState = AnnounceState.Failure; } Period = TimeSpan.FromSeconds(20); } else { LastState = AnnounceState.Success; Period = TimeSpan.FromSeconds(response.Interval); OnPeersReceived(response.Endpoints); } }
private TrackerResponse AttemptGet(TrackerRequest requestData, string announceURL) { var parameters = new Dictionary <string, string> { { "info_hash", UrlEncode(requestData.InfoHash) }, { "peer_id", Uri.EscapeDataString(requestData.PeerId) }, { "port", requestData.Port.ToString() }, { "uploaded", requestData.Uploaded.ToString() }, { "downloaded", requestData.Downloaded.ToString() }, { "left", requestData.Left.ToString() }, { "compact", requestData.Compact ? "1" : "0" }, { "no_peer_id", requestData.OmitPeerIds ? "1" : "0" } }; if (requestData.Event != EventType.None) { parameters.Add("event", requestData.Event.ToString().ToLower()); } if (requestData.NumWant.HasValue) { parameters.Add("numwant", requestData.NumWant.ToString()); } var urlBuilder = new StringBuilder(); urlBuilder.Append(parameters.Select(kv => { if (kv.Value == null) { return(string.Empty); } return(kv.Key + "=" + kv.Value); }).ToDelimitedString("&")); if (!announceURL.Contains("?")) { announceURL += "?"; } else { announceURL += "&"; } var request = (HttpWebRequest)WebRequest.Create(announceURL + urlBuilder); request.KeepAlive = false; request.Method = "GET"; try { WebResponse response = request.GetResponse(); byte[] trackerResponse; using (var reader = new BinaryReader(response.GetResponseStream())) { using (var ms = new MemoryStream()) { var buffer = new byte[1024]; int len = 0; while ((len = reader.Read(buffer, 0, buffer.Length)) != 0) { ms.Write(buffer, 0, len); } trackerResponse = ms.ToArray(); } } response.Close(); return(new TrackerResponse(trackerResponse)); } catch (Exception e) { return(null); } }
private TrackerResponse AttemptGet(TrackerRequest requestData, string announceURL) { var parameters = new Dictionary<string, string> { {"info_hash", UrlEncode(requestData.InfoHash)}, {"peer_id", Uri.EscapeDataString(requestData.PeerId)}, {"port", requestData.Port.ToString()}, {"uploaded", requestData.Uploaded.ToString()}, {"downloaded", requestData.Downloaded.ToString()}, {"left", requestData.Left.ToString()}, {"compact", requestData.Compact ? "1" : "0"}, {"no_peer_id", requestData.OmitPeerIds ? "1" : "0"} }; if (requestData.Event != EventType.None) parameters.Add("event", requestData.Event.ToString().ToLower()); if (requestData.NumWant.HasValue) parameters.Add("numwant", requestData.NumWant.ToString()); var urlBuilder = new StringBuilder(); urlBuilder.Append(parameters.Select(kv => { if (kv.Value == null) return string.Empty; return kv.Key + "=" + kv.Value; }).ToDelimitedString("&")); if (!announceURL.Contains("?")) announceURL += "?"; else announceURL += "&"; var request = (HttpWebRequest) WebRequest.Create(announceURL + urlBuilder); request.KeepAlive = false; request.Method = "GET"; try { WebResponse response = request.GetResponse(); byte[] trackerResponse; using (var reader = new BinaryReader(response.GetResponseStream())) { using (var ms = new MemoryStream()) { var buffer = new byte[1024]; int len = 0; while ((len = reader.Read(buffer, 0, buffer.Length)) != 0) { ms.Write(buffer, 0, len); } trackerResponse = ms.ToArray(); } } response.Close(); return new TrackerResponse(trackerResponse); } catch (Exception e) { return null; } }
private void SendRequest(TrackerRequest request) { var response = client.GetResponse(request); LastAnnounced = DateTime.Now; if(response == null || response.FailureReason != null) { if (request.Event == EventType.Started) LastState = AnnounceState.StartFailure; else LastState = AnnounceState.Failure; Period = TimeSpan.FromSeconds(20); } else { LastState = AnnounceState.Success; Period = TimeSpan.FromSeconds(response.Interval); OnPeersReceived(response.Endpoints); } }