/// <summary> /// Handling replies to a data push, a historical data request, or an available data request /// </summary> private void HistoricalDataSocketReceiveReady(object sender, NetMQSocketEventArgs e) { lock (historicalDataSocketLock) { if (historicalDataSocket == null) { return; } // 1st message part: what kind of stuff we're receiving DataRequestMessageType type = (DataRequestMessageType)BitConverter.ToInt16(historicalDataSocket.ReceiveFrameBytes(), 0); switch (type) { case DataRequestMessageType.Error: HandleErrorReply(); break; case DataRequestMessageType.AvailableDataReply: HandleAvailabledataReply(); break; case DataRequestMessageType.HistReply: HandleHistoricalDataRequestReply(); break; case DataRequestMessageType.HistPushReply: HandleDataPushReply(); break; default: throw new ArgumentOutOfRangeException(); } } }
/// <summary> /// Process replies on the request socket. /// Heartbeats, errors, and subscribing to real time data streams. /// </summary> private void RealTimeRequestSocketReceiveReady(object sender, NetMQSocketEventArgs e) { lock (realTimeRequestSocketLock) { string reply = realTimeRequestSocket?.ReceiveFrameString(); if (reply == null) { return; } DataRequestMessageType mesageTye = (DataRequestMessageType)BitConverter.ToInt16(realTimeRequestSocket.ReceiveFrameBytes(), 0); RealTimeDataRequest request; switch (mesageTye) { case DataRequestMessageType.Pong: lastHeartBeat = DateTime.Now; break; case DataRequestMessageType.Error: string error = realTimeRequestSocket.ReceiveFrameString(); byte[] buffer1 = realTimeRequestSocket.ReceiveFrameBytes(); using (MemoryStream ms = new MemoryStream(buffer1)) { request = MyUtils.ProtoBufDeserialize <RealTimeDataRequest>(ms); } // Error event RaiseEvent(Error, this, new ErrorArgs(-1, "Real time data request error: " + error, request.RequestID)); break; case DataRequestMessageType.Success: byte[] buffer = realTimeRequestSocket.ReceiveFrameBytes(); using (MemoryStream ms = new MemoryStream(buffer)) { request = MyUtils.ProtoBufDeserialize <RealTimeDataRequest>(ms); } lock (realTimeDataStreamsLock) { RealTimeDataStreams.Add(request); } realTimeDataSocket.Subscribe(BitConverter.GetBytes(request.Instrument.ID)); break; case DataRequestMessageType.RTDCanceled: string symbol = realTimeRequestSocket.ReceiveFrameString(); break; default: throw new ArgumentOutOfRangeException(); } } }
private bool CreateRealTimeRequestSocket() { realTimeRequestSocket = new DealerSocket(realTimeRequestConnectionString); realTimeRequestSocket.Options.Identity = Encoding.UTF8.GetBytes(name); // Start off by sending a ping to make sure everything is regular byte[] reply = new byte[] { }; try { realTimeRequestSocket.SendMoreFrame(string.Empty) .SendFrame(BitConverter.GetBytes((byte)DataRequestMessageType.Ping)); if (realTimeRequestSocket.TryReceiveFrameBytes(TimeSpan.FromSeconds(1), out reply)) { realTimeRequestSocket.TryReceiveFrameBytes(TimeSpan.FromMilliseconds(50), out reply); } } catch { Disconnect(); } if (reply?.Length > 0) { DataRequestMessageType type = (DataRequestMessageType)BitConverter.ToInt16(reply, 0); if (type != DataRequestMessageType.Pong) { try { realTimeRequestSocket.Disconnect(realTimeRequestConnectionString); } finally { realTimeRequestSocket.Close(); realTimeRequestSocket = null; } RaiseEvent(Error, this, new ErrorArgs(-1, "Could not connect to server.")); return(true); } } else { RaiseEvent(Error, this, new ErrorArgs(-1, "Could not connect to server.")); } realTimeRequestSocket.ReceiveReady += RealTimeRequestSocketReceiveReady; return(false); }
/// <summary> /// Called on a reply to a data push /// </summary> private void HandleDataPushReply() { DataRequestMessageType result = (DataRequestMessageType)BitConverter.ToInt16(historicalDataSocket.ReceiveFrameBytes(), 0); switch (result) { case DataRequestMessageType.Success: break; case DataRequestMessageType.Error: // Receive the error string error = historicalDataSocket.ReceiveFrameString(); RaiseEvent(Error, this, new ErrorArgs(-1, "Data push error: " + error)); break; } }