示例#1
0
        public void is_port_unused_should_return_true_on_get_random_unused_port()
        {
            var port         = TcpUtil.GetRandomUnusedPort();
            var isPortUnused = TcpUtil.IsPortUnused(port);

            Assert.IsTrue(isPortUnused);
        }
示例#2
0
        /// <remarks>
        /// Selecting a random port is more complicated than just usint tcp://*.* because we want to avoid using a port
        /// that was used for another environment. If we were to share a port between two environments, clients from the
        /// second environment might try to send us messages that we would have to discard
        /// </remarks>>
        public void SelectRandomPort(PeerId peerId, string environment)
        {
            _logger.InfoFormat("Selecting random port for {0}", environment);

            var directory      = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
            var forbiddenPorts = directory.GetFiles("*.inboundport.*").Select(ReadPort).Where(port => port.HasValue).ToHashSet();

            if (forbiddenPorts.Any())
            {
                _logger.InfoFormat("Ports already reserved for other environments: {0}", string.Join(", ", forbiddenPorts));
            }

            int?selectedPort = null;

            do
            {
                var port = TcpUtil.GetRandomUnusedPort();
                if (!forbiddenPorts.Contains(port))
                {
                    selectedPort = port;
                }
            } while (!selectedPort.HasValue);

            SetPort(selectedPort.Value);
        }
示例#3
0
文件: ZmqTests.cs 项目: Bourl/Zebus
        public void OkNowIKnowThatMyMessagesAreLostAfterDisconnect()
        {
            var message       = new byte[50];
            var receiveBuffer = new byte[100];

            using (var context = ZmqContext.Create())
            {
                var sendEndpoint    = string.Format("tcp://localhost:{0}", TcpUtil.GetRandomUnusedPort());
                var receiveEndpoint = sendEndpoint.Replace("localhost", "*");

                var receiver = context.CreateSocket(SocketType.PULL);
                receiver.ReceiveHighWatermark = 10;
                receiver.Bind(receiveEndpoint);

                var sender = context.CreateSocket(SocketType.PUSH);
                sender.SendHighWatermark = 10;
                sender.Connect(sendEndpoint);

                for (var i = 0; i < 10; ++i)
                {
                    var sendStatus = sender.Send(message);
                    Console.WriteLine(sendStatus);
                }
                for (var i = 0; i < 10; ++i)
                {
                    var bytes = receiver.Receive(receiveBuffer, 200.Milliseconds());
                    Console.WriteLine(bytes);
                }

                receiver.Unbind(receiveEndpoint);

                for (var i = 0; i < 10; ++i)
                {
                    var sendStatus = sender.Send(message);
                    Console.WriteLine(sendStatus);
                }

                sender.Disconnect(sendEndpoint);
                sender.Connect(sendEndpoint);

                var oneMoreSend = sender.SendWithTimeout(message, message.Length, 1000.Milliseconds());
                Console.WriteLine(oneMoreSend);

                receiver.Bind(receiveEndpoint);

                var receivedMessageCount = 0;
                while (receiver.Receive(receiveBuffer, 2000.Milliseconds()) != -1)
                {
                    ++receivedMessageCount;
                }

                Console.WriteLine("{0} received messages", receivedMessageCount);
            }
        }
示例#4
0
        public virtual void Setup()
        {
            ClientConfiguration = new ClientConfiguration();
            ServerConfiguration = new ServerConfiguration(TcpUtil.GetRandomUnusedPort());
            ServerEndPoint      = new IPEndPoint(IPAddress.Loopback, ServerConfiguration.ListeningPort);

            var serializationRegistries = new SerializationRegistries();

            ConfigureSerialization(serializationRegistries);

            Client = new RioClient(ClientConfiguration, new SerializationEngine(serializationRegistries.Client));
            Server = new RioServer(ServerConfiguration, new SerializationEngine(serializationRegistries.Server));
        }
示例#5
0
        public void should_reuse_last_endpoint_port_when_available_in_current_dir()
        {
            const string peerId = "Abc.Peer.0";

            var expectedPortFilePath = PathUtil.InBaseDirectory(peerId + ".inboundport.test");
            var expectedPort         = TcpUtil.GetRandomUnusedPort();

            File.WriteAllText(expectedPortFilePath, expectedPort.ToString());

            var transport = CreateAndStartZmqTransport(peerId: peerId);
            var endpoint  = new ZmqEndPoint(transport.InboundEndPoint);

            endpoint.GetPort().ShouldEqual(expectedPort);
        }
示例#6
0
        public void should_not_reuse_a_port_used_in_another_envionment()
        {
            const string peerId = "Abc.Peer.0";

            var doNotUsePortFilePath = PathUtil.InBaseDirectory(peerId + ".inboundport.secondenv");
            var expectedPort         = TcpUtil.GetRandomUnusedPort() + 5; // scientifical method to determine what port will be used by the transport :P

            File.WriteAllText(doNotUsePortFilePath, expectedPort.ToString());

            var transport = CreateAndStartZmqTransport(peerId: peerId);
            var endpoint  = new ZmqEndPoint(transport.InboundEndPoint);

            endpoint.GetPort().ShouldNotEqual(expectedPort);
            Console.WriteLine("{0} => {1}", endpoint.GetPort(), expectedPort);
        }
