Как происходит распределение портов за кулисами в zmq?
Я некоторое время изучал zmq и реализовал упрощенный документ - чтобы имитировать мой дизайн инфраструктуры - используя его (в частности, используя оболочку NetMQ), с отличными результатами.
Моя ситуация такова:
В будущем я планирую запустить несколько клиентов на одном компьютере, где каждому клиенту необходимо общаться с "сервером" (расположенным на другом компьютере) через несколько сокетов.
Я заметил, что для каждого сокета, который я объявляю и открываю explicity, многие другие открываются внутри zmq и управляются им.
редактировать
связывающие сокеты получают новый порт, выделенный в динамическом диапазоне, и это нормально,
но хотя мой клиент явно подключается только к двум портам, для него автоматически назначается около 15 портов с помощью zmq.
боюсь, это может в конечном итоге привести к нехватке портов, и я очень хочу этого избежать.
Вопросы:
Как zmq выделяет порты намеренно и каково соотношение между явно объявленными сокетами и портами, которые zmq открывает автоматически?
Есть ли способ для меня контролировать распределение портов программно, через конфигурацию или любым другим способом?
Как использование опроса влияет на использование портов?
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();
}
}
}