Exemple #1
0
        public void CancelSocket()
        {
            using (NetMQContext contex = NetMQContext.Create())
            {
                // we are using three responses to make sure we actually move the correct socket and other sockets still work
                using (var router = contex.CreateRouterSocket())
                using (var router2 = contex.CreateRouterSocket())
                using (var router3 = contex.CreateRouterSocket())
                {
                    router.Bind("tcp://127.0.0.1:5002");
                    router2.Bind("tcp://127.0.0.1:5003");
                    router3.Bind("tcp://127.0.0.1:5004");

                    using (var dealer = contex.CreateDealerSocket())
                    using (var dealer2 = contex.CreateDealerSocket())
                    using (var dealer3 = contex.CreateDealerSocket())
                    using (Poller poller = new Poller())
                    {
                        dealer.Connect("tcp://127.0.0.1:5002");
                        dealer2.Connect("tcp://127.0.0.1:5003");
                        dealer3.Connect("tcp://127.0.0.1:5004");

                        bool first = true;

                        router2.ReceiveReady += (s, a) =>
                                                                            {
                                                                                bool more;

                                                                                // identity
                                                                                byte[] identity = a.Socket.Receive(out more);

                                                                                // message
                                                                                a.Socket.Receive(out more);

                                                                                a.Socket.SendMore(identity);
                                                                                a.Socket.Send("2");
                                                                            };

                        poller.AddSocket(router2);

                        router.ReceiveReady += (s, a) =>
                                                                        {
                                                                            if (!first)
                                                                            {
                                                                                Assert.Fail("This should happen because we cancelled the socket");
                                                                            }
                                                                            first = false;

                                                                            bool more;

                                                                            // identity
                                                                            a.Socket.Receive(out more);

                                                                            string m = a.Socket.ReceiveString(out more);

                                                                            Assert.False(more);
                                                                            Assert.AreEqual("Hello", m);

                                                                            // cancellign the socket
                                                                            poller.RemoveSocket(a.Socket);
                                                                        };

                        poller.AddSocket(router);

                        router3.ReceiveReady += (s, a) =>
                                                                            {
                                                                                bool more;

                                                                                // identity
                                                                                byte[] identity = a.Socket.Receive(out more);

                                                                                // message
                                                                                a.Socket.Receive(out more);

                                                                                a.Socket.SendMore(identity).Send("3");
                                                                            };

                        poller.AddSocket(router3);

                        Task pollerTask = Task.Factory.StartNew(poller.Start);

                        dealer.Send("Hello");

                        // sending this should not arrive on the poller, therefore response for this will never arrive
                        dealer.Send("Hello2");

                        Thread.Sleep(100);

                        // sending this should not arrive on the poller, therefore response for this will never arrive
                        dealer.Send("Hello3");

                        Thread.Sleep(500);

                        bool more2;

                        // making sure the socket defined before the one cancelled still works
                        dealer2.Send("1");
                        string msg = dealer2.ReceiveString(out more2);
                        Assert.AreEqual("2", msg);

                        // making sure the socket defined after the one cancelled still works
                        dealer3.Send("1");
                        msg = dealer3.ReceiveString(out more2);
                        Assert.AreEqual("3", msg);

                        // we have to give this some time if we want to make sure it's really not happening and it not only because of time
                        Thread.Sleep(300);

                        poller.Stop();

                        Thread.Sleep(100);
                        Assert.IsTrue(pollerTask.IsCompleted);
                    }
                }
            }
        }
Exemple #2
0
        public void RemoveSocket()
        {
            using (var context = NetMQContext.Create())
            using (var router1 = context.CreateRouterSocket())
            using (var router2 = context.CreateRouterSocket())
            using (var router3 = context.CreateRouterSocket())
            using (var dealer1 = context.CreateDealerSocket())
            using (var dealer2 = context.CreateDealerSocket())
            using (var dealer3 = context.CreateDealerSocket())
            using (var poller = new Poller(router1, router2, router3) { PollTimeout = TestPollTimeoutMillis })
            {
                int port1 = router1.BindRandomPort("tcp://127.0.0.1");
                int port2 = router2.BindRandomPort("tcp://127.0.0.1");
                int port3 = router3.BindRandomPort("tcp://127.0.0.1");

                dealer1.Connect("tcp://127.0.0.1:" + port1);
                dealer2.Connect("tcp://127.0.0.1:" + port2);
                dealer3.Connect("tcp://127.0.0.1:" + port3);

                bool first = true;

                router1.ReceiveReady += (s, a) =>
                {
                    if (!first)
                        Assert.Fail("This should not happen because we cancelled the socket");
                    first = false;

                    // identity
                    a.Socket.Receive();

                    bool more;
                    Assert.AreEqual("Hello", a.Socket.ReceiveString(out more));
                    Assert.False(more);

                    // cancelling the socket
                    poller.RemoveSocket(a.Socket); // remove self
                };

                router2.ReceiveReady += (s, a) =>
                {
                    // identity
                    byte[] identity = a.Socket.Receive();

                    // message
                    a.Socket.Receive();

                    a.Socket.SendMore(identity);
                    a.Socket.Send("2");
                };

                router3.ReceiveReady += (s, a) =>
                {
                    // identity
                    byte[] identity = a.Socket.Receive();

                    // message
                    a.Socket.Receive();

                    a.Socket.SendMore(identity).Send("3");
                };

                Task pollerTask = Task.Factory.StartNew(poller.PollTillCancelled);

                // Send three messages. Only the first will be processes, as then handler removes
                // the socket from the poller.
                dealer1.Send("Hello");
                dealer1.Send("Hello2");
                dealer1.Send("Hello3");

                // making sure the socket defined before the one cancelled still works
                dealer2.Send("1");
                Assert.AreEqual("2", dealer2.ReceiveString());

                // making sure the socket defined after the one cancelled still works
                dealer3.Send("1");
                Assert.AreEqual("3", dealer3.ReceiveString());

                poller.CancelAndJoin();
                Assert.IsTrue(pollerTask.IsCompleted);
            }
        }
