Я предполагаю, что вы пытаетесь определить, проходит ли UDP-порт на удаленной машине через брандмауэр и/или имеет приложение, запущенное на нем.
Вы не можете достоверно определить это. Ближе всего вы можете попытаться отправить несколько небольших дейтаграмм на этот адрес и порт с интервалом около 1 секунды в течение примерно 10 секунд.
Если брандмауэры не блокируют порт, и приложение не работает, удаленная система может отправить обратно ICMP_UNREACH_PORT
(порт недоступен). Если блокирующих брандмауэров и удаленной системы нет, маршрутизатор может отправить обратно ICMP_UNREACH_HOST
или ICMP_UNREACH_NET
. Если брандмауэр блокирует вас, он может отправить обратно ICMP_UNREACH_FILTER_PROHIB
, но большинство брандмауэров ничего не отправляют.
Шансы получить любую из этих задних частей довольно тонкие, потому что большинство брандмауэров блокируют подобную ICMP-обратную связь. Даже если ICMP-сообщение действительно возвращается, linux обычно не позволяет вам видеть его, если вы не используете его как root. Некоторые операционные системы сообщают об ошибках ICMP как отказ следующего sendto()
на тот же адрес/порт, поэтому вам нужно повторить сообщение несколько раз. Но некоторые не делают этого, и в этом случае вы должны открыть определенный ICMP-порт и проанализировать любые возвращаемые сообщения.
Даже если вы каким-то образом получите сообщение ICMP, поймите, что они ненадежны. Например, вы можете получить ICMP_UNREACH_PORT
, даже если приложение не только прослушивает, но и активно отправляет вам данные. (Это редко, но я видел, как это происходит.)
Если приложение запущено на данном порту, и если вы знаете, что это за приложение, и если вы знаете, как создать сообщение, которое заставит это приложение ответить для вас, а затем сделать это и получить ответ - это лучший признак того, что порт открыт. Но отсутствие ответа ничего не значит: возможно, порт заблокирован, возможно, приложение не работает, или, может быть, это просто не понравилось ваше сообщение.
Итог: нет, не совсем.
«Родной язык C++» на какой ОС/платформе? – 0xC0000022L
Это на платформе Linux – Mustafa
Язык не является проблемой здесь, как уровень привилегий, на котором выполняется ваш код. Например, вы могли бы, как и «nmap», использовать библиотеку libpcap из вашего кода на C++. Кроме того, я думаю, что если вы попробуете все опции «nmap», вы получите хотя бы указание о том, что порт, вероятно, открыт или отфильтрован, даже если не со 100% уверенностью во всех случаях. Какие параметры используются с 'netstat' и' nmap', где вы используете? – 0xC0000022L