Как выбрать статический номер порта для пользовательского приложения?

У нас есть специальное приложение, которое должно обслуживать запросы на свой собственный номер порта. Нам действительно все равно, что это за номер, хотя мы будем придерживаться этого порта после того, как мы решим. Как выбрать номер, который в наименьшей степени может конфликтовать с другими приложениями или службами, запущенными в пользовательской системе?

Существуют ли какие-либо правила или стандарты, которым мы должны следовать?

Прояснение: как только мы выбираем порт, нам нужно придерживаться его. Нельзя использовать динамический. Мы создаем настраиваемый SFTP-сервер, и мы должны будем сообщить нашим клиентам, в каком порту он работает.

Ответы

Ответ 1

Если вы не можете предсказать, какой именно тип среды будет запущен вашим приложением, просто не беспокойтесь об этом. Выберите любое число более 1024, а также сделайте его настраиваемым, чтобы пользователь мог его изменить в случае конфликта с другим сервисом/приложением.

Конечно, вы все равно можете избежать очень распространенных портов, таких как 8080 (альтернативный HTTP) или 3128 (прокси, такие как squid), 1666 (perforce) и т.д. Вы можете проверить исчерпывающий список известных портов здесь, или посмотрите/etc/services.

Ответ 2

Для статического приложения рассмотрите проверку /etc/services, чтобы найти порт, который не столкнется ни с чем другим, который вы используете, и не используется в других местах.

$ tail /etc/services
nimspooler      48001/udp                       # Nimbus Spooler
nimhub          48002/tcp                       # Nimbus Hub
nimhub          48002/udp                       # Nimbus Hub
nimgtw          48003/tcp                       # Nimbus Gateway
nimgtw          48003/udp                       # Nimbus Gateway
com-bardac-dw   48556/tcp                       # com-bardac-dw
com-bardac-dw   48556/udp                       # com-bardac-dw
iqobject        48619/tcp                       # iqobject
iqobject        48619/udp                       # iqobject

Ответ 3

Если вы не заботитесь о номере порта и не возражаете, что он изменяется каждый раз, когда ваша программа запущена, просто не привязывайте порт, прежде чем вы его прослушиваете (или свяжите с портом 0, если вы хотите связать определенный IP-адрес). В обоих случаях вы сообщаете ОС, чтобы выбрать для вас свободный порт.

После начала прослушивания используйте getsockname, чтобы узнать, какой порт был выбран. Вы можете записать его в файл, отобразить на нем на экране, наследовать ребенка через fork и т.д.