Esempio n. 1
0
        public SpreadMessage ReceiveSpreadMessage()
        {
            SpreadMessage message = _spreadConnection.Receive();

            DisplayMessage(message);

            return(message);
        }
Esempio n. 2
0
        public SpreadMessage SendSpreadMessage(string data)
        {
            SpreadMessage msg = new SpreadMessage();

            msg.AddGroup(_spreadGroup);
            msg.Data = Encoding.ASCII.GetBytes(data);

            _spreadConnection.Multicast(msg);

            return(msg);
        }
Esempio n. 3
0
        public SpreadMessage SendACK()
        {
            SpreadMessage msg = new SpreadMessage();

            msg.AddGroup(_spreadGroup);
            msg.Data = Encoding.ASCII.GetBytes($"Received");

            _spreadConnection.Multicast(msg);

            return(msg);
        }
        public void CreateFromString_Test()
        {
            var rawSpreadMessage = TestSocketMessages.SpreadMessage;
            var spreadMessage    = SpreadMessage.CreateFromString(rawSpreadMessage);

            Assert.NotNull(spreadMessage);
            Assert.Equal(0, spreadMessage.ChannelId);
            Assert.Equal(5698.40000M, spreadMessage.Bid);
            Assert.Equal(5700.00000M, spreadMessage.Ask);
            Assert.Equal(1542057299.545897M, spreadMessage.Time);
        }
