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