예제 #1
0
        public void TestSocketPushPullThread()
        {
            var  server = SocketBase.Create(SocketType.Pull);
            bool rc     = server.Bind("127.0.0.1:" + port);

            Assert.IsTrue(rc);

            var checkData = generateCheckData();
            List <SocketBase> clientSet = new List <SocketBase>();

            for (int i = 0; i < clientCount; i++)
            {
                var thread = Thread.CreateThread("SocketPush: " + i);
                var client = SocketBase.Create(SocketType.Push);
                rc = client.Connect("127.0.0.1:" + port);
                clientSet.Add(client);
                Assert.IsTrue(rc);
                thread.Post(() => {
                    for (int m = 0; m < checkCount; m++)
                    {
                        var msg = generateMessage(checkData);
                        rc      = client.TrySend(ref msg, 1000);
                        Assert.IsTrue(rc, "client id: " + i + ", message id: " + m);
                    }
                    thread.Stop();
                });
            }

            port++;

            int result     = 0;
            var threadPull = Thread.CreateThread("SocketPull");

            threadPull.Send(() => {
                for (int i = 0; i < clientCount * checkCount; i++)
                {
                    Message msg;
                    rc = server.TryRecv(out msg, 1000);
                    Assert.IsTrue(rc);
                    checkMessage(ref msg, checkData);
                    result++;
                }
                threadPull.Stop();
            });

            Assert.AreEqual(result, clientCount * checkCount);

            for (int i = 0; i < clientSet.Count; i++)
            {
                clientSet[i].Close();
                rc = clientSet[i].WaitClose(1000);
                Assert.IsTrue(rc);
            }

            server.Close();
            rc = server.WaitClose(1000);
            Assert.IsTrue(rc);
        }
예제 #2
0
        public void TestSocketPairThread()
        {
            var  server = SocketBase.Create(SocketType.Pair);
            bool rc     = server.Bind("127.0.0.1:" + port);

            Assert.IsTrue(rc);

            var client = SocketBase.Create(SocketType.Pair);

            rc = client.Connect("127.0.0.1:" + port);
            Assert.IsTrue(rc);

            port++;

            var checkData = generateCheckData();

            rc = Thread.Wait(() => server.ConnectionCount == 1, 1000);
            Assert.IsTrue(rc);

            var threadSend = Thread.CreateThread("SocketSend");
            var threadRecv = Thread.CreateThread("SocketRecv");

            threadSend.Post(() => {
                for (int i = 0; i < checkCount; i++)
                {
                    var msg = generateMessage(checkData);
                    rc      = server.TrySend(ref msg, 1000);
                    Assert.IsTrue(rc);
                }
                threadSend.Stop();
            });

            int result = 0;

            threadRecv.Send(() => {
                for (int i = 0; i < checkCount; i++)
                {
                    Message msg;
                    rc = client.TryRecv(out msg, 1000);
                    Assert.IsTrue(rc);
                    checkMessage(ref msg, checkData);
                    result++;
                }
                threadRecv.Stop();
            });

            client.Close();
            rc = client.WaitClose(1000);
            Assert.IsTrue(rc);

            server.Close();
            rc = server.WaitClose(1000);
            Assert.IsTrue(rc);

            Assert.AreEqual(result, checkCount);
        }
