예제 #1
0
            private static bool Compare([NotNull] NetMQFrame a, [NotNull] NetMQFrame b, int size)
            {
                for (int i = 0; i < size; i++)
                {
                    if (a.Buffer[i] != b.Buffer[i])
                    {
                        return(false);
                    }
                }

                return(true);
            }
예제 #2
0
            private bool Compare(NetMQFrame a, NetMQFrame b, int size)
            {
                for (int i = 0; i < size; i++)
                {
                    if (a.Buffer[i] != b.Buffer[i])
                    {
                        return(false);
                    }
                }

                return(true);
            }
예제 #3
0
            private NetMQFrame ReceiveUdpFrame(out string peerName)
            {
                var      buffer = new byte[UdpFrameMax];
                EndPoint peer   = new IPEndPoint(IPAddress.Any, 0);

                int bytesRead = m_udpSocket.ReceiveFrom(buffer, ref peer);

                var frame = new NetMQFrame(bytesRead);

                Buffer.BlockCopy(buffer, 0, frame.Buffer, 0, bytesRead);

                peerName = peer.ToString();

                return(frame);
            }
예제 #4
0
            private void SendUdpFrame(NetMQFrame frame)
            {
                Assumes.NotNull(m_udpSocket);

                try
                {
                    m_udpSocket.SendTo(frame.Buffer, 0, frame.MessageSize, SocketFlags.None, m_broadcastAddress);
                }
                catch (SocketException ex) when(ex.SocketErrorCode == SocketError.AddressNotAvailable)
                {
                    // Initiate Creation of new Udp here to solve issue related to 'sudden' network change.
                    // On windows (7 OR 10) incorrect/previous ip address might still exist instead of new Ip
                    // due to network change which causes crash (if no try/catch and keep trying to send to incorrect/not available address.
                    // This approach would solve the issue...
                }
            }
예제 #5
0
            private void OnPipeReady(object sender, NetMQSocketEventArgs e)
            {
                NetMQMessage message = m_pipe.ReceiveMessage();

                string command = message.Pop().ConvertToString();

                switch (command)
                {
                case ConfigureCommand:
                    string interfaceName = message.Pop().ConvertToString();
                    int    port          = message.Pop().ConvertToInt32();
                    Configure(interfaceName, port);
                    break;

                case PublishCommand:
                    m_transmit           = message.Pop();
                    m_pingTimer.Interval = message.Pop().ConvertToInt32();

                    m_pingTimer.Enable = true;

                    SendUdpFrame(m_transmit);
                    break;

                case SilenceCommand:
                    m_transmit         = null;
                    m_pingTimer.Enable = false;
                    break;

                case SubscribeCommand:
                    m_filter = message.Pop();
                    break;

                case UnsubscribeCommand:
                    m_filter = null;
                    break;

                case NetMQActor.EndShimMessage:
                    m_poller.Stop(false);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
예제 #6
0
            public void HandlePipe()
            {
                NetMQMessage message = m_pipe.ReceiveMessage();

                string command = message.Pop().ConvertToString();

                switch (command)
                {
                case ConfigureCommand:
                    string interfaceName = message.Pop().ConvertToString();
                    int    port          = message.Pop().ConvertToInt32();
                    Configure(interfaceName, port);
                    break;

                case PublishCommand:
                    m_transmit = message.Pop();
                    m_interval = message.Pop().ConvertToInt32();

                    //  Start broadcasting immediately
                    m_pingAt = Clock.NowMs();
                    break;

                case SilenceCommand:
                    m_transmit = null;
                    break;

                case SubscribeCommand:
                    m_filter = message.Pop();
                    break;

                case UnsubscribeCommand:
                    m_filter = null;
                    break;

                case ActorKnownMessages.END_PIPE:
                    m_terminated = true;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
예제 #7
0
            private bool TryReceiveUdpFrame(out NetMQFrame frame, out string peerName)
            {
                Assumes.NotNull(m_udpSocket);

                var      buffer = new byte[UdpFrameMax];
                EndPoint peer   = new IPEndPoint(IPAddress.Any, 0);

                int bytesRead = 0;

                try
                {
                    bytesRead = m_udpSocket.ReceiveFrom(buffer, ref peer);
                }
                catch (SocketException ex) when(ex.SocketErrorCode == SocketError.MessageSize)
                {
                    frame    = default;
                    peerName = null;
                    return(false);
                }

                peerName = peer.ToString();
                frame    = new NetMQFrame(buffer, bytesRead);
                return(true);
            }
예제 #8
0
 private void SendUdpFrame(NetMQFrame frame)
 {
     m_udpSocket.SendTo(frame.Buffer, 0, frame.MessageSize, SocketFlags.None, m_broadcastAddress);
 }