/// <summary> /// Method used to return chunk to requestors. When it is invoked from a remote peer /// it invokes the saveOnBuffer method to store the chunk into the buffer. At the end this /// method reset the peer status. /// </summary> /// <param name="chkrs">Message used to transport the payload of a chunk</param> public void ReturnChunk(ChunkResponse chkrs) { log.Info("Arrived chunk from peer!"); this.saveOnBuffer(chkrs.CID, chkrs.Payload); this.peerQueue.ResetPeer(chkrs.SenderAddress.AbsoluteUri, chkrs.ServingBuffer); }
/// <summary> /// Method used to request the download of a chunk from the network. When it is invoked from /// a remote peer it gets the chunk from the file and calls back the ReturnChunk method /// of the requestor. /// </summary> /// <param name="chkrq">Message used to pass information about the Chunk requested</param> public void GetChunk(ChunkRequest chkrq) { log.Info("Received request to send chunk!"); servingBuffer++; TrackModel track = new TrackModel(); RepositoryResponse resp = trackRepository.GetByKey<TrackModel.Track>(chkrq.RID, track); log.Debug("Searching track " + track + " in repository"); if (resp >= 0) { log.Debug("Track found! Extracting chunk."); byte[] data; using (FileStream fs = new FileStream(track.Filepath, FileMode.Open, FileAccess.Read, FileShare.Read)) { int limit = (System.Convert.ToInt32(fs.Length) > (chunkLength * 1024 * (chkrq.CID + 1))) ? chunkLength * 1024 * (chkrq.CID + 1) : (System.Convert.ToInt32(fs.Length)); int begin = chkrq.CID * chunkLength * 1024; data = new byte[limit - begin]; Console.WriteLine("Reading chunk " + chkrq.CID + " (" + (chkrq.CID * chunkLength * 1024) + " => " + limit + ")"); fs.Seek(begin, SeekOrigin.Begin); fs.Read(data, 0, (limit - begin)); fs.Close(); } ChunkResponse chkrs = new ChunkResponse(servingBuffer, chkrq.RID, chkrq.CID, data, myAddress); if (chkrq.SenderAddress != myAddress) { ITransportProtocol svc = ChannelFactory<ITransportProtocol>.CreateChannel( new NetUdpBinding(), new EndpointAddress(chkrq.SenderAddress) ); svc.ReturnChunk(chkrs); } else { this.ReturnChunk(chkrs); } log.Debug("Chunk sent to " + chkrq.SenderAddress); } servingBuffer--; }