package com.navercorp.pinpoint.tools.network;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
/**
* @author Taejin Koo
*/
public class UDPChecker extends AbstractNetworkChecker {
public UDPChecker(String testName, String hostName, int port) throws UnknownHostException {
this(testName, new InetSocketAddress(hostName, port));
}
public UDPChecker(String testName, InetSocketAddress hostAddress) throws UnknownHostException {
super(testName, hostAddress);
}
@Override
protected boolean check(InetSocketAddress address) throws IOException {
DatagramSocket socket = null;
try {
socket = createSocket(address);
return socket.isConnected();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
socket.close();
}
}
return false;
}
@Override
protected boolean check(InetSocketAddress address, byte[] requestData, byte[] expectedResponseData) {
DatagramSocket socket = null;
try {
socket = createSocket();
write(socket, requestData, address);
byte[] responseData = read(socket, expectedResponseData.length);
return Arrays.equals(expectedResponseData, responseData);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
socket.close();
}
}
return false;
}
private DatagramSocket createSocket() throws IOException {
DatagramSocket socket = new DatagramSocket();
socket.setSoTimeout(3000);
return socket;
}
private DatagramSocket createSocket(InetSocketAddress socketAddress) throws IOException {
DatagramSocket socket = new DatagramSocket();
socket.connect(socketAddress);
socket.setSoTimeout(3000);
return socket;
}
private void write(DatagramSocket socket, byte[] requestData, InetSocketAddress address) throws IOException {
DatagramPacket datagramPacket = new DatagramPacket(requestData, requestData.length, address);
socket.send(datagramPacket);
}
private byte[] read(DatagramSocket socket, int readSize) throws IOException {
byte[] buf = new byte[readSize];
DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
socket.receive(datagramPacket);
return buf;
}
}