C++/Java Sockets автоматическое выделение портов

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

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

ServerSocket s = new ServerSocket(0);

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

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


person anon    schedule 19.08.2011    source источник
comment
Он не может знать номер порта сервера, как он должен? Вы можете попытаться позволить клиенту сканировать порты серверов, но для чего это нужно?   -  person home    schedule 19.08.2011


Ответы (2)


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

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

person jlledom    schedule 19.08.2011
comment
Широковещательная рассылка является опцией, просто имейте в виду, что широковещательные рассылки (обычно) не пересылаются маршрутизаторами через границы локальной сети, поэтому она будет работать, только если все клиенты находятся в одном сегменте локальной сети. - person pap; 19.08.2011
comment
@Joan Lledó Я не хочу жестко кодировать порт в клиентах С++, потому что не знаю, сколько их у меня будет. Я могу захотеть подключить больше, в любое время. - person anon; 19.08.2011
comment
@pap На самом деле они на одном компьютере. Как мне это сделать. - person anon; 19.08.2011
comment
@IsocketThis - вы знаете, что к одному и тому же порту могут подключаться более одного клиента, верно? Вам не нужно иметь отдельные прослушивающие порты на сервере для каждого клиента. И если вы динамически добавляете больше прослушиваемых портов на свой сервер (трудно понять, почему, не зная, что делает ваше приложение), просто используйте ОДИН жестко закодированный порт, к которому подключаются клиенты, отвечайте всеми другими активными портами и попросите клиентов предпринять соответствующие действия. См. мой ответ относительно службы локатора. Вам понадобится ЛИБО широковещательная рассылка ИЛИ фиксированный известный порт для службы локатора. Это доступные варианты. - person pap; 19.08.2011
comment
Жесткое кодирование или настройка фиксированного значения порта сервера для подключения в клиенте не помешает вам иметь произвольное количество клиентов. - person soru; 19.08.2011
comment
@IsocketThis, как говорит @pap, порт и соединение - это не одно и то же, может быть много соединений в одном и том же порту одновременно. Вы можете написать бесконечный цикл, выполняющий s.accept(), и написать новый класс Runnable, который будет обрабатывать запрос в отдельном потоке. - person jlledom; 19.08.2011
comment
Итак, по вашему мнению, как лучше всего? просто есть порт, который делает первое сообщение, чтобы сообщить о реальном порту? - person anon; 19.08.2011

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

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

person pap    schedule 19.08.2011