/// <summary> /// Heartbeart Timer /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void _heartbeatTimer_Elapsed(object sender, ElapsedEventArgs e) { // Stop the Timer _heartbeatTimer.Stop(); if (!_socket.Connected) { return; } // Send Heartbeat Msg var request = new Messages.Heartbeat(); SendData(request); // Heartbeat Management _heartbeatSendCount++; if (_heartbeatsMissed > 0) { var errmsg = "WARNING - " + _heartbeatsMissed + " Heartbeats have been Missed"; OnErrorEvent(new ErrorEventArgs(null, errmsg)); } // Check for Heartbeat Errors _heartbeatsMissed += Math.Abs(_heartbeatSendCount - _heartbeatReceiveCount); if (_heartbeatsMissed > Protocol.HeartbeatLossMaximum) { var msg = $"Exceeded HEARTBEAT_LOSS_MAXIMUM {Protocol.HeartbeatLossMaximum}"; OnErrorEvent(new ErrorEventArgs(null, msg)); Disconnect(); } // Restart the Timer _heartbeatTimer.Start(); }
private void _receiveWorker_DoWork(object sender, DoWorkEventArgs e) { while (true) { while (_receiveQueue.Count > 0) { // Dequeue _receiveQueue.TryDequeue(out var packet); if (packet == null) { return; } // Message Processing var message = Utils.GetString(packet); var messageType = Utils.GetMessageType(packet); OnMessageReceiveEvent(messageType.ToString()); OnRawMessageReceiveEvent(packet, messageType); // ReSharper disable once SwitchStatementMissingSomeCases switch (messageType) { case Protocol.MessageType.GeneralLogMessage: { var response = JsonConvert.DeserializeObject <Messages.GeneralLogMessage>(message); OnInformationEvent(response.MessageText); break; } case Protocol.MessageType.Heartbeat: { LatestHeartbeatReceived = JsonConvert.DeserializeObject <Messages.Heartbeat>(message); if (LatestHeartbeatReceived.NumDroppedMessages > 0) { OnInformationEvent("DTC Server Reports " + LatestHeartbeatReceived.NumDroppedMessages + " Dropped Heartbeats"); } _heartbeatReceiveCount++; _heartbeatsMissed = 0; break; } case Protocol.MessageType.LogonResponse: { if (!_loginComplete) { LogonResponse = JsonConvert.DeserializeObject <Messages.LogonResponse>(message); // Flag Login as Complete _loginComplete = true; _heartbeatTimer.Start(); } break; } case Protocol.MessageType.MarketDataSnapshot: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.MarketDataUpdateBidAsk: { var response = JsonConvert.DeserializeObject <Messages.MarketDataUpdateBidAsk>(message); OnMarketDataBidAskEvent(response); break; } case Protocol.MessageType.MarketDataUpdateBidAskCompact: { var response = JsonConvert.DeserializeObject <Messages.MarketDataUpdateBidAskCompact>(message); OnMarketDataBidAskEvent(new Messages.MarketDataUpdateBidAsk(response)); break; } case Protocol.MessageType.MarketDataUpdateSessionHigh: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.MarketDataUpdateSessionHighInt: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.MarketDataUpdateLastTradeSnapshot: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.MarketDataUpdateSessionLow: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.MarketDataUpdateSessionLowInt: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.MarketDataUpdateSessionNumTrades: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.MarketDataUpdateSessionOpen: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.MarketDataUpdateSessionOpenInt: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.MarketDataUpdateSessionSettlement: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.MarketDataUpdateSessionSettlementInt: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.MarketDataUpdateSessionVolume: { /* No Action - Output Handled by Raw Message Event */ break; } case Protocol.MessageType.SecurityDefinitionReject: { var response = JsonConvert.DeserializeObject <Messages.SecurityDefinitionReject>(message); var error = "Security Definition Request " + response.RequestID + " was rejected with message '" + response.RejectText + "'"; OnErrorEvent(new ErrorEventArgs(null, error)); break; } case Protocol.MessageType.SecurityDefinitionResponse: { var response = JsonConvert.DeserializeObject <Messages.SecurityDefinitionResponse>(message); OnSymbolInformationEvent(response); break; } default: { // Unsupported Message Type OnErrorEvent(new ErrorEventArgs(null, "Message Type " + messageType.ToString() + " Not Supported")); break; } } } Thread.Sleep(1); } }