/// <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++; }
public InactiveRequest NewRequest(int index) { InactiveRequest result = requests[requests.Count - 1]; requests.RemoveAt(requests.Count - 1); return(result); }
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(); }
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); }
/// <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); }
/// <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++; }
public void RequestLost(int index, InactiveRequest request) { }
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(); } } } }