コード例 #1
0
ファイル: Client.cs プロジェクト: pigasksky/Brotorift
        public void BeginConnect(string hostname, int port)
        {
            if (this.CurrentState == ClientState.Connected)
            {
                return;
            }

            _client     = new TcpClient();
            _recvBuffer = new MemoryStream();
            _packetsToReceive.Clear();
            _packetsToSend.Clear();
            _wrongVersionInfo = null;

            this.CurrentState = ClientState.Connecting;
            _client.BeginConnect(hostname, port, this.OnConnected, null);
        }
コード例 #2
0
ファイル: Client.cs プロジェクト: pigasksky/Brotorift
        private void PushPackets()
        {
            _recvBuffer.Position = 0;
            while (_recvBuffer.Length - _recvBuffer.Position > 0)
            {
                var reader     = new BinaryReader(_recvBuffer);
                var packetType = reader.ReadByte();
                if (packetType == PacketType.ScPacketWrongVersion)
                {
                    var clientVersion = reader.ReadInt32();
                    var serverVersion = reader.ReadInt32();
                    lock ( _wrongVersionInfo )
                    {
                        _wrongVersionInfo = new WrongVersionInfo(clientVersion, serverVersion);
                    }
                }
                else if (packetType == PacketType.ScHeartbeat)
                {
                    _lastHeartbeatReceived = true;
                    _hbReceiveTimer        = 0.0f;
                }
                else if (packetType == PacketType.ScPacketData)
                {
                    var packetSize = reader.ReadInt32();
                    if (_recvBuffer.Length - _recvBuffer.Position < packetSize)
                    {
                        _recvBuffer.Position -= sizeof(int);
                        break;
                    }

                    var content = reader.ReadBytes(packetSize);
                    _receivePacketsLock.WaitOne();
                    _packetsToReceive.Enqueue(new InPacket(new MemoryStream(content)));
                    _receivePacketsLock.ReleaseMutex();
                }
            }

            if (_recvBuffer.Position > 0)
            {
                var newBuffer = new MemoryStream();
                newBuffer.Write(_recvBuffer.GetBuffer(), (int)_recvBuffer.Position, (int)(_recvBuffer.Length - _recvBuffer.Position));
                _recvBuffer = newBuffer;
            }
        }
コード例 #3
0
ファイル: Client.cs プロジェクト: pigasksky/Brotorift
        public void Connect(string hostname, int port)
        {
            if (this.CurrentState == ClientState.Connecting || this.CurrentState == ClientState.Connected)
            {
                return;
            }

            _client     = new TcpClient();
            _recvBuffer = new MemoryStream();
            _packetsToReceive.Clear();
            _packetsToSend.Clear();
            _wrongVersionInfo = null;

            _client.Connect(hostname, port);
            _justConnected    = true;
            this.CurrentState = ClientState.Connected;

            _stream     = _client.GetStream();
            _recvThread = new Thread(this.ReceiveLoop);
            _recvThread.Start();
        }
コード例 #4
0
ファイル: Client.cs プロジェクト: pigasksky/Brotorift
        public void Update(float deltaTime)
        {
            if (_justConnected)
            {
                _justConnected = false;
                if (this.connect != null)
                {
                    this.connect();
                }

                _heartbeatStarted = true;
                this.SendHeartbeat();
            }

            if (_heartbeatStarted)
            {
                _hbReceiveTimer += deltaTime;
                if (_hbReceiveTimer >= this.heartbeatReceiveTimeout)
                {
                    _hbReceiveTimer = 0.0f;
                    if (this.timeout != null)
                    {
                        this.timeout();
                    }

                    _heartbeatStarted = false;
                }

                _hbSendTimer += deltaTime;
                if (_hbSendTimer >= this.heartbeatSendRate)
                {
                    _hbSendTimer = 0.0f;
                    if (_lastHeartbeatReceived)
                    {
                        _hbReceiveTimer        = 0.0f;
                        _lastHeartbeatReceived = false;
                    }
                    this.SendHeartbeat();
                }
            }

            if (_wrongVersionInfo != null)
            {
                lock ( _wrongVersionInfo )
                {
                    if (this.versionMismatch != null)
                    {
                        this.versionMismatch(_wrongVersionInfo);
                        _wrongVersionInfo = null;
                        this.Close();
                        return;
                    }
                }
            }

            _receivePacketsLock.WaitOne();
            while (_packetsToReceive.Count > 0)
            {
                var packet = _packetsToReceive.Peek();
                if (packet == null)
                {
                    _packetsToReceive.Dequeue();
                    _receivePacketsLock.ReleaseMutex();
                    this.Close();
                    return;
                }

                var shouldDiscard = this.ProcessPacket(packet);
                if (shouldDiscard)
                {
                    _packetsToReceive.Dequeue();
                }
            }
            _receivePacketsLock.ReleaseMutex();

            while (_packetsToSend.Count > 0)
            {
                var packet = _packetsToSend.Dequeue();
                var result = this.DoSendPacket(packet);
                if (result == false)
                {
                    this.Close();
                    return;
                }
            }

            return;
        }