Вопрос по c++ – Проверка открытого UDP-порта в C ++

5

Как я могу проверить, открыт ли удаленный порт UDP с помощью родного C ++? Поскольку UDP не требует подключения, вызовconnect() не помогает. Я не могу попробовать связать его, поскольку он не локальный.nmap также не может указывать. (тем не мениеnetstat может узнать, но я думаю, что он смотрит на внутреннюю информацию об открытых портах / файлах). Есть ли способ обнаружить это? Если я уйду на уровень сети, можно ли отправить CMP сообщение ICMP для проверки состояния недоступности порта? Я имею в виду, даст ли это достаточно информации о статусе порта?

Платформа - это Linux.

"Родной C ++" на какой ОС / платформе? 0xC0000022L
netstat -lptun указывает, что на порту 1060 открыт порт UDP, однако, похоже, я забыл -sU для nmap. Требуется доступ с правами суперпользователя, чтобы выяснить (и он узнает правильно), почему? Mustafa
Это на платформе Linux Mustafa
Язык здесь не так важен, как уровень привилегий, на котором выполняется ваш код. Например, вы могли бы, как иnmap, используйтеlibpcap библиотека из вашего кода C ++. Кроме того, я думаю, что если вы попробуете все вариантыnmap вы получите, по крайней мере, указание на то, является ли порт вероятным открытым или отфильтрованным, даже если не во всех случаях с уверенностью 100%. Какие варианты сnetstat а такжеnmap где ты используешь? 0xC0000022L
(что касаетсяnmap) достаточно низкого уровня. Он в основном использует определенную эвристику, чтобы классифицировать, означает ли наблюдаемое поведение порт открытым или нет. Но так как это настолько низкий уровень, он требует прав суперпользователя. 0xC0000022L

Ваш Ответ

2   ответа
5

что вы пытаетесь определить, проходит ли 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 даже если приложение не только прослушивает, но и активно отправляет вам данные. (Это редко, но я видел, как это произошло.)

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

Итог: нет, не совсем.

0

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

Похожие вопросы