public static boolean probe(Server server) {
		try {
			DatagramSocket RPCSocket = new DatagramSocket();
			RPCSocket.setSoTimeout(1000);
			
			String callID = UUID.randomUUID().toString(); // A unique id for this call
			
			String outString = (callID + "^" + PROBE_CODE + "^0^0");
			byte[] outBuffer = RPCClient.marshal(outString);
			
			try {
				DatagramPacket sendPacket = new DatagramPacket(outBuffer, outBuffer.length, server.ip, server.port);
				RPCSocket.send(sendPacket);
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			// The response has been sent, now we look for a response
			
			byte[] inBuffer = new byte[4096];
			DatagramPacket receivePacket = new DatagramPacket(inBuffer, inBuffer.length);
			
			try {
				do {
					receivePacket.setLength(inBuffer.length);
					RPCSocket.receive(receivePacket);
				} while (!RPCClient.unmarshal(receivePacket.getData()).split("_")[0].equals(callID));
			} catch (IOException e) {
				receivePacket = null;
				return false;
			} 
						
		} catch (SocketException e) {
			e.printStackTrace();
			return false;
		}
		
		return true;
	}