Esempio n. 5
0
        private static string ToCustomString(this SpreadMessage spreadMessage)
        {
            int    length = spreadMessage.Data.Length;
            string messageData;

            if (length == 0)
            {
                messageData = "No data available";
            }
            else
            {
                messageData = Encoding.ASCII.GetString(spreadMessage.Data, 0, length);
            }

            return($"{spreadMessage.Groups[0].ToString()}|{spreadMessage.ServiceType}|{messageData}|{spreadMessage.Sender.ToString()}");
        }
        private void HandleData(KrakenMessageEventArgs eventArgs, SubscriptionStatus subscription)
        {
            var dataType = subscription.Subscription.Name;

            if (dataType == SubscribeOptionNames.Ticker)
            {
                var tickerMessage = TickerMessage.CreateFromString(eventArgs.RawContent, subscription);
                TickerReceived.InvokeAll(this, new TickerEventArgs(subscription.ChannelId.Value, subscription.Pair, tickerMessage));
            }
            if (dataType == SubscribeOptionNames.OHLC)
            {
                var ohlcMessage = OhlcMessage.CreateFromString(eventArgs.RawContent);
                OhlcReceived.InvokeAll(this, new OhlcEventArgs(subscription.ChannelId.Value, subscription.Pair, ohlcMessage));
            }
            if (dataType == SubscribeOptionNames.Trade)
            {
                var tradeMessage = TradeMessage.CreateFromString(eventArgs.RawContent);
                TradeReceived.InvokeAll(this, new TradeEventArgs(subscription.ChannelId.Value, subscription.Pair, tradeMessage));
            }
            if (dataType == SubscribeOptionNames.Spread)
            {
                var spreadMessage = SpreadMessage.CreateFromString(eventArgs.RawContent);
                SpreadReceived.InvokeAll(this, new SpreadEventArgs(subscription.ChannelId.Value, subscription.Pair, spreadMessage));
            }
            if (dataType == SubscribeOptionNames.Book)
            {
                if (eventArgs.RawContent.Contains(@"""as"":") && eventArgs.RawContent.Contains(@"""bs"":"))
                {
                    var bookSnapshotMessage = BookSnapshotMessage.CreateFromString(eventArgs.RawContent);
                    BookSnapshotReceived.InvokeAll(this, new KrakenDataEventArgs <BookSnapshotMessage>(eventArgs.ChannelId.Value, subscription.Pair, bookSnapshotMessage));
                }
                if (eventArgs.RawContent.Contains(@"""a"":") || eventArgs.RawContent.Contains(@"""b"":"))
                {
                    var bookUpdateMessage = BookUpdateMessage.CreateFromString(eventArgs.RawContent);
                    BookUpdateReceived.InvokeAll(this, new KrakenDataEventArgs <BookUpdateMessage>(eventArgs.ChannelId.Value, subscription.Pair, bookUpdateMessage));
                }
            }
        }
Esempio n. 7
0
        private void _spreadConnection_OnRegularMessage(SpreadMessage msg)
        {
            DisplayMessage(msg);

            if (ServerOptions.IsPrimary)
            {
                //primary server can only receive ack regular messages

                var data = Encoding.ASCII.GetString(msg.Data, 0, msg.Data.Length);

                if (data.Equals("Received"))
                {
                    //we got the ack -> respond to client (back to ExecuteTaksAsync)
                    return;
                }
            }
            else
            {
                var deserializedMessage = msg.ParseRegularSpreadMessage();
                //save to File
                _spreadService.SendACK();
            }
        }
Esempio n. 8
0
 public static string ParseRegularSpreadMessage(this SpreadMessage spreadRegularMessage)
 {
     return(spreadRegularMessage.ToCustomString());
 }
Esempio n. 9
0
        private void DisplayMessage(SpreadMessage msg)
        {
            try
            {
                if (msg.IsRegular)
                {
                    Console.Write("Received a ");
                    if (msg.IsUnreliable)
                    {
                        Console.Write("UNRELIABLE");
                    }
                    else if (msg.IsReliable)
                    {
                        Console.Write("RELIABLE");
                    }
                    else if (msg.IsFifo)
                    {
                        Console.Write("FIFO");
                    }
                    else if (msg.IsCausal)
                    {
                        Console.Write("CAUSAL");
                    }
                    else if (msg.IsAgreed)
                    {
                        Console.Write("AGREED");
                    }
                    else if (msg.IsSafe)
                    {
                        Console.Write("SAFE");
                    }
                    Console.WriteLine(" message.");

                    Console.WriteLine("Sent by  " + msg.Sender + ".");

                    Console.WriteLine("Type is " + msg.Type + ".");

                    if (msg.EndianMismatch == true)
                    {
                        Console.WriteLine("There is an endian mismatch.");
                    }
                    else
                    {
                        Console.WriteLine("There is no endian mismatch.");
                    }

                    SpreadGroup[] groups = msg.Groups;
                    Console.WriteLine("To " + groups.Length + " groups.");

                    byte[] data = msg.Data;
                    Console.WriteLine("The data is " + data.Length + " bytes.");

                    Console.WriteLine("The message is: " + System.Text.Encoding.ASCII.GetString(data));
                }
                else if (msg.IsMembership)
                {
                    MembershipInfo info = msg.MembershipInfo;

                    if (info.IsRegularMembership)
                    {
                        SpreadGroup[] groups = msg.Groups;

                        Console.WriteLine("Received a REGULAR membership.");
                        Console.WriteLine("For group " + info.Group + ".");
                        Console.WriteLine("With " + groups.Length + " members.");
                        Console.WriteLine("I am member " + msg.Type + ".");
                        for (int i = 0; i < groups.Length; i++)
                        {
                            Console.WriteLine("  " + groups[i]);
                        }

                        Console.WriteLine("Group ID is " + info.GroupID);

                        Console.Write("Due to ");
                        if (info.IsCausedByJoin)
                        {
                            Console.WriteLine("the JOIN of " + info.Joined + ".");
                        }
                        else if (info.IsCausedByLeave)
                        {
                            Console.WriteLine("the LEAVE of " + info.Left + ".");
                        }
                        else if (info.IsCausedByDisconnect)
                        {
                            Console.WriteLine("the DISCONNECT of " + info.Disconnected + ".");
                        }
                        else if (info.IsCausedByNetwork)
                        {
                            SpreadGroup[] stayed = info.Stayed;
                            Console.WriteLine("NETWORK change.");
                            Console.WriteLine("VS set has " + stayed.Length + " members:");
                            for (int i = 0; i < stayed.Length; i++)
                            {
                                Console.WriteLine("  " + stayed[i]);
                            }
                        }
                    }
                    else if (info.IsTransition)
                    {
                        Console.WriteLine("Received a TRANSITIONAL membership for group " + info.Group);
                    }
                    else if (info.IsSelfLeave)
                    {
                        Console.WriteLine("Received a SELF-LEAVE message for group " + info.Group);
                    }
                }
                else if (msg.IsReject)
                {
                    // Received a Reject message
                    Console.Write("Received a ");
                    if (msg.IsUnreliable)
                    {
                        Console.Write("UNRELIABLE");
                    }
                    else if (msg.IsReliable)
                    {
                        Console.Write("RELIABLE");
                    }
                    else if (msg.IsFifo)
                    {
                        Console.Write("FIFO");
                    }
                    else if (msg.IsCausal)
                    {
                        Console.Write("CAUSAL");
                    }
                    else if (msg.IsAgreed)
                    {
                        Console.Write("AGREED");
                    }
                    else if (msg.IsSafe)
                    {
                        Console.Write("SAFE");
                    }
                    Console.WriteLine(" REJECTED message.");

                    Console.WriteLine("Sent by  " + msg.Sender + ".");

                    Console.WriteLine("Type is " + msg.Type + ".");

                    if (msg.EndianMismatch == true)
                    {
                        Console.WriteLine("There is an endian mismatch.");
                    }
                    else
                    {
                        Console.WriteLine("There is no endian mismatch.");
                    }

                    SpreadGroup[] groups = msg.Groups;
                    Console.WriteLine("To " + groups.Length + " groups.");

                    byte[] data = msg.Data;
                    Console.WriteLine("The data is " + data.Length + " bytes.");

                    Console.WriteLine("The message is: " + System.Text.Encoding.ASCII.GetString(data));
                }
                else
                {
                    Console.WriteLine("Message is of unknown type: " + msg.ServiceType);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                Environment.Exit(1);
            }
        }
Esempio n. 10
0
        private void HandleIncomingMessage(object sender, KrakenMessageEventArgs eventArgs)
        {
            logger.LogDebug("Handling incoming '{event}' message", eventArgs.Event);

            switch (eventArgs.Event)
            {
            case Heartbeat.EventName:
                var heartbeat = serializer.Deserialize <Heartbeat>(eventArgs.RawContent);
                logger.LogTrace("Heartbeat received: {heartbeat}", heartbeat);
                HeartbeatReceived.InvokeAll(this, heartbeat);
                break;

            case SystemStatus.EventName:
                var systemStatus = serializer.Deserialize <SystemStatus>(eventArgs.RawContent);
                logger.LogTrace("System status changed: {systemStatus}", systemStatus);
                SystemStatus = systemStatus;
                SystemStatusChanged.InvokeAll(this, systemStatus);
                break;

            case SubscriptionStatus.EventName:
                var subscriptionStatus = serializer.Deserialize <SubscriptionStatus>(eventArgs.RawContent);
                logger.LogTrace("Subscription status changed: {subscriptionStatus}", subscriptionStatus);

                SynchronizeSubscriptions(subscriptionStatus);
                SubscriptionStatusChanged.InvokeAll(this, subscriptionStatus);

                break;

            case "data":

                var subscription = Subscriptions.ContainsKey(eventArgs.ChannelId.Value) ? Subscriptions[eventArgs.ChannelId.Value] : null;
                if (subscription == null)
                {
                    logger.LogWarning("Didn't find a subscription for channelId {channelId}", eventArgs.ChannelId);
                    break;
                }

                var dataType = subscription.Subscription.Name;

                if (dataType == SubscribeOptionNames.Ticker)
                {
                    var tickerMessage = TickerMessage.CreateFromString(eventArgs.RawContent, subscription);
                    TickerReceived.InvokeAll(this, new TickerEventArgs(subscription.ChannelId.Value, subscription.Pair, tickerMessage));
                }
                if (dataType == SubscribeOptionNames.OHLC)
                {
                    var ohlcMessage = OhlcMessage.CreateFromString(eventArgs.RawContent);
                    OhlcReceived.InvokeAll(this, new OhlcEventArgs(subscription.ChannelId.Value, subscription.Pair, ohlcMessage));
                }
                if (dataType == SubscribeOptionNames.Trade)
                {
                    var tradeMessage = TradeMessage.CreateFromString(eventArgs.RawContent);
                    TradeReceived.InvokeAll(this, new TradeEventArgs(subscription.ChannelId.Value, subscription.Pair, tradeMessage));
                }
                if (dataType == SubscribeOptionNames.Spread)
                {
                    var spreadMessage = SpreadMessage.CreateFromString(eventArgs.RawContent);
                    SpreadReceived.InvokeAll(this, new SpreadEventArgs(subscription.ChannelId.Value, subscription.Pair, spreadMessage));
                }
                if (dataType == SubscribeOptionNames.Book)
                {
                    if (eventArgs.RawContent.Contains(@"""as"":") && eventArgs.RawContent.Contains(@"""bs"":"))
                    {
                        var bookSnapshotMessage = BookSnapshotMessage.CreateFromString(eventArgs.RawContent);
                        BookSnapshotReceived.InvokeAll(this, new KrakenDataEventArgs <BookSnapshotMessage>(eventArgs.ChannelId.Value, subscription.Pair, bookSnapshotMessage));
                    }
                    if (eventArgs.RawContent.Contains(@"""a"":") || eventArgs.RawContent.Contains(@"""b"":"))
                    {
                        var bookUpdateMessage = BookUpdateMessage.CreateFromString(eventArgs.RawContent);
                        BookUpdateReceived.InvokeAll(this, new KrakenDataEventArgs <BookUpdateMessage>(eventArgs.ChannelId.Value, subscription.Pair, bookUpdateMessage));
                    }
                }

                break;

            default:
                logger.LogWarning("Could not handle incoming message: {message}", eventArgs.RawContent);
                break;
            }
        }
Esempio n. 11
0
        private void _spreadConnection_OnMembershipMessage(SpreadMessage msg)
        {
            MembershipInfo info  = msg.MembershipInfo;
            SpreadGroup    group = info.Group;

            if (info.IsRegularMembership)
            {
                SpreadGroup[] members = info.Members;
                Console.WriteLine($"Regular membership for {group.ToString()} with {members.Length} members:");
                for (int i = 0; i < members.Length; i++)
                {
                    Console.WriteLine($"\t {members[i]}");
                }

                Console.WriteLine($"GroupID: {info.GroupID}");
            }

            SpreadGroup Sender;

            if (info.IsCausedByDisconnect)
            {
                Sender = info.Disconnected;
                Console.WriteLine($"{Sender} has disconnected ...");
                isDisconnected = true;
                _delegate      = new InformClientOfChange(NotifyClient);
                _delegate.Invoke(ServerOptions.IPAddress, ServerOptions.Port);
            }
            if (info.IsCausedByLeave)
            {
                Sender = info.Left;
                Console.WriteLine($"{Sender} has left ...");
                isDisconnected = true;
                _delegate      = new InformClientOfChange(NotifyClient);
                _delegate.Invoke(ServerOptions.IPAddress, ServerOptions.Port);
            }
            if (info.IsCausedByJoin)
            {
                Sender = info.Joined;
                Console.WriteLine($"{Sender} has joined ...");

                if (isInitState)
                {
                    #region Set Primary
                    Console.WriteLine("Setting Primary Server ...");

                    int highestPort = _configurationManager.ServerGroups.ToList().Max();

                    if (ServerOptions.Port.Equals(highestPort))
                    {
                        ServerOptions.IsPrimary = true;
                        Console.WriteLine("I am the primary server ...");
                    }
                    else
                    {
                        ServerOptions.IsPrimary = false;
                        Console.WriteLine("I am the backup server ...");
                    }
                    #endregion
                }
                else
                {
                    //receive full state
                }

                //_delegate = new InformClientOfChange(NotifyClient);
                //_delegate.Invoke(ServerOptions.IPAddress, ServerOptions.Port);
            }
        }