コード例 #1
0
 /// <summary>
 /// 如果向某个peer发送的获取“子片断”的请求丢失了,那么调用此函数
 /// </summary>
 /// <param name="index">子片断索引号</param>
 /// <param name="request">请求子片断的信息</param>
 public void RequestLost(int index, InactiveRequest request)
 {
     inactiveRequests[index].Add(request);
     inactiveRequests[index].Sort();
     numActive[index]--;
     totalInactive++;
 }
コード例 #2
0
        public InactiveRequest NewRequest(int index)
        {
            InactiveRequest result = requests[requests.Count - 1];

            requests.RemoveAt(requests.Count - 1);
            return(result);
        }
コード例 #3
0
        public void RequestLost(int index, InactiveRequest request)
        {
            Console.WriteLine("{0},{1}", index, remaining.Count);

            active[index].Remove(request);
            remaining[index].Add(request);
            remaining[index].Sort();
        }
コード例 #4
0
        public InactiveRequest NewRequest(int index)
        {
            InactiveRequest newRequest = remaining[index][remaining[index].Count - 1];

            remaining[index].RemoveAt(remaining[index].Count - 1);
            active[index].Add(newRequest);
            active[index].Sort();
            return(newRequest);
        }
コード例 #5
0
        /// <summary>
        /// 为指定片断创建一个request 消息,返回的是一个二元组,例如(32k, 16k),表示“子片断”的起始位置是32k ,大小是16k。
        /// </summary>
        /// <param name="index">片断索引号</param>
        /// <returns>返回第index个片断的起始位置最小的请求信息</returns>
        public InactiveRequest NewRequest(int index)
        {
            //numActive[index]记录了已经为第index个片断发出的request数量。
            numActive[index]++;

            //totalInactive记录了尚没有发出request的子片断总的大小。
            totalInactive--;

            //从 inactiveRequest中移出最小的那个request(也就是起始位置最小)。
            List <InactiveRequest> requests   = inactiveRequests[index];
            InactiveRequest        minRequest = InactiveRequest.Min(requests);

            requests.Remove(minRequest);

            return(minRequest);
        }
コード例 #6
0
        /// <summary>
        /// 产生第index个片断的所有请求信息
        /// </summary>
        /// <param name="index">片断的索引号</param>
        /// <param name="length">片断的长度</param>
        private void MakeInactiveRequest(int index, int length)
        {
            List <InactiveRequest> requestList = inactiveRequests[index];

            //子片断在片断的偏移位置
            int offset;
            int notLastLength = length - requestSize;

            //添加每个子片断的请求信息
            for (offset = 0; offset < notLastLength; offset += requestSize)
            {
                InactiveRequest request = new InactiveRequest(offset, requestSize);
                requestList.Add(request);
                totalInactive++;
            }

            //添加最后一个子片断的请求信息
            InactiveRequest lastRequest = new InactiveRequest(offset, length - offset);

            requestList.Add(lastRequest);
            totalInactive++;
        }
コード例 #7
0
 public void RequestLost(int index, InactiveRequest request)
 {
 }
コード例 #8
0
        public void FixDownload()
        {
            if (requests.Count == downloader.BackLog)
            {
                return;
            }

            int piece = downloader.PiecePicker.Next(this.Want);

            if (piece == -1)
            {
                if (interested && requests.Count == 0)
                {
                    interested = false;
                    connection.SendNotInterested();
                }
            }

            else
            {
                if (!interested)
                {
                    interested = true;
                    connection.SendInterested();
                }

                if (choked)
                {
                    return;
                }

                bool hit = false;

                while (piece != -1)
                {
                    while (requests.Count < downloader.BackLog)
                    {
                        InactiveRequest inactiveRequest = downloader.StorageWrapper.NewRequest(piece);
                        downloader.PiecePicker.Requested(piece);
                        requests.Add(new ActiveRequest(piece, inactiveRequest.Begin, inactiveRequest.Length));
                        connection.SendRequest(piece, inactiveRequest.Begin, inactiveRequest.Length);
                        if (!downloader.StorageWrapper.DoIHaveRequests(piece))
                        {
                            hit = true;
                            break;
                        }
                    }

                    if (requests.Count == downloader.BackLog)
                    {
                        break;
                    }

                    piece = downloader.PiecePicker.Next(this.Want);
                }

                if (hit)
                {
                    foreach (NormalSingleDownload download in downloader.Downloads)
                    {
                        download.FixDownload();
                    }
                }
            }
        }