示例#1
0
        public static NetMQMessage ReceiveMessage(this IReceivingSocket socket, bool dontWait = false)
        {
            NetMQMessage message = new NetMQMessage();

            socket.ReceiveMessage(message, dontWait);
            return(message);
        }
        /// <summary>
        /// Extension-method for IReceivingSocket: repeatedly call Rece on this socket, until we receive
        /// a message with one 8-byte frame, which matches a specific pattern.
        /// </summary>
        /// <param name="socket">this socket to receive the messages from</param>
        /// <returns>true if that one frame has no bits set other than in the lowest-order byte</returns>
        public static bool WaitForSignal(this IReceivingSocket socket)
        {
            while (true)
            {
                var message = socket.ReceiveMessage();

                if (message.FrameCount == 1 && message.First.MessageSize == 8)
                {
                    long signalValue = message.First.ConvertToInt64();

                    if ((signalValue & 0x7FFFFFFFFFFFFF00L) == 0x7766554433221100L)
                    {
                        return((signalValue & 255) == 0);
                    }
                }
            }
        }
示例#3
0
文件: Example.cs 项目: jonefmc/zproto
        /// <summary>
        /// Receive a Example from the socket.               
        /// </summary>
        public void Receive(IReceivingSocket input)
        {
            bool more;

            if (input is RouterSocket)
            {
                RoutingId = input.Receive(out more);
                if (!more)
                {
                    throw new MessageException("No routing id");
                }
            }
            else
            {
                RoutingId = null;
            }

            Msg msg = new Msg();
            msg.InitEmpty();

            try
            {
                input.Receive(ref msg, SendReceiveOptions.None);

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

                UInt16 signature = GetNumber2();

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

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

                int listSize;
                int hashSize;
                int chunkSize;
                byte[] guidBytes;
                UInt16 version;

                switch (Id)
                {
                    case MessageId.Log:
                        Sequence = GetNumber2();
                        version = GetNumber2();

                        if (version != 3)
                        {
                            throw new MessageException("Version is invalid");
                        }

                        Level = GetNumber1();
                        Event = GetNumber1();
                        Node = GetNumber2();
                        Peer = GetNumber2();
                        Time = GetNumber8();
                        Host = GetString();
                        Data = GetLongString();
                    break;
                    case MessageId.Structures:
                        Sequence = GetNumber2();

                        listSize = (int)GetNumber4();
                        Aliases = new List<string>(listSize);
                        while (listSize-- > 0)
                        {
                            string s = GetLongString();
                            Aliases.Add(s);
                        }

                        hashSize = (int)GetNumber4();
                        Headers = new Dictionary<string, string>();
                        while (hashSize-- > 0)
                        {
                            string key = GetString();
                            string value = GetLongString();
                            Headers.Add(key, value);
                        }

                    break;
                    case MessageId.Binary:
                        Sequence = GetNumber2();
                        GetOctets(Flags, 4);

                        chunkSize = (int)GetNumber4();
                        if (m_offset + chunkSize > m_buffer.Length)
                        {
                            throw new MessageException("PublicKey is missing data");
                        }

                        PublicKey = new byte[chunkSize];
                        GetOctets(PublicKey, chunkSize);

                        if (m_offset + 16 > m_buffer.Length)
                        {
                            throw new MessageException("Identifier is invalid");
                        }

                        guidBytes = new byte[16];
                        GetOctets(guidBytes, 16);
                        Identifier = new Guid(guidBytes);

                        //  Get next frame off socket
                        if (!more)
                        {
                            throw new MessageException("Address is missing");
                        }

                        Address = input.Receive(out more);

                        //  Get zero or more remaining frames
                        if (more)
                            Content = input.ReceiveMessage();
                        else
                            Content = new NetMQMessage();
                    break;
                    case MessageId.Types:
                        Sequence = GetNumber2();
                        ClientForename = GetString();
                        ClientSurname = GetString();
                        ClientMobile = GetString();
                        ClientEmail = GetString();
                        SupplierForename = GetString();
                        SupplierSurname = GetString();
                        SupplierMobile = GetString();
                        SupplierEmail = GetString();
                    break;
                default:
                    throw new MessageException("Bad message id");
                    break;
                }
            }
            finally
            {
                m_buffer = null;
                msg.Close();
            }
        }
示例#4
0
文件: Example.cs 项目: xaqq/zproto
        /// <summary>
        /// Receive a Example from the socket.
        /// </summary>
        public void Receive(IReceivingSocket input)
        {
            bool more;

            if (input is RouterSocket)
            {
                RoutingId = input.Receive(out more);
                if (!more)
                {
                    throw new MessageException("No routing id");
                }
            }
            else
            {
                RoutingId = null;
            }

            Msg msg = new Msg();

            msg.InitEmpty();

            try
            {
                input.Receive(ref msg, SendReceiveOptions.None);

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

                UInt16 signature = GetNumber2();

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

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

                int    listSize;
                int    hashSize;
                int    chunkSize;
                byte[] guidBytes;
                UInt16 version;

                switch (Id)
                {
                case MessageId.Log:
                    Sequence = GetNumber2();
                    version  = GetNumber2();

                    if (version != 3)
                    {
                        throw new MessageException("Version is invalid");
                    }

                    Level = GetNumber1();
                    Event = GetNumber1();
                    Node  = GetNumber2();
                    Peer  = GetNumber2();
                    Time  = GetNumber8();
                    Host  = GetString();
                    Data  = GetLongString();
                    break;

                case MessageId.Structures:
                    Sequence = GetNumber2();

                    listSize = (int)GetNumber4();
                    Aliases  = new List <string>(listSize);
                    while (listSize-- > 0)
                    {
                        string s = GetLongString();
                        Aliases.Add(s);
                    }


                    hashSize = (int)GetNumber4();
                    Headers  = new Dictionary <string, string>();
                    while (hashSize-- > 0)
                    {
                        string key   = GetString();
                        string value = GetLongString();
                        Headers.Add(key, value);
                    }

                    break;

                case MessageId.Binary:
                    Sequence = GetNumber2();
                    GetOctets(Flags, 4);

                    chunkSize = (int)GetNumber4();
                    if (m_offset + chunkSize > m_buffer.Length)
                    {
                        throw new MessageException("PublicKey is missing data");
                    }

                    PublicKey = new byte[chunkSize];
                    GetOctets(PublicKey, chunkSize);


                    if (m_offset + 16 > m_buffer.Length)
                    {
                        throw new MessageException("Identifier is invalid");
                    }

                    guidBytes = new byte[16];
                    GetOctets(guidBytes, 16);
                    Identifier = new Guid(guidBytes);


                    //  Get next frame off socket
                    if (!more)
                    {
                        throw new MessageException("Address is missing");
                    }

                    Address = input.Receive(out more);


                    //  Get zero or more remaining frames
                    if (more)
                    {
                        Content = input.ReceiveMessage();
                    }
                    else
                    {
                        Content = new NetMQMessage();
                    }
                    break;

                case MessageId.Types:
                    Sequence         = GetNumber2();
                    ClientForename   = GetString();
                    ClientSurname    = GetString();
                    ClientMobile     = GetString();
                    ClientEmail      = GetString();
                    SupplierForename = GetString();
                    SupplierSurname  = GetString();
                    SupplierMobile   = GetString();
                    SupplierEmail    = GetString();
                    break;

                default:
                    throw new MessageException("Bad message id");
                    break;
                }
            }
            finally
            {
                m_buffer = null;
                msg.Close();
            }
        }