Спасибо, что прочитали мой пост.
Можете ли вы помочь мне понять, что означает следующая строка из "netstat -anb":
Proto Local Address Foreign Address State TCP 192.168.2.241:52440 64.233.166.103:443 ESTABLISHED [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, который часто "доступен"... Опять же, мне жаль, что я не смог бы более конкретно сказать об этом.)
Позвольте мне попытаться переформулировать то, что я желаю сделать.
Чтобы иметь возможность разрешить эту двунаправленную связь между "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.
Я надеюсь, что эта литература не слишком неудобоварима и извините за приближения и недоразумения.
Спасибо за помощь. С наилучшими пожеланиями.
означает ли это, что TCP-порт 52440 открыт на машине, IP-адрес которой равен 192.168.2.241?
Возможно, но, скорее всего, это означает, что в брандмауэре вообще нет правил исходящих портов, так как их не должно быть, бессмысленно.
означает ли это, что "firefox.exe" связан с этим портом?
Это означает, что сокет firefox.exe
привязан к этому порту. Он может иметь много других сокетов и обычно делает это.
Я хотел бы написать программу, которая связывается с TCP-портом, чтобы обеспечить связь между машиной, на которой установлена программа, и удаленной машиной в Интернете с использованием сокетов.
Вам нужно указать, является ли ваша программа клиентом или сервером. Если это клиент, он точно так же, как Firefox, и у вас нет проблем. Если это сервер, вы должны привязываться к порту, который открыт для входа в ваш брандмауэр, а Firefox полностью и совершенно неактуальен.
Вопреки "Firefox" мне нужен только один TCP-порт на машине, где будет установлена программа.
Звучит как сервер, но вам нужно сказать нам. Для простоты я предполагаю, что это сервер отсюда.
Мне нужен только этот механизм для работы один раз, при первом запуске программы (это не постоянная функция программы).
Вам не нужен этот механизм для работы вообще. Чтобы открыть порт, пользователь должен открыть его. Пользователь не будет оценивать программное обеспечение, которое нарушает его конфигурацию брандмауэра, предполагая, что вы можете сделать это вообще, чего не следует.
Как выбрать этот порт?
Тобой. Выберите его сейчас. Используйте тот, который не зарезервирован IANA.
Как этот порт можно выбрать программным способом (а не вручную)?
Вы можете указать ноль порта, но затем вы должны сообщить пользователю, чтобы он мог открыть его на брандмауэре.
Если есть брандмауэр, препятствующий использованию любого порта/выбранного порта, как будет работать программа?
Входящие соединения не удастся, поэтому программа ничего не сделает.
Можно ли добавить к брандмауэру программное исключение для открытия этого порта?
Не знаю, но это плохая идея, см. Выше.