Пример #1
0
        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();
            }
        }
Пример #2
0
 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);
         }
     }
 }
Пример #3
0
 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)]}");
     }
 }
Пример #4
0
        /*
         *  这个函数返回某个文件所有的位置信息;由于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);
            }
        }