コード例 #1
0
        void _OnPeerLink(ISystemPipeline system)//现在能区分主叫 connect 和 被叫 accept了
        {
            var pipe = linkNodes[system.PeerID];

            //主叫被叫都尝试加入对方网络
            logger.Info("--------------------------》_OnPeerLink:id/" + system.PeerID + "         IPEndPoint/" + system.Remote + "              BeAccepted:" + system.IsHost);

            Tell_ReqJoinPeer(pipe.remoteNode);
            if (this.isProved)
            {
                //告诉我你是否是共识节点或者能否到达共识节点
                Tell_Post_TouchProvedPeer(pipe.remoteNode, string.Empty, this.guid.ToString());
            }
            logger.Info("_OnPeerLink" + system.PeerID);
        }
コード例 #2
0
        public unsafe void OpenNetwork(PeerOption option)
        {
            if (peer != null)
            {
                throw new Exception("already have init peer.");
            }
            peer = AllPet.peer.tcp.PeerV2.CreatePeer(logger);
            peer.Start(option);
            peer.OnClosed += (id) =>
            {
                if (this.linkedIP.TryRemove(id, out string _remotestr))
                {
                    if (this.refSystems.TryRemove(_remotestr, out ISystemPipeline remote))
                    {
                        (remote as RefSystemRemote).Close();
                    }
                    Console.WriteLine("close line=" + id);
                }
            };
            peer.OnLinkError += (id, err) =>
            {
                Console.WriteLine("OnLinkError line=" + id + " ,err=" + err.ToString());
                //var remotestr = linkedIP[id];
                //if (this.refSystems.TryRemove(remotestr, out ISystemPipeline remote))
                //{
                //    (remote as RefSystemRemote).Close(); ;
                //}
            };
            peer.OnRecv += (id, data) =>
            {
                //if (data.Length == 0)
                //{
                //    throw new Exception("err h01");
                //}
                int    seek    = 0;
                var    fromlen = data[seek]; seek++;
                string from    = System.Text.Encoding.UTF8.GetString(data, seek, fromlen); seek += fromlen;
                var    tolen   = data[seek]; seek++;
                string to      = System.Text.Encoding.UTF8.GetString(data, seek, tolen); seek += tolen;
                //if (from == "" || to =="")
                //{
                //    throw new Exception("err h02");
                //}
                var remotestr = linkedIP[id];
                var refsys    = this.refSystems[remotestr];
                var pipe      = this.GetPipelineByFrom(refsys, "@" + id + "/" + from, "this/" + to) as PipelineRefLocal;
                //var pipe = this.GetPipeline(user, "this/" + to);
                var outbytes = new byte[data.Length - seek];
                fixed(byte *pdata = data, pout = outbytes)
                {
                    Buffer.MemoryCopy(pdata + seek, pout, outbytes.Length, outbytes.Length);
                }

                pipe.TellDirect(outbytes);
            };

            peer.OnAccepted += (ulong id, IPEndPoint endpoint) =>
            {
                var remotestr = endpoint.ToString();
                linkedIP[id] = remotestr;
                RefSystemRemote remote = new RefSystemRemote(this, peer, endpoint, id, true);
                //remote.linked = true;
                (remote as RefSystemRemote).Linked(id, true, endpoint);
                this.refSystems[remotestr] = remote;

                Console.WriteLine("on accepted." + id + " = " + endpoint);
            };

            peer.OnConnected += (ulong id, IPEndPoint endpoint) =>
            {
                //lock (endpoint)//这个锁比较粗糙,临时增加,因为有可能Connect之后执行了一半,进入这里
                //               //后面考虑从更底层做操作
                //{
                //    if (this.linkedIP.ContainsKey(id) == false)
                //    {

                //        var __remotestr = endpoint.ToString();
                //        this.linkedIP[id] = __remotestr;
                //        RefSystemRemote __remote = new RefSystemRemote(this, peer, endpoint, id, false);
                //        __remote.linked = true;
                //        this.refSystems[__remotestr] = __remote;
                //        __remote.Linked(id, false, endpoint);
                //        logger.Info("==link now== systemid" + id);

                //    }
                //    else
                {
                    var remotestr = this.linkedIP[id];
                    if (this.refSystems.ContainsKey(remotestr) == false)
                    {
                        logger.Warn("意外的值");
                    }
                    var remote = this.refSystems[remotestr] as RefSystemRemote;
                    //remote.linked = true;
                    (remote as RefSystemRemote).Linked(id, false, endpoint);
                    logger.Info("==link delay== systemid" + id);
                }
                //}
                //this.linkedIP[id] = endpoint.ToString();

                ////主动连接成功,创建一个systemRef
                //var remotestr = this.linkedIP[id];
                //RefSystemRemote remote = new RefSystemRemote(peer, remotestr, id);
                //remote.linked = true;
                //this.refSystems[remotestr] = remote;
                Console.WriteLine("on OnConnected." + id + " = " + endpoint);
            };
        }