Выберите порт TCP на компьютере Windows, добавьте исключение брандмауэра при необходимости (программно)?

0

Спасибо, что прочитали мой пост.

Можете ли вы помочь мне понять, что означает следующая строка из "netstat -anb":

Proto Local Address Foreign Address State TCP 192.168.2.241:52440 64.233.166.103:443 ESTABLISHED [firefox.exe]

В частности:

  • означает ли это, что TCP-порт 52440 открыт на машине, IP-адрес которой равен 192.168.2.241?
  • означает ли это, что "firefox.exe" связан с этим портом?

Можете ли вы догадаться, как "firefox.exe" знал, что он может использовать этот порт (не мешая другой программе, уже привязанной к этому порту)?

По сути, "firefox.exe" использует много портов. Например, прямо сейчас на 192.168.2.241 "firefox.exe" использует порты nro 52163, 57019, 57022, 57030, 57045, 57046, 57049, 57051.

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

Вопреки "Firefox" мне нужен только один TCP-порт на машине, где будет установлена программа.

Мне нужен только этот механизм для работы один раз, при первом запуске программы (это не постоянная функция программы).

  • Как выбрать этот порт?
  • Как этот порт можно выбрать программным способом (а не вручную)?
  • Если есть брандмауэр, препятствующий использованию любого порта/выбранного порта, как будет работать программа?
  • Можно ли добавить к брандмауэру программное исключение для открытия этого порта?

Машина, запускающая программу, является машиной Windows.

Я бы запрограммировал это на C/C++.

С наилучшими пожеланиями.

Ниже приведено дополнение к моему первоначальному вопросу.

Ну, мои извинения, может быть, вы правы: возможно, неправильно добавить исключение в брандмауэр пользователя... То, что я подразумеваю под "добавлением исключения в брандмауэр пользователя", делает что-то вроде этого:

netsh advfirewall firewall add rule name="An exn" dir=in action=allow protocol=TCP localport=6667 program="where/the/program/is/stored/prog.exe" enable=yes

До сих пор я думал, что если приложение уже "использует" TCP-порт для собственного использования, ни одно другое приложение не может "использовать" этот самый порт. (Я знаю, что слово "использование" очень неточно. Я был бы рад, что смог бы сформулировать вещи более точно...) Я говорю это, потому что, поскольку мне нужен порт TCP, я задавался вопросом, могу ли я использовать "уже доступный" TCP-порт... (Когда я говорю "уже доступный", я не совсем понимаю, что я имею в виду (возможно, я хотел бы сказать "open" и "bindable"/порт уже "используется" другим приложением): Я думаю о TCP-порту 80, который часто "доступен"... Опять же, мне жаль, что я не смог бы более конкретно сказать об этом.)

Позвольте мне попытаться переформулировать то, что я желаю сделать.

  1. Пользователь запускает программу "setup.exe" на своем компьютере "M".
  2. "setup.exe" отправляет сообщение "m1" на удаленный сервер Интернета "RS".
  3. "RS" отправляет обратно некоторую информацию "m2" в "setup.exe", запущенную на машине "M" через порт TCP.

Чтобы иметь возможность разрешить эту двунаправленную связь между "M" и "RS", мне нужно "иметь" TCP-порт на машине "M", из которого "setup.exe" может получать информацию, отправленную "RS". ("RS" для меня не проблема, я могу делать все, что захочу).

Учитывая тот факт, что я ничего не знаю о "М" априори, кроме того, что это компьютер Windows (в частности, я не знаю, какой брандмауэр его защищает и т.д.), Я действительно не знаю, как обращаться проблема правильная. То, что я хотел бы избежать, заключается в том, что "setup.exe" терпит неудачу, не сообщив, почему TCP-порт на машине "M" не может быть "использован".

Учитывая тот факт, что мне нужно "иметь порт TCP" для программы "setup.exe", запущенной на машине M, какие шаги следует выполнять, чтобы сделать его максимально гладким для пользователя.

Предположим, я пытаюсь "использовать" TCP-порт 6667, и предположим, что я не "разрешен". Помимо брандмауэра или другого приложения, уже использующего этот порт, каковы могут быть причины, по которым этот порт недоступен?

Я имитировал две машины "M" и "RS" в основном используя этот код http://msdn.microsoft.com/en-us/library/windows/desktop/ms737889%28v=vs.85%29.aspx.

  • Я не добавлял исключение в брандмауэр "М".
  • Две программы на машинах "M" и "RS" могли бы общаться плавно и правильно.
  • Но, как вы указали в своем первом ответе, "в брандмауэре вообще нет правил исходящих портов" на этих тестовых машинах...
  • Поэтому я попытался как симуляцию добавить исключение в брандмауэр M в разделе "Исходящие правила", чтобы полностью заблокировать подключение к порту TCP 6667 на машине "M": описанный выше сценарий (шаги 1) 2) 3 )) в этом случае не выполняется.

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

Спасибо за помощь. С наилучшими пожеланиями.

Теги:
sockets
tcp
firewall

1 ответ

-2

означает ли это, что TCP-порт 52440 открыт на машине, IP-адрес которой равен 192.168.2.241?

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

означает ли это, что "firefox.exe" связан с этим портом?

Это означает, что сокет firefox.exe привязан к этому порту. Он может иметь много других сокетов и обычно делает это.

Я хотел бы написать программу, которая связывается с TCP-портом, чтобы обеспечить связь между машиной, на которой установлена программа, и удаленной машиной в Интернете с использованием сокетов.

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

Вопреки "Firefox" мне нужен только один TCP-порт на машине, где будет установлена программа.

Звучит как сервер, но вам нужно сказать нам. Для простоты я предполагаю, что это сервер отсюда.

Мне нужен только этот механизм для работы один раз, при первом запуске программы (это не постоянная функция программы).

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

Как выбрать этот порт?

Тобой. Выберите его сейчас. Используйте тот, который не зарезервирован IANA.

Как этот порт можно выбрать программным способом (а не вручную)?

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

Если есть брандмауэр, препятствующий использованию любого порта/выбранного порта, как будет работать программа?

Входящие соединения не удастся, поэтому программа ничего не сделает.

Можно ли добавить к брандмауэру программное исключение для открытия этого порта?

Не знаю, но это плохая идея, см. Выше.

  • 0
    Спасибо за ответы на мои вопросы по пунктам. EJP> Похоже на сервер, но вы должны сказать нам. Для простоты я предполагаю, что это сервер с этого момента. Léa> Да, программа также действует как сервер.
  • 0
    Почему это плохая идея? Программы (установщики) часто (почти всегда) запрашивают у пользователей разрешение, прежде чем делать «то, что они должны делать». Мы (пользователи) обычно не знаем, для чего, и я согласен, что это расстраивает, но это очень распространенное явление. Учитывая тот факт, что я еще ничего не тестировал, я не уверен в том, как ведет себя ОС, когда программа пытается добавить или удалить исключение из брандмауэра ... Что вы предлагаете тогда, если добавляете исключение в брандмауэр? не хорошая идея? С уважением.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню