Esempio n. 1
0
 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);
 }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
        /// <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;
        }
Esempio n. 6
0
        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);
            }
        }
Esempio n. 7
0
        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);
            }
        }
Esempio n. 8
0
        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;
            }
        }
Esempio n. 9
0
 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);
     }
 }
Esempio n. 10
0
 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);
 }