Как происходит распределение портов за кулисами в zmq?

Я некоторое время изучал zmq и реализовал упрощенный документ - чтобы имитировать мой дизайн инфраструктуры - используя его (в частности, используя оболочку NetMQ), с отличными результатами.

Моя ситуация такова:

В будущем я планирую запустить несколько клиентов на одном компьютере, где каждому клиенту необходимо общаться с "сервером" (расположенным на другом компьютере) через несколько сокетов.

Я заметил, что для каждого сокета, который я объявляю и открываю explicity, многие другие открываются внутри zmq и управляются им.

редактировать

связывающие сокеты получают новый порт, выделенный в динамическом диапазоне, и это нормально,

но хотя мой клиент явно подключается только к двум портам, для него автоматически назначается около 15 портов с помощью zmq.

боюсь, это может в конечном итоге привести к нехватке портов, и я очень хочу этого избежать.

Вопросы:

  1. Как zmq выделяет порты намеренно и каково соотношение между явно объявленными сокетами и портами, которые zmq открывает автоматически?

  2. Есть ли способ для меня контролировать распределение портов программно, через конфигурацию или любым другим способом?

  3. Как использование опроса влияет на использование портов?

Tnx,

1 ответ

Решение

Когда вы создаете сокет в zeromq/netmq в Windows, выделенный сокет используется для передачи сигналов между потоком ввода-вывода и потоком пользователя, этот сокет занимает два порта. если вы звоните связать, вы связываете другой порт с выбранным портом

Выделенный сокет использует динамический диапазон портов (netmq), поэтому, если вы будете держаться подальше от этого диапазона, у вас не возникнет никаких проблем.

Динамический диапазон портов для Windows Vista и выше составляет от 49152 до 65535

код подсчета портов:

static void Main(string[] args)
{
    var id = Process.GetCurrentProcess().Id;

    using (var context = NetMQContext.Create())
    {
        List<NetMQSocket> sockets = new List<NetMQSocket>();

        NetMQSocket server = context.CreateDealerSocket();
        server.Bind("tcp://localhost:6666");

        int i= 0;
        while (true)
        {
            var client = context.CreateDealerSocket();
            client.Connect("tcp://localhost:6666");

            sockets.Add(client);

            Thread.Sleep(1000);                                       

            ProcessStartInfo startInfo = new ProcessStartInfo("NETSTAT.EXE", "-a -o");
            startInfo.RedirectStandardOutput = true;
            startInfo.UseShellExecute = false;
            startInfo.CreateNoWindow = true;

            Console.WriteLine("Calculating taken ports...");

            Process process  = Process.Start(startInfo);                    
            int portCounter = -7; // start with minus 4 for framework and server socket

            while (!process.StandardOutput.EndOfStream)
            {
                if (process.StandardOutput.ReadLine().Contains(id.ToString()))
                {
                    portCounter ++;
                }
            }

            Console.Clear();
            Console.WriteLine("{0} sockets takes {1} ports, avg of {2} ports per socket", sockets.Count, portCounter, portCounter / sockets.Count);
            Console.WriteLine("Press enter to create another socket");

            Console.ReadLine();
        }
    }
}
Другие вопросы по тегам