static void Main(string[] args) { List <FileMetaData> downloadList = new List <FileMetaData>(); List <FileMetaData> uploadList = new List <FileMetaData>(); for (var i = 0; i < args.Length;) { if (args[i][0] == '-') { if (args[i] == "-D" || args[i] == "--download") { i++; downloadList.Add(ParseFromFile(args[i])); i++; } else if (args[i] == "-U" || args[i] == "--upload") { i++; uploadList.Add(ParseFromFile(args[i])); i++; } else if (args[i] == "-G" || args[i] == "--generate") { i++; var name = args[i]; var ip = IPAddress.Parse(args[++i]); var name_b = Encoding.UTF8.GetBytes(name); var length = 0; using (var fs = File.Open(name, FileMode.Open)) { length = (int)fs.Length; } FileMetaData data = new FileMetaData(name, SHA256.Create().ComputeHash(name_b), ip, length); File.WriteAllText(name + ".meta", FileMetaData.Serialize(data)); i++; } else { Console.WriteLine("invaild command"); return; } } else { Console.WriteLine("invaild command"); return; } } // 初始化工作 LocalIP.Init(); Logger.Init(); if (downloadList.Count != 0 || uploadList.Count != 0) { var fmanager = new FileManager(); var client = new Client(downloadList, uploadList, fmanager); client.Start(); } }
public void AddOrRefreshFileInfo(byte[] hash, IPAddress ip, ICollection <int> indexs) { lock (fileStats[GetFindex(hash)]) { // 如果Ip是本机ip,要相信自己的数据,而不是外面传回的数据 if (!LocalIP.IfLocalIp(ip)) { fileStats[GetFindex(hash)].AddOrRefreshLocateInfo(ip, indexs); } } }
public void SetRemoteBlockPresentStat(byte[] hash, IPAddress ip, int index, bool value) { lock (fileStats[GetFindex(hash)]) { // 如果Ip是本机ip,要相信自己的数据,而不是外面传回的数据 if (!LocalIP.IfLocalIp(ip)) { fileStats[GetFindex(hash)].SetRemotePresentStat(ip, index, value); } _logger.Debug($"fileStat of {hash}\n {fileStats[GetFindex(hash)]}"); } }
/* * 这个函数返回某个文件所有的位置信息;由于fileStats数组中没有自己的信息, * 所以需要把自己的信息(如果有的话)附加上。 * 由于在我们的设定中,server的信息是不返回的, * 所以还要进行一下判断,如果hash的Server是本机,则不返回本机信息 */ public List <LocateInfo> ProvideLocateInfo(byte[] hash, IPAddress localIP) { if (!hashToFIndex.ContainsKey(hash)) { return(new List <LocateInfo>()); } else { var stat = fileStats[GetFindex(hash)]; var info = stat.locateInfos; var local_info = stat.GetLocallLocateInfo(localIP); // 本机有这个文件的信息 且 这个文件的Server不是本机 if (!LocalIP.IfLocalIp(stat.Server) && local_info.Indexs.Count != 0) { info.Add(local_info); } return(info); } }