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); } } } }
/// <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(); } }
/// <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(); } }