예제 #3
0
        public void TestSocketPubSub()
        {
            var  pub = SocketBase.Create(SocketType.Pub);
            bool rc  = pub.Bind("127.0.0.1:" + port);

            Assert.IsTrue(rc);

            List <SocketBase> subSet = new List <SocketBase>();

            for (int i = 0; i < clientCount; i++)
            {
                var sub = SocketBase.Create(SocketType.Sub);
                rc = sub.Connect("127.0.0.1:" + port);
                Assert.IsTrue(rc);
                subSet.Add(sub);
            }

            port++;

            var checkData = generateCheckData();

            rc = Thread.Wait(() => pub.ConnectionCount == clientCount, 1000);
            Assert.IsTrue(rc);

            for (int i = 0; i < checkCount; i++)
            {
                var msg = generateMessage(checkData);
                rc = pub.TrySend(ref msg, 1000);
                Assert.IsTrue(rc);
            }

            for (int c = 0; c < clientCount; c++)
            {
                for (int i = 0; i < checkCount; i++)
                {
                    Message msg;
                    rc = subSet[c].TryRecv(out msg, 1000);
                    Assert.IsTrue(rc, "client id: " + c + ", message id: " + i);
                    checkMessage(ref msg, checkData);
                }
            }

            for (int i = 0; i < subSet.Count; i++)
            {
                subSet[i].Close();
                rc = subSet[i].WaitClose(1000);
                Assert.IsTrue(rc);
            }

            pub.Close();
            rc = pub.WaitClose(1000);
            Assert.IsTrue(rc);
        }
예제 #4
0
        public void TestSocketPushPull()
        {
            var  server = SocketBase.Create(SocketType.Pull);
            bool rc     = server.Bind("127.0.0.1:" + port);

            Assert.IsTrue(rc);

            List <SocketBase> clientSet = new List <SocketBase>();

            for (int i = 0; i < clientCount; i++)
            {
                var client = SocketBase.Create(SocketType.Push);
                rc = client.Connect("127.0.0.1:" + port);
                Assert.IsTrue(rc);
                clientSet.Add(client);
            }

            port++;

            var checkData = generateCheckData();

            for (int c = 0; c < clientCount; c++)
            {
                for (int i = 0; i < checkCount; i++)
                {
                    var msg = generateMessage(checkData);
                    rc = clientSet[c].TrySend(ref msg, 1000);
                    Assert.IsTrue(rc, "client id: " + c + ", message id: " + i);
                }
            }

            for (int i = 0; i < clientCount * checkCount; i++)
            {
                Message msg;
                rc = server.TryRecv(out msg, 1000);
                Assert.IsTrue(rc);
                checkMessage(ref msg, checkData);
            }

            for (int i = 0; i < clientSet.Count; i++)
            {
                clientSet[i].Close();
                rc = clientSet[i].WaitClose(1000);
                Assert.IsTrue(rc);
            }

            server.Close();
            rc = server.WaitClose(1000);
            Assert.IsTrue(rc);
        }
예제 #5
0
        public SocketBase CreateSocket(ZmqSocketType type)
        {
            lock (this.m_slotSync)
            {
                if (this.m_starting)
                {
                    this.m_starting = false;
                    // Initialise the array of mailboxes. Additional three slots are for
                    // zmq_term thread and reaper thread.

                    int ios;
                    int mazmq;

                    lock (this.m_optSync)
                    {
                        mazmq = this.m_maxSockets;
                        ios   = this.m_ioThreadCount;
                    }

                    this.m_slotCount = mazmq + ios + 2;
                    this.m_slots     = new IMailbox[this.m_slotCount];
                    //alloc_Debug.Assert(slots);

                    // Initialise the infrastructure for zmq_term thread.
                    this.m_slots[Ctx.TermTid] = this.m_termMailbox;

                    // Create the reaper thread.
                    this.m_reaper = new Reaper(this, Ctx.ReaperTid);
                    //alloc_Debug.Assert(reaper);
                    this.m_slots[Ctx.ReaperTid] = this.m_reaper.Mailbox;
                    this.m_reaper.Start();

                    // Create I/O thread objects and launch them.
                    for (int i = 2; i != ios + 2; i++)
                    {
                        IOThread ioThread = new IOThread(this, i);
                        //alloc_Debug.Assert(io_thread);
                        this.m_ioThreads.Add(ioThread);
                        this.m_slots[i] = ioThread.Mailbox;
                        ioThread.Start();
                    }

                    // In the unused part of the slot array, create a list of empty slots.
                    for (int i = this.m_slotCount - 1; i >= ios + 2; i--)
                    {
                        this.m_emptySlots.Push(i);
                        this.m_slots[i] = null;
                    }
                }

                // Once zmq_term() was called, we can't create new sockets.
                if (this.m_terminating)
                {
                    string xMsg = $"Ctx.CreateSocket({type}), cannot create new socket while terminating.";
                    throw new TerminatingException(null, xMsg);
                }

                // If max_sockets limit was reached, return error.
                if (this.m_emptySlots.Count == 0)
                {
                    #if DEBUG
                    string xMsg = $"Ctx.CreateSocket({type}), max number of sockets {this.m_maxSockets} reached.";
                    throw NetMQException.Create(xMsg, ErrorCode.TooManyOpenSockets);
                    #else
                    throw NetMQException.Create(ErrorCode.TooManyOpenSockets);
                                        #endif
                }

                // Choose a slot for the socket.
                int slot = this.m_emptySlots.Pop();

                // Generate new unique socket ID.
                int socketId = Interlocked.Increment(ref Ctx.s_maxSocketId);

                // Create the socket and register its mailbox.
                SocketBase s = SocketBase.Create(type, this, slot, socketId);

                this.m_sockets.Add(s);
                this.m_slots[slot] = s.Mailbox;

                //LOG.debug("NEW Slot [" + slot + "] " + s);

                return(s);
            }
        }
