/// <summary> /// Try to send request string and return the response string, or return null if not successful /// </summary> /// <param name="address">a string denoting the address to connect to</param> /// <param name="requestString">The request string</param> /// <param name="numTries">The number of times to try</param> /// <param name="requestTimeout">The timeout for each request</param> /// <param name="progressPublisher">Report topics: Failure, Retry, Send, Success</param> /// <returns>the response message, or null if not successful</returns> public static string RequestResponseStringWithRetry([NotNull] string address, [NotNull] string requestString, int numTries, TimeSpan requestTimeout, PublisherSocket progressPublisher = null) { while (numTries-- > 0) { using (var requestSocket = new RequestSocket(address)) { progressPublisher?.SendFrame(ProgressTopic.Send.ToString()); requestSocket.SendFrame(requestString); if (requestSocket.TryReceiveFrameString(requestTimeout, out string frameString)) { progressPublisher?.SendFrame(ProgressTopic.Success.ToString()); return(frameString); } progressPublisher?.SendFrame(ProgressTopic.Retry.ToString()); } } progressPublisher?.SendFrame(ProgressTopic.Failure.ToString()); return(null); }
/// <summary> /// Try to send request message and return the response as a message, or return null if not successful /// </summary> /// <param name="address">a string denoting the address to connect to</param> /// <param name="requestMessage">The request message</param> /// <param name="numTries">The number of times to try</param> /// <param name="requestTimeout">The timeout for each request</param> /// <param name="progressPublisher">Report topics: Failure, Retry, Send, Success</param> /// <returns>the response message, or null if not successful</returns> public static NetMQMessage RequestResponseMultipartMessageWithRetry([NotNull] string address, [NotNull] NetMQMessage requestMessage, int numTries, TimeSpan requestTimeout, PublisherSocket progressPublisher = null) { var responseMessage = new NetMQMessage(); while (numTries-- > 0) { using (var requestSocket = new RequestSocket(address)) { progressPublisher?.SendFrame(ProgressTopic.Send.ToString()); requestSocket.SendMultipartMessage(requestMessage); if (requestSocket.TryReceiveMultipartMessage(requestTimeout, ref responseMessage)) { progressPublisher?.SendFrame(ProgressTopic.Success.ToString()); return(responseMessage); } progressPublisher?.SendFrame(ProgressTopic.Retry.ToString()); } } progressPublisher?.SendFrame(ProgressTopic.Failure.ToString()); return(null); }
/// <summary> /// Try to send request message and return the response as a message, or return null if not successful /// </summary> /// <param name="address">a string denoting the address to connect to</param> /// <param name="requestMessage">The request message</param> /// <param name="numTries">The number of times to try</param> /// <param name="requestTimeout">The timeout for each request</param> /// <param name="progressPublisher">Report topics: Failure, Retry, Send, Success</param> /// <returns>the response message, or null if not successful</returns> public static NetMQMessage RequestResponseMultipartMessageWithRetry([NotNull] string address, [NotNull] NetMQMessage requestMessage, int numTries, TimeSpan requestTimeout, PublisherSocket progressPublisher = null) { var responseMessage = new NetMQMessage(); while (numTries-- > 0) { using (var requestSocket = new RequestSocket(address)) { if (progressPublisher != null) { progressPublisher.SendFrame(ProgressTopic.Send.ToString()); } requestSocket.SendMultipartMessage(requestMessage); if (requestSocket.TryReceiveMultipartMessage(requestTimeout, ref responseMessage)) { if (progressPublisher != null) { progressPublisher.SendFrame(ProgressTopic.Success.ToString()); } return responseMessage; } if (progressPublisher != null) { progressPublisher.SendFrame(ProgressTopic.Retry.ToString()); } } } if (progressPublisher != null) { progressPublisher.SendFrame(ProgressTopic.Failure.ToString()); } return null; }
public void NotSubscribed() { using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { var port = pub.BindRandomPort("tcp://127.0.0.1"); sub.Connect("tcp://127.0.0.1:" + port); // let the subscriber connect to the publisher before sending a message Thread.Sleep(500); pub.SendFrame("Hello"); Assert.IsFalse(sub.TrySkipFrame()); } }
public void ConnectBothSockets() { using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { pub.Connect("pgm://224.0.0.1:5555"); sub.Connect("pgm://224.0.0.1:5555"); sub.Subscribe(""); pub.SendFrame("Hi"); bool more; Assert.AreEqual("Hi", sub.ReceiveFrameString(out more)); Assert.IsFalse(more); } }
public void LargeMessage() { using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { var port = pub.BindRandomPort("tcp://127.0.0.1"); sub.Connect("tcp://127.0.0.1:" + port); sub.Subscribe(""); Thread.Sleep(100); var msg = new byte[300]; pub.SendFrame(msg); byte[] msg2 = sub.ReceiveFrameBytes(); Assert.AreEqual(300, msg2.Length); } }
public void SimplePubSub() { using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { var port = pub.BindRandomPort("tcp://127.0.0.1"); sub.Connect("tcp://127.0.0.1:" + port); sub.Subscribe(""); // let the subscriber connect to the publisher before sending a message Thread.Sleep(500); // Send the topic only pub.SendFrame("A"); CollectionAssert.AreEqual( new[] { "A" }, sub.ReceiveMultipartStrings()); } }
public void PubSub_Should_Not_Crash_If_No_Thread_Sleep() { NUnitUtils.PrintTestName(); var swAll = Stopwatch.StartNew(); using (var pub = new PublisherSocket()) { using (var sub = new SubscriberSocket()) { var freePort = NUnitUtils.TcpPortFree(); pub.Bind("tcp://127.0.0.1:" + freePort); sub.Connect("tcp://127.0.0.1:" + freePort); sub.Subscribe("*"); var sw = Stopwatch.StartNew(); { for (var i = 0; i < 50; i++) { pub.SendFrame("*"); // Ping. Console.Write("*"); string topic; var gotTopic = sub.TryReceiveFrameString(TimeSpan.FromMilliseconds(100), out topic); string ping; var gotPing = sub.TryReceiveFrameString(TimeSpan.FromMilliseconds(100), out ping); if (gotTopic) { Console.Write("\n"); break; } } } Console.WriteLine("Connected in {0} ms.", sw.ElapsedMilliseconds); } } NUnitUtils.PrintElapsedTime(swAll.Elapsed); }
public void MultipleLargeMessages() { var largeMessage = new byte[12000]; for (int i = 0; i < 12000; i++) { largeMessage[i] = (byte)(i % 256); } using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { var port = pub.BindRandomPort("tcp://127.0.0.1"); sub.Connect("tcp://127.0.0.1:" + port); sub.Subscribe(""); Thread.Sleep(1000); pub.SendFrame(""); sub.SkipFrame(); for (int i = 0; i < 100; i++) { pub.SendFrame(largeMessage); byte[] recvMesage = sub.ReceiveFrameBytes(); for (int j = 0; j < 12000; j++) { Assert.AreEqual(largeMessage[j], recvMesage[j]); } } } }
/// <summary> /// Try to send request string and return the response string, or return null if not successful /// </summary> /// <param name="address">a string denoting the address to connect to</param> /// <param name="requestString">The request string</param> /// <param name="numTries">The number of times to try</param> /// <param name="requestTimeout">The timeout for each request</param> /// <param name="progressPublisher">Report topics: Failure, Retry, Send, Success</param> /// <returns>the response message, or null if not successful</returns> public static string RequestResponseStringWithRetry([NotNull] string address, [NotNull] string requestString, int numTries, TimeSpan requestTimeout, PublisherSocket progressPublisher = null) { while (numTries-- > 0) { using (var requestSocket = new RequestSocket(address)) { if (progressPublisher != null) { progressPublisher.SendFrame(ProgressTopic.Send.ToString()); } requestSocket.SendFrame(requestString); string frameString; if (requestSocket.TryReceiveFrameString(requestTimeout, out frameString)) { if (progressPublisher != null) { progressPublisher.SendFrame(ProgressTopic.Success.ToString()); } return frameString; } if (progressPublisher != null) { progressPublisher.SendFrame(ProgressTopic.Retry.ToString()); } } } if (progressPublisher != null) { progressPublisher.SendFrame(ProgressTopic.Failure.ToString()); } return null; }
public void Sending1000Messages() { // creating two different context and sending 1000 messages int count = 0; var subReady = new ManualResetEvent(false); Task subTask = Task.Factory.StartNew(() => { using (var sub = new SubscriberSocket()) { sub.Bind("pgm://224.0.0.1:5555"); sub.Subscribe(""); subReady.Set(); while (count < 1000) { bool more; Assert.AreEqual(count, BitConverter.ToInt32(sub.ReceiveFrameBytes(out more), 0)); Assert.IsFalse(more); count++; } } }); subReady.WaitOne(); Task pubTask = Task.Factory.StartNew(() => { using (var pub = new PublisherSocket()) { pub.Connect("pgm://224.0.0.1:5555"); for (int i = 0; i < 1000; i++) pub.SendFrame(BitConverter.GetBytes(i)); // if we close the socket before the subscriber receives all messages subscriber // might miss messages, lets wait another second Thread.Sleep(1000); } }); pubTask.Wait(); subTask.Wait(); Assert.AreEqual(1000, count); }
public void UseInterface() { #if NETCOREAPP1_0 var hostEntry = Dns.GetHostEntryAsync(Dns.GetHostName()).Result; #else var hostEntry = Dns.GetHostEntry(Dns.GetHostName()); #endif string ip = hostEntry.AddressList .Where(addr => addr.AddressFamily == AddressFamily.InterNetwork) .Select(addr => addr.ToString()) .FirstOrDefault(); using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { pub.Connect($"pgm://{ip};224.0.0.1:5555"); sub.Bind($"pgm://{ip};224.0.0.1:5555"); sub.Subscribe(""); pub.SendFrame("Hi"); bool more; Assert.AreEqual("Hi", sub.ReceiveFrameString(out more)); Assert.IsFalse(more); } }
public void SetPgmSettings() { const int MegaBit = 1024; const int MegaByte = 1024; using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { pub.Options.MulticastHops = 2; pub.Options.MulticastRate = 40*MegaBit; // 40 megabit pub.Options.MulticastRecoveryInterval = TimeSpan.FromMinutes(10); pub.Options.SendBuffer = MegaByte*10; // 10 megabyte pub.Connect("pgm://224.0.0.1:5555"); sub.Options.ReceiveBuffer = MegaByte*10; sub.Bind("pgm://224.0.0.1:5555"); sub.Subscribe(""); pub.SendFrame("Hi"); bool more; Assert.AreEqual("Hi", sub.ReceiveFrameString(out more)); Assert.IsFalse(more); Assert.AreEqual(2, pub.Options.MulticastHops); Assert.AreEqual(40*MegaBit, pub.Options.MulticastRate); Assert.AreEqual(TimeSpan.FromMinutes(10), pub.Options.MulticastRecoveryInterval); Assert.AreEqual(MegaByte*10, pub.Options.SendBuffer); Assert.AreEqual(MegaByte*10, sub.Options.ReceiveBuffer); } }
public void LargerBufferLength() { var largerBuffer = new byte[256]; { largerBuffer[124] = 0xD; largerBuffer[125] = 0xE; largerBuffer[126] = 0xE; largerBuffer[127] = 0xD; } using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { var port = pub.BindRandomPort("tcp://127.0.0.1"); sub.Connect("tcp://127.0.0.1:" + port); sub.Subscribe(""); Thread.Sleep(100); pub.SendFrame(largerBuffer, 128); byte[] recvMesage = sub.ReceiveFrameBytes(); Assert.AreEqual(128, recvMesage.Length); Assert.AreEqual(0xD, recvMesage[124]); Assert.AreEqual(0xE, recvMesage[125]); Assert.AreEqual(0xE, recvMesage[126]); Assert.AreEqual(0xD, recvMesage[127]); Assert.AreNotEqual(largerBuffer.Length, recvMesage.Length); } }
public void ReceiveMessageWithTimeout() { { var pubSync = new AutoResetEvent(false); var payload = new byte[300]; const int waitTime = 500; var t1 = new Task(() => { using (var pubSocket = new PublisherSocket()) { pubSocket.Bind("tcp://127.0.0.1:12345"); pubSync.WaitOne(); Thread.Sleep(waitTime); pubSocket.SendFrame(payload); pubSync.WaitOne(); } }, TaskCreationOptions.LongRunning); var t2 = new Task(() => { using (var subSocket = new SubscriberSocket()) { subSocket.Connect("tcp://127.0.0.1:12345"); subSocket.Subscribe(""); Thread.Sleep(100); pubSync.Set(); NetMQMessage msg = null; Assert.IsFalse(subSocket.TryReceiveMultipartMessage(TimeSpan.FromMilliseconds(100), ref msg)); Assert.IsTrue(subSocket.TryReceiveMultipartMessage(TimeSpan.FromMilliseconds(waitTime), ref msg)); Assert.NotNull(msg); Assert.AreEqual(1, msg.FrameCount); Assert.AreEqual(300, msg.First.MessageSize); pubSync.Set(); } }, TaskCreationOptions.LongRunning); t1.Start(); t2.Start(); Task.WaitAll(t1, t2); } }
public void Test_Two_Subscribers() { NUnitUtils.PrintTestName(); var sw = Stopwatch.StartNew(); using (var pub = new PublisherSocket()) { using (var sub1 = new SubscriberSocket()) { using (var sub2 = new SubscriberSocket()) { var freePort = NUnitUtils.TcpPortFree(); pub.Bind("tcp://127.0.0.1:" + freePort); sub1.Connect("tcp://127.0.0.1:" + freePort); sub1.Subscribe("A"); sub2.Connect("tcp://127.0.0.1:" + freePort); sub2.Subscribe("B"); Thread.Sleep(500); var swInner = Stopwatch.StartNew(); { pub.SendFrame("A\n"); // Ping. { string topic; var pass1 = sub1.TryReceiveFrameString(TimeSpan.FromMilliseconds(250), out topic); if (pass1) { Console.Write(topic); } else { Assert.Fail(); } } pub.SendFrame("B\n"); // Ping. { string topic; var pass2 = sub2.TryReceiveFrameString(TimeSpan.FromMilliseconds(250), out topic); if (pass2) { Console.Write(topic); } else { Assert.Fail(); } } } Console.WriteLine("Connected in {0} ms.", swInner.ElapsedMilliseconds); } } } NUnitUtils.PrintElapsedTime(sw.Elapsed); }
public void LargeMessage() { using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { pub.Connect("pgm://224.0.0.1:5555"); sub.Bind("pgm://224.0.0.1:5555"); sub.Subscribe(""); var data = new byte[3200]; // this should be at least 3 packets for (Int16 i = 0; i < 1600; i++) Array.Copy(BitConverter.GetBytes(i), 0, data, i*2, 2); pub.SendFrame(data); byte[] message = sub.ReceiveFrameBytes(); Assert.AreEqual(3200, message.Length); for (Int16 i = 0; i < 1600; i++) Assert.AreEqual(i, BitConverter.ToInt16(message, i*2)); } }