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

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

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

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

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

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



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