예제 #6
0
        public void TestSocketServerClientThread()
        {
            var  server = SocketBase.Create <SocketServer>();
            bool rc     = server.Bind("127.0.0.1:" + port);

            Assert.IsTrue(rc);

            List <SocketBase> clientSet = new List <SocketBase>();

            for (int i = 0; i < clientCount; i++)
            {
                var client = SocketBase.Create(SocketType.Client);
                rc = client.Connect("127.0.0.1:" + port);
                Assert.IsTrue(rc);
                clientSet.Add(client);
            }

            port++;

            var checkData = generateCheckData();

            rc = Thread.Wait(() => server.ConnectionCount == clientCount, 1000);
            Assert.IsTrue(rc);

            string hello  = "Hello";
            var    writer = new ByteBufferWriter(16);

            writer.WriteString(hello);
            var helloMessage = new Message(writer);

            for (int i = 0; i < clientCount; i++)
            {
                rc = clientSet[i].TrySend(ref helloMessage, 1000);
                Assert.IsTrue(rc);
            }

            List <uint> clientIdSet = new List <uint>(clientCount);

            for (int i = 0; i < clientCount; i++)
            {
                Message msg;
                rc = server.TryRecv(out msg, 1000);
                Assert.IsTrue(rc);
                Assert.Less(0, msg.RouteId);
                Assert.IsFalse(clientIdSet.Contains(msg.RouteId));
                clientIdSet.Add(msg.RouteId);
                var reader = msg.GetBufferReader();
                var value  = reader.ReadString();
                Assert.AreEqual(value, hello);
            }

            var threadPool = new ThreadPool(clientCount);

            threadPool.Send(() => {
                for (int c = 0; c < clientCount; c++)
                {
                    for (int i = 0; i < checkCount; i++)
                    {
                        var msg = generateMessage(checkData);
                        rc      = server.Send(clientIdSet[c], ref msg);
                        Assert.IsTrue(rc, "client id: " + clientIdSet[c] + ", message id: " + i);
                    }
                }
            });

            int result = 0;

            for (int c = 0; c < clientCount; c++)
            {
                var client   = clientSet[c];
                var clientId = clientIdSet[c];
                threadPool.Post(() => {
                    for (int i = 0; i < checkCount; i++)
                    {
                        Message msg;
                        rc = client.Recv(out msg);
                        Assert.IsTrue(rc, "client id: " + clientId + ", message id: " + i);
                        checkMessage(ref msg, checkData);
                        Atomic.Inc(ref result);
                    }
                });
            }

            rc = Thread.Wait(() => result == clientCount * checkCount, -1);
            Assert.IsTrue(rc);

            threadPool.Dispose();
            Assert.AreEqual(result, clientCount * checkCount);

            for (int i = 0; i < clientSet.Count; i++)
            {
                clientSet[i].Close();
                rc = clientSet[i].WaitClose(1000);
                Assert.IsTrue(rc);
            }

            server.Close();
            rc = server.WaitClose(1000);
            Assert.IsTrue(rc);
        }
