C ++ / Java Sockets автоматическое распределение портов - PullRequest
0 голосов
/ 19 августа 2011

У меня есть сервер (Java) и несколько клиентов (c ++), соединенных сокетами. Я хотел бы установить порты автоматически. Предполагая, что IP уже известен.

На стороне Java я могу сделать:

ServerSocket s = new ServerSocket(0);

Итак, теперь у меня есть произвольный свободный порт на сервере.

Как узнать на стороне C ++, какой порт слушает сервер?

Ответы [ 2 ]

3 голосов
/ 19 августа 2011

Я думаю, что это невозможно, если вы хотите установить соединение с сервером, вы должны знать, в каком порту сервер прослушивает, есть программы, такие как nmap, которые показывают список открытых портов на сервере, но на сервереможет иметь много открытых портов одновременно, а затем, как вы узнаете, какой порт открыт вашим сервером?и в любом случае он слишком медленный и неэффективный для вызова внешнего инструмента, чтения и анализа его выходных данных.По какой причине вам нужна служба случайных портов?

Другим вариантом может быть получение открытого сокета на стороне сервера, вызывающего s.getLocalPort(), и отправка его через UDP для любого прослушивающего узла в сети с широковещательной передачей, иперепрограммируйте клиентскую сторону для прослушивания в широковещательной рассылке, и когда она получает сообщение, проверьте, является ли это номером порта, и подключитесь к серверу, используя этот порт.

0 голосов
/ 19 августа 2011

Вы не можете, не надежно.В IP машина идентифицируется по адресу.Сервер (т. Е. Сервис) идентифицируется по адресу и порту.Ваши клиенты нуждаются в некоторой форме «известной службы», к которой они могут подключиться.

Если вы по какой-либо причине абсолютно хотите иметь динамический порт прослушивания, вы можете объединить его со службой «локатора» на известнойпорт.Например, есть веб-сервис / сервлет на стандартном http-порту (80).Ваши клиенты подключаются к службе «locator» (всегда на порту 80) и спрашивают, какой порт прослушивает ваше приложение в данный момент.Это не совсем редкий паттерн.RMI работает аналогичным образом, когда у вас есть реестр на известном порту.Клиенты подключаются к реестру и запрашивают местоположение конечных точек RMI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...