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); }
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; } }
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(); }
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; }