示例#7
0
        public void OkNowIKnowThatMyMessagesAreNotLostAfterDisconnect()
        {
            var message       = new byte[100];
            var receiveBuffer = new byte[100];

            Console.WriteLine("ZMQ v{0}", ZmqUtil.GetVersion().ToString(3));
            Console.WriteLine(Environment.Is64BitProcess ? "x64" : "x86");

            using (var context = new ZmqContext())
                using (var receiver = new ZmqSocket(context, ZmqSocketType.PULL))
                    using (var sender = new ZmqSocket(context, ZmqSocketType.PUSH))
                    {
                        var port            = TcpUtil.GetRandomUnusedPort();
                        var receiveEndpoint = $"tcp://*:{port}";
                        var sendEndpoint    = $"tcp://localhost:{port}";

                        receiver.SetOption(ZmqSocketOption.RCVHWM, 2_000);
                        receiver.SetOption(ZmqSocketOption.RCVTIMEO, 200);
                        receiver.SetOption(ZmqSocketOption.RCVBUF, 100_000);
                        receiver.Bind(receiveEndpoint);

                        sender.SetOption(ZmqSocketOption.SNDHWM, 2_000);
                        //sender.SetOption(ZmqSocketOption.RCVHWM, 1);
                        sender.SetOption(ZmqSocketOption.SNDTIMEO, 200);
                        receiver.SetOption(ZmqSocketOption.SNDBUF, 100_000);
                        sender.Connect(sendEndpoint);

                        var sendCount = 0;
                        while (sender.TrySend(message, 0, message.Length, out _))
                        {
                            sendCount++;
                        }

                        Console.WriteLine("{0} sent messages", sendCount);

                        sender.TryDisconnect(sendEndpoint);
                        sender.Connect(sendEndpoint);

                        var receivedMessageCount = 0;
                        while (receiver.TryReadMessage(ref receiveBuffer, out _, out _))
                        {
                            receivedMessageCount++;
                        }

                        Console.WriteLine("{0} received messages", receivedMessageCount);
                    }
        }
示例#8
0
        public void should_support_peer_endpoint_modifications()
        {
            var senderTransport = CreateAndStartZmqTransport();

            var receivedMessages  = new ConcurrentBag <TransportMessage>();
            var receiverTransport = CreateAndStartZmqTransport(onMessageReceived: receivedMessages.Add);
            var receiver          = new Peer(receiverTransport.PeerId, receiverTransport.InboundEndPoint);

            senderTransport.Send(new FakeCommand(0).ToTransportMessage(), new[] { receiver });
            Wait.Until(() => receivedMessages.Count == 1, 2.Seconds());

            var newEndPoint = "tcp://127.0.0.1:" + TcpUtil.GetRandomUnusedPort();

            receiverTransport.Stop();
            receiverTransport = CreateAndStartZmqTransport(newEndPoint, receivedMessages.Add);
            receiver.EndPoint = receiverTransport.InboundEndPoint;

            senderTransport.Send(new FakeCommand(0).ToTransportMessage(), new[] { receiver });
            Wait.Until(() => receivedMessages.Count == 2, 2.Seconds(), "unable to receive message");
        }
示例#9
0
        public void OkNowIKnowThatMyMessagesAreLostAfterDisconnect()
        {
            var message       = new byte[50];
            var receiveBuffer = new byte[100];

            Console.WriteLine("ZMQ v{0}", ZmqUtil.GetVersion().ToString(3));
            Console.WriteLine(Environment.Is64BitProcess ? "x64" : "x86");

            using (var context = new ZmqContext())
                using (var receiver = new ZmqSocket(context, ZmqSocketType.PULL))
                    using (var sender = new ZmqSocket(context, ZmqSocketType.PUSH))
                    {
                        var sendEndpoint    = $"tcp://localhost:{TcpUtil.GetRandomUnusedPort()}";
                        var receiveEndpoint = sendEndpoint.Replace("localhost", "*");

                        receiver.SetOption(ZmqSocketOption.RCVHWM, 10);
                        receiver.SetOption(ZmqSocketOption.RCVTIMEO, 200);
                        receiver.Bind(receiveEndpoint);

                        sender.SetOption(ZmqSocketOption.SNDHWM, 10);
                        sender.Connect(sendEndpoint);

                        for (var i = 0; i < 10; ++i)
                        {
                            var sendStatus = sender.TrySend(message, 0, message.Length, out var error);
                            Console.WriteLine($"SEND: {sendStatus} - {error.ToErrorMessage()}");
                        }

                        for (var i = 0; i < 10; ++i)
                        {
                            var receiveStatus = receiver.TryReadMessage(ref receiveBuffer, out var bytes, out var error);
                            Console.WriteLine($"RECV: {receiveStatus} - {bytes} - {error.ToErrorMessage()}");
                        }

                        receiver.TryUnbind(receiver.GetOptionString(ZmqSocketOption.LAST_ENDPOINT));

                        for (var i = 0; i < 10; ++i)
                        {
                            var sendStatus = sender.TrySend(message, 0, message.Length, out var error);
                            Console.WriteLine($"SEND: {sendStatus} - {error.ToErrorMessage()}");
                        }

                        sender.TryDisconnect(sender.GetOptionString(ZmqSocketOption.LAST_ENDPOINT));
                        sender.SetOption(ZmqSocketOption.SNDTIMEO, 1000);
                        sender.Connect(sendEndpoint);

                        {
                            var sendStatus = sender.TrySend(message, 0, message.Length, out var error);
                            Console.WriteLine($"SEND: {sendStatus} - {error.ToErrorMessage()}");
                        }

                        receiver.SetOption(ZmqSocketOption.RCVTIMEO, 2000);
                        receiver.Bind(receiveEndpoint);

                        var receivedMessageCount = 0;
                        while (receiver.TryReadMessage(ref receiveBuffer, out _, out _))
                        {
                            ++receivedMessageCount;
                        }

                        Console.WriteLine("{0} received messages", receivedMessageCount);
                    }
        }