Я разрабатываю сервер-клиентское приложение. Сервер слушает на каком-то порту (например: 9090). Но я смущен: Что делать, если компьютер уже использует этот порт с другим приложением? Если это проблема, как с этим бороться? Как разработчики справляются с этим?
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Any, 9090); server.Bind(ep); server.Listen(100);
Murhaf Sousli 25 март 2012, в 21:17
Поделиться
Выбрать другой порт?
Oded 25 март 2012, в 19:03
Murhaf Sousli 25 март 2012, в 19:23
Существует ряд номеров, зарезервированных для «хорошо известных» портов. Кроме того, многие стеки TCP / IP позволяют зарезервировать блок номеров портов, чтобы они не были доступны для автоматического назначения. Вы несете ответственность за обеспечение работы только одного экземпляра вашего сервера.
HABO 25 март 2012, в 20:05
Показать ещё 1 комментарий
Поделиться:
5 ответов
Лучший ответ
Вы немедленно прекратите свою программу с сообщением об ошибке, в котором говорится, что порт уже используется.
файл занят другой программой
То, что все делают, тоже.
(Конечно, номер порта должен быть настроен.)
Kerrek SB 25 март 2012, в 17:45
Поделиться
У вас есть два варианта:
1) отказаться — сообщить об ошибке обратно пользователю/вызывающему абоненту
2) используйте другой порт
Проблема с 2) заключается в том, что тот, кто ожидает использовать ваш сервис, должен знать новый порт, прежде чем он сможет получить доступ к вашей службе (а не к исходному порту по умолчанию).
Attila 25 март 2012, в 16:44
Поделиться
Полный ответ будет заключаться в том, что если проблема возникает, слишком поздно что-то делать, кроме сбоев и жалоб: порт уже занят. В зависимости от локальных правил вы можете изобретать некоторые продвинутые политики, например. чтобы убить задачу, которая занимала порт, но это может иметь странные последствия. Наконец, правильная политика заключается в том, чтобы избежать возможности таких ситуаций.
Полный диапазон портов (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, потому что они хороши не только для вас:) Используйте генератор случайных чисел и повторите попытку, пока не получите номер, который не указан как зарегистрирован.
Netch 26 март 2012, в 07:26
Поделиться
Купите другое поле, назначьте ему новый IP-адрес и запустите приложение.
Я вижу, что вас беспокоит пользователь, как сказать им заранее, какой порт он использует. Это предполагает, что ваше программное обеспечение может легко изменить порт по любой причине.
Третьим решением будет использование виртуальной машины и нового экземпляра ОС. Я не настоящий поклонник виртуальных машин, поэтому я не буду защищать этот метод, даже если он является любимцем корпоративного мира. Кстати, виртуальные машины не плохи, если вы не являетесь типом, который предоставляет множество критических корпоративных услуг на одной машине, а затем пожимает плечами, когда сервер выходит из строя.
David Frantz 25 март 2012, в 18:04
Поделиться
Сделать порт настраиваемым.
Это позволит пользователю выбрать другой (доступный) порт.
Reed Copsey 25 март 2012, в 16:59
Поделиться
Ещё вопросы
- 1 Линия между двумя перетаскиваемыми точками на холсте matplotlib pyqt5
- 0 Компиляция библиотек Boost C ++ в проекте VS2012
- 0 angular-ui-router: невозможно загрузить страницу состояния ребенка в поле зрения
- 1 Как объединить 2 блока кода JavaScript
- 0 Использование .has () с событием keyup
- 0 R или Mysql: изменить значения столбца на ноль, если они отсутствуют в другой строке того же кадра данных
- 0 Перекрасить текст на основе «флажка», выбрать номер и последовательность в HTML + JS
- 1 Как я могу определить атрибуты ребер или вершин с помощью Юнга?
- 0 hasClass не работает
- 1 Как установить каретку на конец текста в TextBox (WP8)?
- 1 Пространство имен C # против директив
- 1 Angular 2 ngStyle не может связать начало семейства шрифтов с числом
- 0 Сделать элемент div растянутым на всю высоту страницы
- 1 Нормально ли передавать контекст множеству методов?
- 1 Невозможно отобразить два элемента в пользовательском представлении
- 1 JavaScript. Ссылка на переменную, которая создается динамически
- 0 Ищем CSS столбцы ALA Газета / ms-word, для контента — столбец 1 сверху вниз, затем перенос в столбец 2, сверху вниз
- 0 Создание представления в MySQL, которое должно обновляться еженедельно
- 1 Проблема: Перекомпилировать с -Xlint: не проверено для деталей
- 0 Угловые атрибуты по директивам
- 0 Создание приложения для создания заметок с использованием JQuery для мобильных телефонов и телефонов
- 0 Назначение события клика нескольким элементам с разными параметрами
- 0 Недопустимое смещение строки в codeigniter
- 0 используя поле AS в предложении WHERE
- 0 Лучший способ извлечь доменное имя в Jquery
- 1 Нужна помощь в диагностике исключения NullPointerException [duplicate]
- 0 Как я могу получить доступ к переменным в различных функциях JavaScript на той же фабрике?
- 1 Модификации вvalu.py для других архитектур в поэзах тензорного потока
- 0 шаблон underscore.js не принимает jquery-данные ролей и классов
- 1 Рассчитайте время в пути между двумя точками (координатами), используя Google Maps API
- 1 Java — длина буфера для записи файла
- 1 Эффект масштабирования объектов, когда NaN установлены на -1
- 0 Хранить индексы геометрии
- 1 Android MVVM и Retrofit api — нулевой ответ
- 0 JPA-аннотации Spring Data для взаимосвязи таблиц «многие ко многим»
- 0 1066 — Не уникальный стол / псевдоним: «художники»
- 0 Как преобразовать текстовые журналы в HTML-журналы в C #? [Дубликат]
- 1 скорость анимации заголовка сворачивающейся панели инструментов
- 0 Как добавить текстовое поле и раскрывающийся список к значению массива?
- 1 Работа с Python2 и Python3 в одном проекте
- 1 Отделение целочисленных значений от строки
- 0 SQL-запрос для поиска общих элементов в списках столбцов между таблицей и указанными критериями?
- 0 C ++ Статическая Декларация
- 0 Как сделать переменную javascript глобальной в api phoneGap [duplicate]
- 1 Ошибка JNDI Tomcat 7.0.52 при развертывании файла WAR
- 1 Как программно изменить изображение-макет пользовательского предпочтения?
- 0 Выберите строки, сгруппированные по столбцу, имеющему максимальный агрегат
- 1 gulp-imagemin jpegtran-bin не работает, когда я запускаю простую задачу
- 1 Не удается загрузить модуль Rampart в клиентском проекте Axis2
- 1 java.io.NotSerializableException :: ObjectOutputStream: метод writeObject
Источник: overcoder.net
Появилось уведомление «Приложение работает некорректно. Порт занят неизвестным процессом»
При запуске СБИС Плагина появилось уведомление «Приложение работает некорректно. Порт занят неизвестным процессом. Нажмите для получения дополнительной информации».

