TPeerCnt _UnLinkCore() { if (_Key == null) { return(TPeerCnt.MaxValue); } if (_Socket != null) { _Socket.Close(); _Socket = null; } _RecvHeader = null; _StreamSndTail = 0; _RecvPacketSeq = 0; _SendPacketSeq = 0; _StreamRcv.Clear(); _StreamSnd.Clear(); _LongIP = 0; _Sending = false; _Connected = false; _ConnectTime = 0; _ConnectTimeOut = 0; _Connecting = false; var PeerNum = _Key.PeerNum; _Key = null; return(PeerNum); }
bool _SendPing() { if (_PingTime != null) { return(true); } try { _SendBegin(EPacketType.Ping); _PingPacketSeq = _SendPacketSeq + 1; _PingTime = DateTime.Now; _SendEnd(); return(true); } catch { return(false); } }
public ERecvState RecvedBegin() { // For Header ///////////////////// if (_RecvHeader == null) { if (StreamRcv.Size < _HeaderSize) { return(ERecvState.NoData); } _RecvHeader = new SHeader(); _RecvHeader.Push(StreamRcv); } // For Body ///////////////////// if (StreamRcv.Size < _RecvHeader.Size) { return(ERecvState.NoData); } if (_RecvHeader.SendPacketSeq != (_RecvPacketSeq + 1)) { throw new Exception("PacketSeq Error " + _RecvHeader.SendPacketSeq.ToString() + ", " + (_RecvPacketSeq + 1).ToString()); } _RecvPacketSeq = _RecvHeader.SendPacketSeq; _Crypto.Decode(StreamRcv.Data, StreamRcv.Head, _RecvHeader.Size, (0x1f3a49b72c8d5ef6 ^ (UInt64)_RecvHeader.Size ^ _RecvHeader.CheckSum ^ _RecvHeader.SendPacketSeq)); if (_RecvHeader.CheckSum != core.CBase.GetCheckSum(StreamRcv.Data, StreamRcv.Head, _RecvHeader.Size)) { throw new Exception("CheckSum Error"); } var OldStreamSize = StreamRcv.Size; var Header2 = new SHeader2(); Header2.Push(StreamRcv); _RecvHeader.Size -= (OldStreamSize - StreamRcv.Size); StreamRcv.SaveState(); switch (Header2.PacketType) { case EPacketType.Ping: if (!_SendPong()) { throw new Exception("_SendPong Fail"); } return(ERecvState.PingPong); case EPacketType.Pong: if (Header2.RecvPacketSeq == _PingPacketSeq) { _Latency = DateTime.Now - _PingTime.Value; _PingTime = null; } return(ERecvState.PingPong); case EPacketType.User: break; default: throw new Exception("Invalid Packet Type"); } return(ERecvState.UserData); }
void _Recved() // 수신 처리 { if (_RecvEvent.SocketError != SocketError.Success) { _UnLink(ENetState.Normal); return; } if (_RecvEvent.BytesTransferred == 0) { _UnLink(ENetState.Normal); return; } _HBRcvPeriod.NextLoose(); if (!_StreamRcv.Push(_aRecvBuf.SubArray(0, _RecvEvent.BytesTransferred))) { _UnLink(ENetState.Normal); return; } while (true) { // For Header ///////////////////// if (_RecvHeader == null) { if (_StreamRcv.Size < c_HeaderSize) { break; } try { _RecvHeader = new SHeader(); } catch { _UnLink(ENetState.Normal); return; } if (!_StreamRcv.Pop(_RecvHeader)) { _UnLink(ENetState.Normal); return; } } // For Body ///////////////////// if (_StreamRcv.Size < _RecvHeader.Size) { break; } if (_RecvHeader.Size > 0) { if (_RecvHeader.PacketSeq <= _RecvPacketSeq && (_RecvPacketSeq - _RecvHeader.PacketSeq) < (TPacketSeq.MaxValue << 1)) { _UnLink(ENetState.Normal); return; } _RecvPacketSeq = _RecvHeader.PacketSeq; var Body = _StreamRcv.GetStream(_RecvHeader.Size); _Crypto.Decode(Body, (0x1f3a49b72c8d5ef6 ^ (UInt64)_RecvHeader.Size ^ _RecvHeader.CheckSum ^ _RecvHeader.PacketSeq)); for (int i = 0; i < Body.Count(); ++i) { _StreamRcv.SetAt(_StreamRcv.Head + i, Body[i]); } if (_RecvHeader.CheckSum != CBase.GetCheckSum(Body)) { _UnLink(ENetState.Normal); return; } var OldSize = _StreamRcv.Size; var OldHead = _StreamRcv.Head; var OldTail = _StreamRcv.Tail; _StreamRcv.Tail = _StreamRcv.Head + _RecvHeader.Size; // For Notifying Received Size to RecvFunc _RecvFunc(_Key.PeerNum, _StreamRcv); if (_Key == null) { return; } // 외부에서 모두 Pop하지 않았거나 Stream에 대해서 Clear 하지 않아도 상관 없으므로 에러 체크하지 않음. //if (_StreamRcv.Size != OldSize - _RecvHeader.Size) // throw new Exception("Did Not Receive Whole Protocol"); if (OldSize > _RecvHeader.Size) { _StreamRcv.Head = OldHead + _RecvHeader.Size; _StreamRcv.Tail = OldTail; } else { _StreamRcv.Clear(); } } _RecvHeader = null; } if (_Socket == null) { return; } if (!_Recv()) { _UnLink(ENetState.Normal); return; } }