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