Что делать, если порт уже занят другим приложением? - PullRequest
2 голосов
/ 25 марта 2012

Я разрабатываю сервер-клиентское приложение.Сервер прослушивает какой-либо порт (например, 9090).Но я не совсем понимаю:

Что делать, если компьютер уже использует этот порт с другим приложением? Если это проблема, как с ней бороться?Как разработчики справляются с этим?
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 9090);
server.Bind(ep);
server.Listen(100);

Ответы [ 5 ]

8 голосов
/ 25 марта 2012

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

Это то же самое делают все остальные.

(Конечно, номер порта должен бытьконфигурируемый.)

2 голосов
/ 25 марта 2012

У вас есть два варианта:

1) сдаться - сообщить об ошибке пользователю / вызывающему абоненту
2) использовать другой порт

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

1 голос
/ 26 марта 2012

Полный ответ будет таким: если возникнет проблема, будет слишком поздно что-либо предпринять, кроме сбоев и жалоб: порт уже занят.В зависимости от локальных правил вы можете придумать несколько расширенных политик, например, чтобы убить задачу, которая заняла порт, но это может иметь странные последствия.Наконец, правильная политика состоит в том, чтобы избежать возможности подобных ситуаций.

Полный диапазон портов (1-65535) обычно делится на несколько поддиапазонов.Диапазон 1-1023 является традиционным «привилегированным» диапазоном, поэтому порт из него может быть выделен только суперпользователем.Это традиционно строгая политика в системах Unix, но не в Windows.Диапазон 49152-65535 является текущей рекомендацией IANA для автоматического распределения, когда номер порта не указан явно - типичным случаем является исходящее соединение.Но уже поздно.Текущий Linux по умолчанию определяет 32768-61000 для этого.Windows определил автоматический диапазон как 1024-65535 в версиях AFAIK до Vista, где он был уменьшен до рекомендации IANA.Таким образом, в предыдущих версиях могут возникать спонтанные конфликты по номеру порта, если служба запускается не при запуске системы.Если вы используете современную ОС, то вряд ли будет конфликт с автоматическим распределением в диапазоне 1024-32767, но он слишком высок в верхнем диапазоне.

Другой вопрос - это намеренное распределение порта, используемого вашей службой.Этого можно избежать, только используя списки ACL для номеров портов, и это очень зависит от ОС.Я думаю, что есть такие реализации для Windows, но никогда не видел их.OTOH, IANA рекомендует, чтобы каждый автор программного обеспечения регистрировал используемый порт до его фактического использования, поэтому это помогает минимизировать вероятность возникновения конфликтов с другим программным обеспечением.

Если вы хотите использовать незарегистрированный, но фиксированный порт, старайтесь избегатькрасивые цифры как 9090, потому что они не только для вас :) Используйте генератор случайных чисел и повторяйте попытки, пока не получите номер, который не указан как зарегистрированный.

0 голосов
/ 26 марта 2012

Купите другой ящик, назначьте ему новый IP-адрес и затем запустите ваше приложение.

Я вижу, что вы беспокоитесь о пользователе, как насчет того, чтобы заранее сообщить ему, какой порт он использует. Это при условии, что ваше программное обеспечение может легко изменить порт по любой причине.

Третье решение - использование виртуальной машины и нового экземпляра ОС. Я не большой поклонник виртуальных машин, поэтому я не буду отстаивать этот метод, даже если это дорогой корпоративный мир. Между прочим, виртуальные машины неплохие, если только вы не тот тип, который помещает много важных корпоративных служб на одну машину, а затем пожимает плечами при сбое сервера.

0 голосов
/ 25 марта 2012

Сделать порт настраиваемым.

Это позволит пользователю выбрать другой (доступный) порт.

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