Причина
Другая программа блокирует один из портов:
- 7171—7271, 8201—8301, 9208—9308 для работы СБИС Плагина;
- 8181, 8484, 843 или порт, необходимый для работы СБИС Плагина на терминальном сервере.
Решение
- В тексте ошибки не указан процесс, который занимает порт — настройте антивирус или брандмауэр.
- Процесс указан — найдите и закройте блокирующую программу либо переключите ее на другой порт.
Windows 8/11
Windows 8/11
- Нажмите , чтобы открыть диспетчер задач. Перейдите на вкладку «Процессы».
- Найдите программу по названию или по ИД процесса (PID), которые указаны в сообщении СБИС Плагина. Например, Dropbox Service.
- В окне диспетчера задач нет столбца с ИД процесса (PID), что делать?

Если программа нужна, переключите ее на другой порт. Если нет — остановите работу приложения: вернитесь в диспетчер задач и на вкладке «Процессы» нажмите «Завершить».
- Нажмите , чтобы открыть диспетчер задач. Перейдите на вкладку «Процессы».
- Найдите программу по названию или по ИД процесса (PID), которые указаны в сообщении СБИС Плагина. Например, Dropbox Service.
- В окне диспетчера задач нет столбца с ИД процесса (PID), что делать?

Если программа нужна, переключите ее на другой порт. Если нет — остановите работу приложения: вернитесь в диспетчер задач и на вкладке процессы нажмите «Снять задачу».
- Перезагрузите компьютер.
Если вы не можете решить проблему самостоятельно, то рекомендуем обратиться к системному администратору.
Источник: sbis.ru
Как обнаружить, что порт занят, и как назначить программе, например, антивируснику другой порт?

В строках вывода определяем нужный порт и PID процесса (ИД процесса), далее запускаем диспетчер задач, переходим в процессы или в подробности, ищем нужный PID в списке. Как только найдете нужный процесс, по правой кнопке сможете посмотреть данные о сервисе или программном обеспечении.
Как назначить программе, например, антивируснику, другой порт?
Очень часто для Windows-приложений невозможно сменить порт, гораздо продуманнее это реализовано в Linux OS.
Для этого нужно просмотреть мануал ПО и найти нужный раздел с описанием. Как тут уже писали, приложение можно попытаться запустить с определенными ключами или изменить файл конфигурации (в нужной части конфига заменить порт на необходимый, незанятый), в отдельных случаях может потребоваться пересобрать приложение.
Источник: qna.habr.com