Невозможно дать конкретный ответ, если вы не предоставите как минимум :
Исходный код вашей программы.
Пример (неправильного) вывода, который вы получаете.
Ожидаемый результат для того же сценария.
Без этой информации мы не сможем сказать вам, что не так. Насколько мы знаем, это может быть простой случай преждевременного завершения вашей программы после обнаружения открытого порта. Или случай, когда последний найденный открытый порт перезаписывал записи предыдущих перед отображением.
В любом случае, возможно, стоит выяснить, что отправляется и принимается с использованием сетевого анализатора , такого как Wireshark . Сравнивая сеанс nmap
с сеансом, созданным вашей программой, вы сможете обнаружить существенную разницу, которая поможет точно определить проблему.
EDIT:
После просмотра вашего кода и сравнения с nmap
кажется, что вы по ошибке обрабатываете случай SocketTimeoutException
как закрытый порт, в то время как это может быть просто порт сервера, который отказывается отвечать на отправленный вами пакет.
РЕДАКТИРОВАТЬ 2:
Вот полная история:
При правильном закрытии порта сервер отправляет обратно ICMP Destination Unreachable пакет с кодом ошибки Port unreachable . Java интерпретирует эту ошибку как IOException
, который вы правильно считаете указанием на закрытый порт.
Открытый порт, с другой стороны, может привести к двум различным ответам от сервера:
Сервер отправляет обратно пакет UDP, который получен вашей программой и однозначно указывает на открытый порт. Например, DNS-серверы часто отвечают ответом Format error . nmap
показывает, что эти порты open
.
Сервер игнорирует ваш тестовый пакет, потому что он неверно сформирован w.r.t. к предоставленной услуге. Это приводит к тайм-ауту сети и SocketTimeoutException
в вашей программе.
К сожалению, невозможно определить, является ли тайм-аут сети тем, что активный сервер проигнорировал некорректно сформированный тестовый пакет или потому что фильтр пакетов отключил тестирование. Вот почему nmap
отображает время ожидания портов как open|filtered
.