Не существует такого понятия, как «открытый» порт UDP, по крайней мере, в том смысле, в котором большинство людей привыкли думать (что отвечает на что-то вроде «ОК, я принял ваше соединение»). UDP не использует сессии, поэтому «порт» (читай: протокол UDP в стеке IP операционной системы) никогда не будет отвечать «успех» сам по себе.
Порты UDP имеют только два состояния: прослушивание или нет. Обычно это означает «иметь открытый сокет процесса» или «не иметь никакого открытого сокета». Последний случай должен легко обнаруживаться, поскольку система должна ответить пакетом ICMP Destination Unreachable с кодом = 3 (Порт недоступен). К сожалению, многие брандмауэры могут отбрасывать эти пакеты, поэтому, если вы ничего не получите обратно, вы точно не знаете, находится порт в этом состоянии или нет. И давайте не будем забывать, что ICMP тоже не требует сессий и не выполняет повторные передачи: пакет «Недоступный порт» вполне может быть потерян где-то в сети.
Порт UDP в состоянии «прослушивания» может вообще не отвечать (прослушивающий его процесс просто получает пакет и ничего не передает) или может отправлять что-либо обратно (если процесс действует после приема и если он действует посредством ответ через UDP на исходный IP-адрес отправителя). Опять же, вы никогда не знаете наверняка, в каком состоянии, если ничего не получите.
Вы говорите, что можете управлять принимающим хостом: это позволяет вам создать собственный протокол для проверки достижимости UDP-порта: просто установите процесс на принимающем хосте, который будет прослушивать данный UDP-порт и отвечать обратно (или отправлять вам сообщение). электронная почта, или просто сумасшедший, и unlink()
все в файловой системе хоста ... все, что привлечет ваше внимание, сделает).