Не могу написать код, который проверяет открыт UDP порт или нет. Мне нужно, чтобы мой код обрабатывал ICMP пакеты от системы о том, что порт недоступен. В документации написано, что connect() должен возвращать PortUnreachableException, если возвращается ICMP пакет. Но я не смог ни разу поймать это исключение. В WireShark ICMP пакеты обрабатываются корректно. Может кто-нибудь написать пример, когда вылезает исключение PortUnreachableException о недоступности UDP порта.
try {
DatagramSocket socket = new DatagramSocket();
socket.connect(InetAddress.getLoopbackAddress(), 5);
String message = "Hello";
DatagramPacket packet = new DatagramPacket(message.getBytes(), message.length(), socket.getInetAddress(), socket.getPort());
socket.send(packet);
socket.send(packet);
socket.send(packet);
}catch (PortUnreachableException e) {
System.out.println("PortUnreachable"); //Это исключение не выбрасывается
}
catch (IOException e) {
e.printStackTrace();
}
Вот решение. Работает только в том случае, если закрытый порт на который отправляется пакет возвращает ICMP пакет.
try {
DatagramSocket datagramSocket = new DatagramSocket();
byte[] pingData = "PING".getBytes(StandardCharsets.UTF_8);
InetAddress hostAdress = InetAddress.getByName(hostName);
datagramSocket.connect(hostAdress, port);
DatagramPacket sendPacket = new DatagramPacket(pingData, pingData.length, hostAdress, port);
datagramSocket.send(sendPacket);
byte[] receiveData = new byte[8];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
datagramSocket.setSoTimeout(200);
datagramSocket.receive(receivePacket);
} catch (SocketTimeoutException e) {
return true;
} catch (IOException e) {
return false;
}
return false;
Продвижение своими сайтами как стратегия роста и независимости