Exemple #3
0
        public void AddSocketAfterRemoving()
        {
            using (NetMQContext contex = NetMQContext.Create())
            {
                // we are using three responses to make sure we actually move the correct socket and other sockets still work
                using (var router = contex.CreateRouterSocket())
                using (var router2 = contex.CreateRouterSocket())
                using (var router3 = contex.CreateRouterSocket())
                {
                    router.Bind("tcp://127.0.0.1:5002");
                    router2.Bind("tcp://127.0.0.1:5003");
                    router3.Bind("tcp://127.0.0.1:5004");

                    using (var dealer = contex.CreateDealerSocket())
                    using (var dealer2 = contex.CreateDealerSocket())
                    using (var dealer3 = contex.CreateDealerSocket())
                    using (Poller poller = new Poller())
                    {
                        dealer.Connect("tcp://127.0.0.1:5002");
                        dealer2.Connect("tcp://127.0.0.1:5003");
                        dealer3.Connect("tcp://127.0.0.1:5004");

                        bool router1arrived = false;
                        bool router2arrived = false;
                        bool router3arrived = false;

                        bool more;

                        router.ReceiveReady += (s, a) =>
                                                                        {
                                                                            router1arrived = true;

                                                                            router.Receive(out more);
                                                                            router.Receive(out more);

                                                                            poller.RemoveSocket(router);

                                                                        };

                        poller.AddSocket(router);

                        router3.ReceiveReady += (s, a) =>
                        {
                            router3.Receive(out more);
                            router3.Receive(out more);
                            router3arrived = true;
                        };

                        router2.ReceiveReady += (s, a) =>
                                                                            {
                                                                                router2arrived = true;
                                                                                router2.Receive(out more);
                                                                                router2.Receive(out more);

                                                                                poller.AddSocket(router3);
                                                                            };
                        poller.AddSocket(router2);

                        Task task = Task.Factory.StartNew(poller.Start);

                        dealer.Send("1");
                        Thread.Sleep(300);
                        dealer2.Send("2");
                        Thread.Sleep(300);
                        dealer3.Send("3");
                        Thread.Sleep(300);

                        poller.Stop(true);
                        task.Wait();

                        Assert.IsTrue(router1arrived);
                        Assert.IsTrue(router2arrived);
                        Assert.IsTrue(router3arrived);
                    }
                }
            }
        }
Exemple #4
0
        public void AddSocketAfterRemoving()
        {
            using (var context = NetMQContext.Create())
            using (var router1 = context.CreateRouterSocket())
            using (var router2 = context.CreateRouterSocket())
            using (var router3 = context.CreateRouterSocket())
            using (var dealer1 = context.CreateDealerSocket())
            using (var dealer2 = context.CreateDealerSocket())
            using (var dealer3 = context.CreateDealerSocket())
            using (var poller = new Poller(router1, router2) { PollTimeout = TestPollTimeoutMillis })
            {
                int port1 = router1.BindRandomPort("tcp://127.0.0.1");
                int port2 = router2.BindRandomPort("tcp://127.0.0.1");
                int port3 = router3.BindRandomPort("tcp://127.0.0.1");

                dealer1.Connect("tcp://127.0.0.1:" + port1);
                dealer2.Connect("tcp://127.0.0.1:" + port2);
                dealer3.Connect("tcp://127.0.0.1:" + port3);

                bool router1arrived = false;
                bool router2arrived = false;
                bool router3arrived = false;

                var signal1 = new ManualResetEvent(false);
                var signal2 = new ManualResetEvent(false);
                var signal3 = new ManualResetEvent(false);

                router1.ReceiveReady += (s, a) =>
                {
                    router1arrived = true;

                    router1.Receive();
                    router1.Receive();
                    poller.RemoveSocket(router1);
                    signal1.Set();
                };

                router2.ReceiveReady += (s, a) =>
                {
                    router2arrived = true;
                    router2.Receive();
                    router2.Receive();
                    poller.AddSocket(router3);
                    signal2.Set();
                };

                router3.ReceiveReady += (s, a) =>
                {
                    router3arrived = true;
                    router3.Receive();
                    router3.Receive();
                    signal3.Set();
                };

                poller.PollTillCancelledNonBlocking();

                dealer1.Send("1");
                Assert.IsTrue(signal1.WaitOne(300));
                dealer2.Send("2");
                Assert.IsTrue(signal2.WaitOne(300));
                dealer3.Send("3");
                Assert.IsTrue(signal3.WaitOne(300));

                poller.CancelAndJoin();

                Assert.IsTrue(router1arrived);
                Assert.IsTrue(router2arrived);
                Assert.IsTrue(router3arrived);
            }
        }