Пример #1
0
        public override void Initialize()
        {
            IsHost = false;
AquirePeerID:
            DateTime time = DateTime.Now;

            status = new PeerStatus()
            {
                ID           = Core.user?.ID.ToString("00"),
                LastActivity = time
            };

            exe = new ServerExecute {
                svr = this
            };

            Response resp = client.Peer(status.ID, 0U, "add me");

            if (resp.result == (byte)Response.Result.notfound)
            {
                (DBLive Live, DBPeople People, DBHistory History, DBSettings Settings, PeerStatus peer)tup = resp.obj;
                Live = tup.Live; People = tup.People; History = tup.History; Settings = tup.Settings;

                status.ID = tup.peer.ID; status.LastActivity = tup.peer.LastActivity; status.LastPoint = tup.peer.LastPoint;

                Log($"Using peer ID {status.ID}");
                Log("Downloaded Peer Database");
            }
            else if (resp.result == (byte)Response.Result.ok)
            {
                //Somene is using that PeerID
                Log($"Somene is using that PeerID. Changing...");
                goto AquirePeerID;
            }
            else
            {
                Log($"Fatel error. Cannot Download Peer Databases. {resp.msg} \t {resp.expr}");
            }



            timer          = new System.Timers.Timer(3000);
            timer.Elapsed += Timer_Elapsed;
            timer.Start();
        }
Пример #2
0
        public void Peer()
        {
            Response resp = client.Peer(status.ID, status.LastPoint);

            if (resp.result == (byte)Response.Result.ok)
            {
                var pack = (PeerPackage)resp.obj;

                if (status.LastPoint == pack.Point)
                {
                    return;
                }
                if (pack.requests == null)
                {
                    Log("!!! Peer server recieved null request array");
                    return;
                }

                if (IsDebug)
                {
                    Log($"Peered {pack.requests.Length} requests");
                }

                foreach (var req in pack.requests)
                {
                    Respond(req);
                    if (IsDebug)
                    {
                        Log($"Peer {status.ID} : Processed {((Request.Command)req.command).ToString()} {req.db}.{req.expr}  - {string.Join(" ", req.para)} ~ {VisualizeObj(req.para[0])}");
                    }
                }

                status.LastPoint = pack.Point;
            }
            else if (resp.result == (byte)Response.Result.notfound)
            {
                (DBLive Live, DBPeople People, DBHistory History, DBSettings Settings, PeerStatus peer)tup = resp.obj;
                Live = tup.Live; People = tup.People; History = tup.History; Settings = tup.Settings; status = tup.peer;
                Log("Downloaded Peer Database again. Looks like we were inactive for a while. Check your network connection");
            }
            else
            {
                Log($"Fatel error. Cannot Peer. {resp.msg} \t {resp.expr}");
            }
        }
Пример #3
0
        public virtual Response RespondPeerReq(string PeerID, uint ReqPeerPoint, string expr)
        {
            PeerStatus peer;

            switch (expr)
            {
            case "add me":
ExtendPeerID:

                LastPeerIndex++;

                PeerID = $"{PeerID}{LastPeerIndex}";

                if (Peers.ContainsKey(PeerID))
                {
                    goto ExtendPeerID;
                }

                break;

            case "reload":
                if (Peers.TryGetValue(PeerID, out peer))
                {
                    peer.LastPoint = CurrentPeerPoint;
                    return(new Response(Response.Result.ok, null, "reload", (Live, People, Settings)));
                }
                break;
            }


            while (PeeringBusy)
            {
                System.Threading.Thread.Sleep(10);
            }

            PeeringBusy = true;

            lock (Peers)
            {
                if (!Peers.TryGetValue(PeerID, out peer))
                {
                    //New peer

                    peer = new PeerStatus()
                    {
                        ID = PeerID, LastActivity = DateTime.Now, LastPoint = CurrentPeerPoint
                    };
                    Peers.Add(PeerID, peer);
                    Log($"Added new peer {PeerID}");
                    PeeringBusy = false;
                    return(new Response(Response.Result.notfound, null, "new peer", (Live, People, History, Settings, peer)));
                }


                peer.LastActivity = DateTime.Now;
                peer.LastPoint    = ReqPeerPoint;

                int count = (int)(CurrentPeerPoint - peer.LastPoint);

                PeeringBusy = false;
                if (count == 0)
                {
                    return(new Response(Response.Result.ok, null, null, new PeerPackage()
                    {
                        Point = CurrentPeerPoint
                    }));
                }


                PeerPackage pack = new PeerPackage()
                {
                    Point = CurrentPeerPoint, requests = new Request[count]
                };

                Requests.CopyTo(pack.requests, (int)(peer.LastPoint - MinPeerPoint), count);


                Log($"Sent {count} requests to peer {PeerID} {{ {peer.LastPoint} to {CurrentPeerPoint} }} {VisualizeObj(pack.requests)}");

                peer.LastPoint = CurrentPeerPoint;

                PeeringBusy = false;
                return(new Response(Response.Result.ok, null, null, pack));
            }
        }