예제 #7
0
        public void TestSocketPubSubMultiple()
        {
            List <SocketBase> pubSet = new List <SocketBase>();

            for (int i = 0; i < serverCount; i++)
            {
                var  pub = SocketBase.Create(SocketType.Pub);
                bool rc  = pub.Bind("127.0.0.1:" + (port + i));
                Assert.IsTrue(rc);
                pubSet.Add(pub);
            }

            List <SocketBase> subSet = new List <SocketBase>();

            for (int i = 0; i < clientCount; i++)
            {
                var sub = SocketBase.Create(SocketType.Sub);
                for (int p = 0; p < serverCount; p++)
                {
                    bool rc = sub.Connect("127.0.0.1:" + (port + p));
                    Assert.IsTrue(rc);
                }
                subSet.Add(sub);
            }

            port += serverCount;

            var checkData = generateCheckData();

            var threadPool = new ThreadPool(clientCount);

            for (int p = 0; p < serverCount; p++)
            {
                var pub = pubSet[p];
                threadPool.Post(() => {
                    bool rc = Thread.Wait(() => pub.ConnectionCount == clientCount, 1000);
                    Assert.IsTrue(rc);
                    for (int i = 0; i < checkCount; i++)
                    {
                        var msg = generateMessage(checkData);
                        rc      = pub.TrySend(ref msg, 1000);
                        Assert.IsTrue(rc);
                    }
                });
            }

            int result = 0;

            for (int s = 0; s < clientCount; s++)
            {
                var sub   = subSet[s];
                var subId = s;
                threadPool.Post(() => {
                    bool rc = Thread.Wait(() => sub.ConnectionCount == serverCount, 1000);
                    Assert.IsTrue(rc);
                    for (int i = 0; i < checkCount * serverCount; i++)
                    {
                        Message msg;
                        rc = sub.TryRecv(out msg, 1000);
                        Assert.IsTrue(rc, "message id: " + i + ", sub id: " + subId);
                        checkMessage(ref msg, checkData);
                        Atomic.Inc(ref result);
                    }
                });
            }

            bool ret = Thread.Wait(() => result == clientCount * checkCount * serverCount, 10000);

            Assert.IsTrue(ret);

            threadPool.Dispose();
            Assert.AreEqual(result, clientCount * checkCount * serverCount);

            for (int i = 0; i < subSet.Count; i++)
            {
                subSet[i].Close();
                bool rc = subSet[i].WaitClose(1000);
                Assert.IsTrue(rc);
            }

            for (int i = 0; i < pubSet.Count; i++)
            {
                pubSet[i].Close();
                bool rc = pubSet[i].WaitClose(1000);
                Assert.IsTrue(rc);
            }
        }
