/// <summary>
        /// Receive a ZreMsgOriginal from the socket.
        /// </summary>
        public void Receive(IReceivingSocket input)
        {
            bool more;

            if (input is RouterSocket)
            {
                Msg routingIdMsg = new Msg();
                routingIdMsg.InitEmpty();

                try
                {
                    input.Receive(ref routingIdMsg);

                    if (!routingIdMsg.HasMore)
                    {
                        throw new MessageException("No routing id");
                    }

                    if (m_routingId == null || m_routingId.Length == routingIdMsg.Size)
                    {
                        m_routingId = new byte[routingIdMsg.Size];
                    }

                    Buffer.BlockCopy(routingIdMsg.Data, 0, m_routingId, 0, m_routingId.Length);
                }
                finally
                {
                    routingIdMsg.Close();
                }
            }
            else
            {
                RoutingId = null;
            }

            Msg msg = new Msg();

            msg.InitEmpty();

            try
            {
                input.Receive(ref msg);

                m_offset = 0;
                m_buffer = msg.Data;
                more     = msg.HasMore;

                UInt16 signature = GetNumber2();

                if (signature != (0xAAA0 | 1))
                {
                    throw new MessageException("Invalid signature");
                }

                //  Get message id and parse per message type
                Id = (MessageId)GetNumber1();

                switch (Id)
                {
                case MessageId.Hello:
                    Hello.Read(this);
                    break;

                case MessageId.Whisper:
                    Whisper.Read(this);
                    break;

                case MessageId.Shout:
                    Shout.Read(this);
                    break;

                case MessageId.Join:
                    Join.Read(this);
                    break;

                case MessageId.Leave:
                    Leave.Read(this);
                    break;

                case MessageId.Ping:
                    Ping.Read(this);
                    break;

                case MessageId.PingOk:
                    PingOk.Read(this);
                    break;

                default:
                    throw new MessageException("Bad message id");
                }
            }
            finally
            {
                m_buffer = null;
                msg.Close();
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Send the ZreMsg to the socket.
        /// Warning re WHISPER and SHOUT: The 0MQ spec http://rfc.zeromq.org/spec:36
        ///     says "message content defined as one 0MQ frame. ZRE does not support multi-frame message contents."
        /// </summary>
        public void Send(IOutgoingSocket output)
        {
            if (output is RouterSocket)
            {
                output.SendMoreFrame(RoutingId);
            }

            int frameSize = 2 + 1; //  Signature and message ID

            switch (Id)
            {
            case MessageId.Hello:
                frameSize += Hello.GetFrameSize();
                break;

            case MessageId.Whisper:
                frameSize += Whisper.GetFrameSize();
                break;

            case MessageId.Shout:
                frameSize += Shout.GetFrameSize();
                break;

            case MessageId.Join:
                frameSize += Join.GetFrameSize();
                break;

            case MessageId.Leave:
                frameSize += Leave.GetFrameSize();
                break;

            case MessageId.Ping:
                frameSize += Ping.GetFrameSize();
                break;

            case MessageId.PingOk:
                frameSize += PingOk.GetFrameSize();
                break;
            }

            //  Now serialize message into the buffer
            Msg msg = new Msg();

            msg.InitPool(frameSize);

            try
            {
                m_offset = 0;
                m_buffer = msg.Data;

                // put signature
                PutNumber2(0xAAA0 | 1);

                // put message id
                PutNumber1((byte)Id);

                switch (Id)
                {
                case MessageId.Hello:
                    Hello.Write(this);
                    break;

                case MessageId.Whisper:
                    Whisper.Write(this);
                    break;

                case MessageId.Shout:
                    Shout.Write(this);
                    break;

                case MessageId.Join:
                    Join.Write(this);
                    break;

                case MessageId.Leave:
                    Leave.Write(this);
                    break;

                case MessageId.Ping:
                    Ping.Write(this);
                    break;

                case MessageId.PingOk:
                    PingOk.Write(this);
                    break;
                }

                //  Send the data frame
                var more = Id == MessageId.Whisper || Id == MessageId.Shout;
                output.TrySend(ref msg, TimeSpan.Zero, more);

                // Send message content for types with content
                switch (Id)
                {
                case MessageId.Whisper:
                    if (Whisper.Content == null)
                    {
                        Whisper.Content = new NetMQMessage();
                        Whisper.Content.PushEmptyFrame();
                    }
                    output.TrySendMultipartMessage(Whisper.Content);
                    break;

                case MessageId.Shout:
                    if (Shout.Content == null)
                    {
                        Shout.Content = new NetMQMessage();
                        Shout.Content.PushEmptyFrame();
                    }
                    output.TrySendMultipartMessage(Shout.Content);
                    break;
                }
            }
            finally
            {
                m_buffer = null;
                msg.Close();
            }
        }
        /// <summary>
        /// Send the ZreMsgOriginal to the socket.
        /// </summary>
        public void Send(IOutgoingSocket output)
        {
            if (output is RouterSocket)
            {
                output.SendMoreFrame(RoutingId);
            }

            int frameSize = 2 + 1;                      //  Signature and message ID

            switch (Id)
            {
            case MessageId.Hello:
                frameSize += Hello.GetFrameSize();
                break;

            case MessageId.Whisper:
                frameSize += Whisper.GetFrameSize();
                break;

            case MessageId.Shout:
                frameSize += Shout.GetFrameSize();
                break;

            case MessageId.Join:
                frameSize += Join.GetFrameSize();
                break;

            case MessageId.Leave:
                frameSize += Leave.GetFrameSize();
                break;

            case MessageId.Ping:
                frameSize += Ping.GetFrameSize();
                break;

            case MessageId.PingOk:
                frameSize += PingOk.GetFrameSize();
                break;
            }

            //  Now serialize message into the buffer
            Msg msg = new Msg();

            msg.InitPool(frameSize);

            try
            {
                m_offset = 0;
                m_buffer = msg.Data;

                // put signature
                PutNumber2(0xAAA0 | 1);

                // put message id
                PutNumber1((byte)Id);

                switch (Id)
                {
                case MessageId.Hello:
                    Hello.Write(this);
                    break;

                case MessageId.Whisper:
                    Whisper.Write(this);
                    break;

                case MessageId.Shout:
                    Shout.Write(this);
                    break;

                case MessageId.Join:
                    Join.Write(this);
                    break;

                case MessageId.Leave:
                    Leave.Write(this);
                    break;

                case MessageId.Ping:
                    Ping.Write(this);
                    break;

                case MessageId.PingOk:
                    PingOk.Write(this);
                    break;
                }

                //  Send the data frame
                output.Send(ref msg, false);
            }
            finally
            {
                m_buffer = null;
                msg.Close();
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Receive a ZreMsg from the socket.
        /// Message is ignored if the message signature doesn't start with %xAA %xA1 (returns false).
        /// It appears "real" input will always be a RouterSocket, but DealerSocket is used during unit testing by zeromq/zyre and by this implementation.
        /// </summary>
        /// <param name="input">the socket</param>
        /// <returns>true if successful</returns>
        public bool Receive(IReceivingSocket input)
        {
            if (input is RouterSocket)
            {
                Msg routingIdMsg = new Msg();
                routingIdMsg.InitEmpty();
                try
                {
                    input.Receive(ref routingIdMsg);

                    if (!routingIdMsg.HasMore)
                    {
                        throw new MessageException("No routing id");
                    }

                    if (_routingId == null || _routingId.Length == routingIdMsg.Size)
                    {
                        _routingId = new byte[routingIdMsg.Size];
                    }

                    Buffer.BlockCopy(routingIdMsg.Data, 0, _routingId, 0, _routingId.Length);
                }
                finally
                {
                    routingIdMsg.Close();
                }
            }
            else
            {
                RoutingId = null;
            }
            Msg msg = new Msg();

            msg.InitEmpty();

            try
            {
                input.Receive(ref msg);

                _offset = 0;
                _buffer = msg.Data;

                UInt16 signature = GetNumber2();

                if (signature != (0xAAA0 | 1))
                {
                    // spec:36 A node SHALL silently discard any message received that does not start with these two octets.
                    return(false);
                }

                //  Get message id and parse per message type
                Id = (MessageId)GetNumber1();

                switch (Id)
                {
                case MessageId.Hello:
                    Hello.Read(this);
                    break;

                case MessageId.Whisper:
                    Whisper.Read(this);
                    break;

                case MessageId.Shout:
                    Shout.Read(this);
                    break;

                case MessageId.Join:
                    Join.Read(this);
                    break;

                case MessageId.Leave:
                    Leave.Read(this);
                    break;

                case MessageId.Ping:
                    Ping.Read(this);
                    break;

                case MessageId.PingOk:
                    PingOk.Read(this);
                    break;

                default:
                    throw new MessageException("Bad message id");
                }

                // Receive message content for types with content
                switch (Id)
                {
                case MessageId.Whisper:
                    Whisper.Content = input.ReceiveMultipartMessage();
                    break;

                case MessageId.Shout:
                    Shout.Content = input.ReceiveMultipartMessage();
                    break;
                }
            }
            finally
            {
                _buffer = null;
                msg.Close();
            }
            return(true);
        }