示例#1
0
            void _UnLink(_TPeersExtIt itPeerExt_, ENetRet NetRet_)
            {
                if (itPeerExt_.Data.itPeerWillExpire)
                {
                    _PeersWillExpire.Remove(itPeerExt_.Data.itPeerWillExpire);
                    itPeerExt_.Data.itPeerWillExpire = _PeersWillExpire.End();
                }

                var ExtKey         = itPeerExt_.Data.Key;
                var HaveBeenLinked = itPeerExt_.Data.HaveBeenLinked;

                _PeersExt.Remove(itPeerExt_);

                try
                {
                    if (HaveBeenLinked)
                    {
                        _UnLinkFunc(ExtKey, NetRet_);
                    }
                    else
                    {
                        _LinkFailFunc(ExtKey.PeerNum, NetRet_);
                    }
                }
                catch
                {
                }
            }
示例#2
0
            void _Close(_TPeersExtIt itPeerExt_)
            {
                if (itPeerExt_.Data.NetKey)
                {
                    var itPeerNet = _PeersNet.Get((Int32)itPeerExt_.Data.NetKey.PeerNum);
                    if (itPeerNet)
                    {
                        itPeerNet.Data.ExtKey = null;

                        if (_Net.IsLinked(itPeerExt_.Data.NetKey.PeerNum))
                        {
                            _SendUnLink(itPeerExt_.Data.NetKey.PeerNum);
                        }
                        else
                        {
                            _Net.Close(itPeerExt_.Data.NetKey.PeerNum);
                        }
                    }
                }
                if (itPeerExt_.Data.itPeerWillExpire)
                {
                    _PeersWillExpire.Remove(itPeerExt_.Data.itPeerWillExpire);
                    itPeerExt_.Data.itPeerWillExpire = _PeersWillExpire.End();
                }

                _UnLink(itPeerExt_, ENetRet.UserClose);
            }
示例#3
0
            bool _Connect(_TPeersExtIt itPeerExt_)
            {
                try
                {
                    var itPeerNet = _PeersNet.Add(new _SPeerNet(itPeerExt_.Data.Key));

                    try
                    {
                        var NetKey = _Net.Connect(itPeerExt_.Data.NamePort, (TPeerCnt)itPeerNet.Index);
                        if (NetKey == null)
                        {
                            throw new Exception();
                        }

                        itPeerExt_.Data.NetKey = NetKey;
                        itPeerExt_.Data.itPeerWillExpire.Data.NeedToConnect = false;
                        return(true);
                    }
                    catch
                    {
                        _PeersNet.Remove(itPeerNet);
                        throw;
                    }
                }
                catch
                {
                    return(false);
                }
            }
示例#4
0
            void _RecvReLink(CKey NetKey_, _TPeersNetIt itPeerNet_, _TPeersExtIt itPeerExt_, CStream Stream_)
            {
                var Proto = new SReLinkSc();

                Stream_.Pop(Proto);

                _PeersWillExpire.Remove(itPeerExt_.Data.itPeerWillExpire);
                itPeerExt_.Data.itPeerWillExpire = _PeersWillExpire.End();

                TProtoSeq MustDeleteCnt = (Proto.ServerProtoSeqMustRecv - itPeerExt_.Data.ProtoSeqFirstForSendProtos); // 0 이상의 값이 나와야 함.(조작에의해 음수(큰 양수)가 나오더라도 상관없음

                for (var it = itPeerExt_.Data.SendProtos.Begin(); it;)
                {
                    if (MustDeleteCnt == 0)
                    {
                        break;
                    }

                    var itCheck = it;
                    it.MoveNext();

                    itCheck.Data.Clear();
                    itPeerExt_.Data.SendProtos.Remove(itCheck);
                    --MustDeleteCnt;
                }
                itPeerExt_.Data.ProtoSeqFirstForSendProtos = Proto.ServerProtoSeqMustRecv;

                foreach (var i in itPeerExt_.Data.SendProtos)
                {
                    _Net.Send(NetKey_, new SHeaderCs(EProtoCs.ReSend), i);
                }

                _LinkFuncSoft(itPeerExt_.Data.Key, itPeerExt_.Data.NamePort);
            }
示例#5
0
            void _RecvUserProto(_TPeersExtIt itPeerExt_, CStream Stream_)
            {
                ++itPeerExt_.Data.ProtoSeqMustRecv;

                var ExtKey = itPeerExt_.Data.Key;

                _RecvFunc(ExtKey, Stream_);

                var itPeerExt = _PeersExt.Get((Int32)ExtKey.PeerNum); // _RecvFunc 내부에서 throw or Close 할 수 있으므로 재확인

                if (itPeerExt && itPeerExt.Data.NetKey)
                {
                    _Net.Send(itPeerExt.Data.NetKey, new SHeaderCs(EProtoCs.Ack));
                }
            }
示例#6
0
            void _RecvLink(_TPeersNetIt itPeerNet_, _TPeersExtIt itPeerExt_, CStream Stream_)
            {
                var Proto = new SLinkSc();

                Stream_.Pop(Proto);

                itPeerExt_.Data.ServerExtKey = new CKey(Proto.ServerExtKey);
                _PeersWillExpire.Remove(itPeerExt_.Data.itPeerWillExpire);
                itPeerExt_.Data.itPeerWillExpire = _PeersWillExpire.End();

                if (!itPeerExt_.Data.HaveBeenLinked)
                {
                    itPeerExt_.Data.HaveBeenLinked = true;
                    _LinkFunc(itPeerExt_.Data.Key, itPeerExt_.Data.NamePort);
                }
            }
示例#7
0
 void _RecvAck(_TPeersExtIt itPeerExt_)
 {
     itPeerExt_.Data.RecvAck();
 }