예제 #8
0
        public void TestSocketPubSubThread()
        {
            var  pub = SocketBase.Create(SocketType.Pub);
            bool rc  = pub.Bind("127.0.0.1:" + port);

            Assert.IsTrue(rc);

            List <SocketBase> subSet = new List <SocketBase>();

            for (int i = 0; i < clientCount; i++)
            {
                var sub = SocketBase.Create(SocketType.Sub);
                rc = sub.Connect("127.0.0.1:" + port);
                Assert.IsTrue(rc);
                subSet.Add(sub);
            }

            port++;

            var checkData = generateCheckData();

            var threadPool = new ThreadPool(clientCount);

            threadPool.Post(() => {
                rc = Thread.Wait(() => pub.ConnectionCount == clientCount, 1000);
                Assert.IsTrue(rc);
                for (int i = 0; i < checkCount; i++)
                {
                    var msg = generateMessage(checkData);
                    rc      = pub.TrySend(ref msg, 1000);
                    Assert.IsTrue(rc);
                }
            });

            int result = 0;

            for (int c = 0; c < clientCount; c++)
            {
                var sub = subSet[c];
                threadPool.Post(() => {
                    rc = Thread.Wait(() => sub.ConnectionCount == 1, 1000);
                    Assert.IsTrue(rc);
                    for (int i = 0; i < checkCount; i++)
                    {
                        Message msg;
                        rc = sub.TryRecv(out msg, 1000);
                        Assert.IsTrue(rc);
                        checkMessage(ref msg, checkData);
                        Atomic.Inc(ref result);
                    }
                });
            }

            var ret = Thread.Wait(() => result == clientCount * checkCount, 10000);

            Assert.IsTrue(ret);

            threadPool.Dispose();
            Assert.AreEqual(result, clientCount * checkCount);

            for (int i = 0; i < subSet.Count; i++)
            {
                subSet[i].Close();
                rc = subSet[i].WaitClose(1000);
                Assert.IsTrue(rc);
            }

            pub.Close();
            rc = pub.WaitClose(1000);
            Assert.IsTrue(rc);
        }
예제 #9
0
        public void TestSocketPair()
        {
            var  server = SocketBase.Create(SocketType.Pair);
            bool rc     = server.Bind("127.0.0.1:" + port);

            Assert.IsTrue(rc);

            Thread.Sleep(10);

            var client = SocketBase.Create(SocketType.Pair);

            rc = client.Connect("127.0.0.1:" + port);
            Assert.IsTrue(rc);

            port++;

            Message empty = new Message(0);

            Assert.IsTrue(empty.IsBuffer);
            Assert.AreEqual(empty.Count, 0);

            rc = Thread.Wait(() => server.ConnectionCount == 1, -1);
            Assert.IsTrue(rc);

            rc = server.TrySend(ref empty, 1000);
            Assert.IsTrue(rc);
            Assert.IsTrue(empty.IsBuffer);
            Assert.AreEqual(empty.Count, 0);

            Message emptyRecv;

            rc = client.TryRecv(out emptyRecv, 1000);
            Assert.IsTrue(rc);
            Assert.IsTrue(emptyRecv.IsBuffer);
            Assert.AreEqual(emptyRecv.Count, 0);

            var checkData = generateCheckData();

            for (int i = 0; i < checkCount; i++)
            {
                var msg = generateMessage(checkData);
                rc = server.TrySend(ref msg, 1000);
                Assert.IsTrue(rc);
            }

            for (int i = 0; i < checkCount; i++)
            {
                var msg = generateMessage(checkData);
                rc = client.TrySend(ref msg, 1000);
                Assert.IsTrue(rc);
            }

            int result = 0;

            for (int i = 0; i < checkCount; i++)
            {
                Message msg;
                rc = client.TryRecv(out msg, 1000);
                Assert.IsTrue(rc);
                checkMessage(ref msg, checkData);
                result++;
            }
            Assert.AreEqual(result, checkCount);

            result = 0;
            for (int i = 0; i < checkCount; i++)
            {
                Message msg;
                rc = server.TryRecv(out msg, 1000);
                Assert.IsTrue(rc);
                checkMessage(ref msg, checkData);
                result++;
            }
            Assert.AreEqual(result, checkCount);

            Assert.AreEqual(result, checkCount);

            client.Close();
            rc = client.WaitClose(1000);
            Assert.IsTrue(rc);

            server.Close();
            rc = server.WaitClose(1000);
            Assert.IsTrue(rc);
        }