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 { } }
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); }
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); } }
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); }
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)); } }
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); } }
void _RecvAck(_TPeersExtIt itPeerExt_) { itPeerExt_.Data.RecvAck(); }